diff --git a/UA.slnx b/UA.slnx index dfc097db28..c5c1a7d583 100644 --- a/UA.slnx +++ b/UA.slnx @@ -12,6 +12,9 @@ + + + @@ -93,6 +96,8 @@ + + @@ -262,6 +267,8 @@ + + diff --git a/docs/README.md b/docs/README.md index 7d07bd78c5..4dde7e487a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -46,6 +46,9 @@ Here is a list of available documentation for different topics: * [Kubernetes High Availability Deployment](Kubernetes.md) - Consolidated Kubernetes guide for the `Opc.Ua.Redundancy.Kubernetes` package: Lease leader election, EndpointSlice peer discovery, ServiceLevel-driven readiness, StatefulSet/Deployment and Service manifests, RBAC, probes, time sync, secrets, and GDS/NTRS registration. * [Redundant Sample Integration Tests](RedundancySampleTests.md) - Process-level integration tests that launch the `RedundantServer` / `RedundantClient` / `RedundantPubSub` sample apps and assert on their failover, reconnect, and data-loss-visibility behavior; short-haul variants run on every PR, long-haul soak variants run via dedicated manual/scheduled GitHub Actions and Azure DevOps jobs (`SAMPLE_HA_DURATION_MINUTES`). * [Dependency Injection](DependencyInjection.md) - The unified `services.AddOpcUa()` / `IOpcUaBuilder` surface for hosting OPC UA components in `Microsoft.Extensions.DependencyInjection` / the .NET Generic Host (servers as `IHostedService`, options via `Action` or `IConfiguration`, AOT-friendly). +* [WoT Connectivity](WoTConnectivity.md) - OPC 10100-1 asset connectivity, the WoT Connectivity 1.1 registry/client, dependency-closure materialization, and runtime NodeSet projection. + * [WoT protocol bindings](WotBindings.md) - The bindings that ship today (planner/executor architecture, bundled and separate packages, operation coverage, target mapping, lazy channels, generation lifetime) and the contributor guide for adding your own, with a complete memory binding, registration, diagnostics, tests, packaging, TFM, trimming, and NativeAOT guidance. + * [WoT aggregation sample](../samples/WotCon/README.md) - Two flat OPC UA sources aggregated into a runtime-loaded DI/Machinery/Pumps Pump model, including commands, Refresh, monitoring, replacement, troubleshooting, and NativeAOT publishing. * [AuthorizationService](AuthorizationService.md) - Modern Part 12 `StartRequestToken` / `FinishRequestToken`, `ITokenIssuer`, and GDS token issuance. * [Fuzz testing](../fuzzing/Fuzzing.md) - SharpFuzz + afl-fuzz + libFuzzer integration. Three areas: `Encoders` (Binary/JSON/XML decoders, built-in type readers, parser entry points), `Certificates` (`X509CRL`, X509 extension parsers, `PEMReader`, `Pkcs10CertificationRequest`, ASN.1 helpers), and `Network` (UA-SC framing via `Opc.Ua.Core.Diagnostics` + internal `TcpMessageParsers` seam on `Opc.Ua.Core`). The [`fuzz-tester`](../.github/agents/fuzz-tester.agent.md) custom agent drives the whole toolchain autonomously: it detects OS-available engines, runs them in parallel, fixes novel findings per repo guidelines, adds the failing input as a regression asset, and pushes one commit per fix until the user says stop. * [KeyCredentialService](KeyCredentialService.md) - Pull, Push, and experimental bridge guidance for Part 12 KeyCredential flows. diff --git a/docs/RuntimeNodeSets.md b/docs/RuntimeNodeSets.md index feea0d3193..3982d29a85 100644 --- a/docs/RuntimeNodeSets.md +++ b/docs/RuntimeNodeSets.md @@ -16,7 +16,7 @@ Use the [source-generated path](SourceGeneratedNodeManagers.md) when you want co `AddRuntimeNodeSet` on `IOpcUaServerBuilder` remains the startup path: its factory is created before the server starts and its NodeSet is imported during `CreateAddressSpaceAsync`. -Running servers also expose `INodeManagerLifecycle`. Resolve it from dependency injection in a hosted server, or use `StandardServer.NodeManagerLifecycle` when constructing the server directly. The lifecycle provider can add, reload, and remove runtime NodeSets without restarting the server. +Running servers also expose `INodeManagerLifecycle`. Resolve it from dependency injection in a hosted server, or use `StandardServer.NodeManagerLifecycle` when constructing the server directly. The lifecycle provider can add, reload, shadow-reload, and remove runtime NodeSets without restarting the server. ```csharp public sealed class ModelLoader(INodeManagerLifecycle lifecycle) @@ -55,6 +55,36 @@ Each add returns an immutable `NodeManagerRegistration`, and reload returns the The rules that apply to every NodeManager registered at runtime -- what happens to MonitoredItems, Browse continuation points, namespace indexes, DataTypes, and change notifications, and which NodeManagers may be reloaded at all -- are described once in [Registering NodeManagers](NodeManagerRegistration.md). Runtime NodeSets follow those rules, and the built-in runtime NodeSet manager already implements the `INodeManagerReloadParticipant` contract that reload requires. +### Shadow reload + +`ShadowReloadRuntimeNodeSetAsync` (backed by `INodeManagerLifecycle.ShadowReloadAsync`) replaces a live registration the same way `ReloadRuntimeNodeSetAsync` does, but without the active-monitored-item guard: + +```csharp +public async ValueTask ShadowReloadAsync(CancellationToken ct) +{ + m_registration = await lifecycle.ShadowReloadRuntimeNodeSetAsync( + m_registration!, + new RuntimeNodeSetOptions + { + Sources = [RuntimeNodeSetSource.FromFile("Models/MyMachine.NodeSet2.xml")] + }, + ct); +} +``` + +The replacement generation is prepared and published through the same transactional prepare/publish/commit/rollback path as `ReloadAsync`, so a failure during preparation, publication, or the routing switch leaves the current generation fully active and cleans up the replacement, exactly as a normal reload does. Once committed, every new service request is atomically routed to the replacement generation, including for namespaces the current and replacement generations share. + +The current generation is not torn down immediately. It is moved to the same retired-generation bookkeeping used for an ordinary reload, but its existing monitored items and any request or continuation point that already captured it keep being served by it, unaffected by the routing switch. The retired generation is disposed automatically, without deleting any client subscription, once its monitored items and in-flight state drain; a later lifecycle operation (or shutdown) opportunistically retries that cleanup until it succeeds. `ShadowReloadAsync` returns the replacement `NodeManagerRegistration` immediately and invalidates the current handle for further lifecycle mutations, the same as `ReloadAsync`. + +Use `ShadowReloadAsync` when a model update must take effect for new requests without waiting for existing subscriptions to unsubscribe first; use the fail-closed `ReloadAsync` when a stale generation must never remain reachable, even briefly, for already-open monitored items. + +### Immediate reload + +`ImmediateReloadRuntimeNodeSetAsync` (backed by `INodeManagerLifecycle.ImmediateReloadAsync`) performs the same atomic replacement but does not retain the previous generation until monitored items drain. After requests that already captured the old routing generation finish, every affected data-change monitored item is made publishable with `BadNodeIdUnknown`, event monitored items stop producing events, continuation points are invalidated, and the old NodeManager is disposed. The subscription and monitored-item records remain available so clients can receive the status and delete or recreate the affected items. + +Use immediate reload only when continuity through the previous generation is not required. Durable monitored items are not eligible for immediate retirement because their terminal state would have to survive restart; choose shadow reload for any generation that owns them. + + ## Quick-start examples ### Single file diff --git a/docs/WoTConnectivity.md b/docs/WoTConnectivity.md index 6839c846c0..56182a737c 100644 --- a/docs/WoTConnectivity.md +++ b/docs/WoTConnectivity.md @@ -1,19 +1,21 @@ # OPC UA WoT Connectivity (OPC 10100-1) -This repository implements the OPC UA **WoT Connectivity** companion -specification (OPC 10100-1, "WoT Connectivity for OPC UA") through three -class libraries plus an integration test project: +This repository implements the OPC UA **WoT Connectivity** companion specification (OPC 10100-1, "WoT Connectivity for OPC UA") through the model, client, server, and protocol-binding libraries plus integration tests and runnable aggregation samples: | Project | Purpose | |----------------------------------|---------------------------------------------------------------| -| `Opc.Ua.WotCon` | Source-generated information model (NodeStates, NodeIds, generated ObjectType client proxies) compiled from the official `WotConnection.xml` design + `WotConnection.csv` | +| `Opc.Ua.WotCon` | Source-generated information model (NodeStates, NodeIds, generated ObjectType client proxies) generated once from the combined **WoT Connectivity 1.1** NodeSet2 (incorporating the OPC 10100-1 v1.02 model plus additive registry nodes in one namespace) and the draft **xRegistry** base NodeSet2 (see §11) | | `Opc.Ua.WotCon.Server` | Server-side node manager (`WotConnectivityNodeManager` → `AsyncCustomNodeManager`) and the extensible provider model | -| `Opc.Ua.WotCon.Client` | Client wrappers + extension methods that compose the generated proxies without inheritance | +| `Opc.Ua.WotCon.Client` | Client wrappers + extension methods that compose the generated proxies without inheritance, covering both the OPC 10100-1 v1.02 asset-connection surface (`WotConnectivityClient`) and the WoT Connectivity 1.1 registry surface (`WotRegistryClient`, see §11.8) | +| `Opc.Ua.WotCon.Bindings` | Protocol-binding abstractions, planners, codecs, credential references, HTTP/Modbus/OPC UA executors on net8+, and the generic target-mapping channel factory | +| `Opc.Ua.WotCon.Bindings.Mqtt` | Optional MQTT executor package | | `Opc.Ua.WotCon.Tests` | NUnit tests covering the TD parser, mappers, simulated provider, discovery facade | The model namespace URI is `http://opcfoundation.org/UA/WoT-Con/`, target version `1.02.0`, publication 2025-12-05. +For current protocol-runtime architecture and the contributor guide for adding a protocol see [WoT protocol bindings](WotBindings.md), and the runnable end-to-end topology is documented in the [WoT aggregation sample](../samples/WotCon/README.md). + --- ## 1. Hosting a WoT Connectivity server @@ -382,11 +384,12 @@ services.AddOpcUa() }); ``` -To loosen the policy (for example a closed lab deployment where the -client cannot present a non-anonymous identity), set -`AllowAnonymous = true` and grant the anonymous identity the chosen -role via your role-mapping layer; do not weaken `MinimumSecurityMode` -in production. +To loosen identity policy in a closed lab, set `AllowAnonymous = true` +and grant the anonymous identity the chosen role via your role-mapping +layer. A conformant registry mutation surface still requires +`MinimumSecurityMode = MessageSecurityMode.SignAndEncrypt`; lowering it +is suitable only for isolated test harnesses. Read-only registry access +may be exposed over `MessageSecurityMode.None` by deployment policy. --- @@ -413,3 +416,328 @@ in production. * OPC 10100-1, *WoT Connectivity for OPC UA*: https://reference.opcfoundation.org/specs/OPC-10100-1/full * W3C Web of Things Thing Description 1.1: https://www.w3.org/TR/wot-thing-description11/ * W3C WoT Binding Templates: https://w3c.github.io/wot-binding-templates/ + +--- + +## 11. WoT Connectivity 1.1 registry and materialization (preview) + +The `Opc.Ua.WotCon` assembly is source-generated once from the combined **WoT Connectivity 1.1** NodeSet2, which incorporates the published OPC 10100-1 v1.02 model (NodeIds `1..172`, marked deprecated) plus the additive registry nodes (`64000+`) in one namespace, and from the abstract **xRegistry** base model the registry types build on: + +| Model | Namespace | Emitted C# namespace | +|-------|-----------|----------------------| +| xRegistry (abstract registry base) | `http://opcfoundation.org/UA/xRegistry/` | `Opc.Ua.XRegistry` | +| WoT Connectivity 1.1 (combined) | `http://opcfoundation.org/UA/WoT-Con/` | `Opc.Ua.WotCon` | + +Both NodeSet2 models are *pinned* from the OPC UA drafts authoring repository into `src/Opc.Ua.WotCon/Design` (as `*.NodeSet2.xml` + `*.NodeSet2.csv`) and added as `AdditionalFiles`. The legacy 1.02 `WotConnection.xml` / `WotConnection.csv` sources are retained under `Design/` for reference only — they are incorporated into the combined NodeSet and are **not** source-generated a second time, so the preserved 1.02 constants and the additive registry constants coexist in one `Opc.Ua.WotCon` namespace under their exact NodeIds. The tooling that refreshes the pinned copies from the draft repository lives in that authoring repository, not here. + +### 11.1 Architecture + +The 1.1 runtime separates a **stable registry** from **ephemeral projections**: + +* `WotRegistryNodeManager` (stable) exposes the well-known `WoTRegistry` + object, its Thing Description / Thing Model groups, the `Refresh` + Method, registry settings and the registry event types. It never re-creates + itself. Every service group and document resource is additionally + materialized as a browseable `ThingDescriptionGroupType` / + `ThingModelGroupType` and `ThingDescriptionFileType` / + `ThingModelFileType` node beneath `WoTRegistry`, kept in sync with the + registry snapshot (see §11.7). It never re-creates itself. +* Registry documents are projected into the AddressSpace as **separate + runtime NodeManagers** through the public `INodeManagerLifecycle` + (`AddRuntimeNodeSetAsync` for first activation, + `ShadowReloadRuntimeNodeSetAsync` or + `ImmediateReloadRuntimeNodeSetAsync` for updates). Graceful retirement + keeps the previous generation serving existing monitored items until + they drain. Immediate retirement reports `BadNodeIdUnknown` for affected + monitored items and disposes the previous generation without waiting + for drain. + +Register it on an OPC UA server host: + +```csharp +builder + .AddServer(server => { /* ... */ }) + .AddWotRegistryServer(options => + { + options.StorageFolder = Path.Combine(AppContext.BaseDirectory, "wot-registry"); + options.AutoRefresh = true; // re-project after every content mutation + options.StrictBindings = false; // materialize degraded nodes for unsupported forms + options.RetirementPolicy = WotProjectionRetirementPolicy.Graceful; + }); +``` + +### 11.2 Registry service and persistence + +#### Materialization extension points + +Two optional seams let a protocol driver supply what a Thing Description alone cannot express. Both are resolved from DI; registering neither leaves materialization exactly as it was. + +* **`IWotNodeSetContributor`** — runs once per resource *after* the Thing Description has been converted to a NodeSet and *before* any variable is created, and may add nodes to that NodeSet. This is the hook for custom `StructureType` DataTypes that have no NodeSet to import because they belong to one controller program — Rockwell/Studio 5000 UDTs, TIA Portal PLC data types, TwinCAT structured types — generated from the controller's own symbol table at onboarding time. It runs at that point precisely because a `uav:mapByFieldPath` mapping can only resolve once its structured DataType is registered. A document that *can* express its types declaratively does not need this seam: the native projection (`uav:NodeModel`) already carries `DataType` nodes with their `DataTypeDefinition`. +* **`IWotDocumentConverter`** — replaces the Thing Description → NodeSet conversion wholesale, and is now resolvable from DI as well as by direct construction. + +#### Resolving referenced companion-specification NodeSets + +Thing Descriptions are uploaded at run time through the standard `WoTAssetFileType` upload, so the namespaces a server will be asked to serve are not known at start-up and static pre-loading is not sufficient. `IWotNodeSetResolver` closes that gap: for every namespace a converted document requires but neither declares itself nor finds on the server, the resolver is asked for a NodeSet2. Resolution is recursive over the resolved model's own dependencies, resolved models are projected *before* the document that requires them, and a namespace that stays unresolved is reported rather than silently dropped, so an operator can see exactly what is missing. + +```csharp +public interface IWotNodeSetResolver +{ + ValueTask TryResolveAsync(string namespaceUri, CancellationToken ct = default); +} +``` + +Returning `null` is the contract's way of declining and is not an error. **No implementation ships with the library** — resolving a namespace means reaching out to a catalogue (a UA Cloud Library instance, a corporate model repository, a folder on disk), which is a deployment decision, so the library takes no dependency on any of them. A document that carries its own model needs no resolver at all: the `uav:nodeSet` envelope embeds the NodeSet2 in the Thing Description itself. + +`IWotRegistryService` owns an immutable `WotRegistrySnapshot`. Every mutation produces a new snapshot with a strictly greater `Generation` (epoch); readers hold a snapshot and never observe a partial change. A resource carries its versions (raw source bytes + SHA-256 content digest), desired/active version pointers, `WoTLoadStateEnum`, `WoTValidationOutcomeDataType` and diagnostics. + +Two persistence back-ends are provided: + +* `InMemoryWotRegistryStore` — volatile; the registry starts empty. +* `FileWotRegistryStore` — durable; metadata is written with a **bounded atomic replace** (write-to-temp then `File.Replace`), one blob per version, content-addressed directories. Invalid documents are stored with their failure state so a restart restores exactly the last observed contents. + +#### Keeping the document bytes in a shared store + +`WotRegistryServerOptions.ResourceStore` moves the document bytes behind the shared, injectable [`IXRegistryResourceStore`](XRegistry.md#resource-storage) — which is what lets a registry run in a high-availability or distributed deployment, because the documents then live somewhere every node can reach rather than in one server's registry folder. A store registered in DI wins over one set on the options, matching the xRegistry server's precedence: + +```csharp +options.StorageFolder = "/var/lib/myapp/wot-registry"; // manifest +options.ResourceStore = new WotBlobResourceStore("/mnt/shared/wot-documents"); +``` + +`WotBlobResourceStore` is the default WoT implementation. It keeps one file per document named after the document's SHA-256 digest — deliberately the `{root}/{digest}.bin` layout `FileWotRegistryStore` has always written, so adopting the interface needs **no on-disk migration** and existing registry folders keep working. It is validated against the shared `XRegistryResourceStoreContractTests`, so any other implementation (an object store, a database) can be substituted. + +The registry still writes and switches its own manifest atomically; only the bytes move. That split is required because `IXRegistryResourceStore` has no staging, flush or bulk-delete concept, whereas the file store fsyncs its blob directory before the manifest switch and deletes it wholesale when rolling back a pristine commit. It is safe because documents are content-addressed and therefore immutable: a document is always written *before* the manifest that references it, so an interrupted commit can leave an orphaned document but never a dangling reference. A supplied store owns the durability of the bytes it holds. + +Resource bounds (`WotRegistryPersistenceBounds`) cap document size, versions per resource, resources per group, and group count. + +### 11.3 Materialization coordinator + +`WotMaterializationCoordinator.RefreshAsync` drives projection: + +1. Parses/validates each registry document with `Opc.Ua.Wot`. +2. Builds the TD/TM dependency graph from `links` (`rel = tm:extends / + type / tm:submodel`), a top-level `tm:extends`, and `tm:ref` pointers, + resolving references against the registry by Thing id / xid / resource + id. It never follows an arbitrary external URL; an unresolved absolute + URL remains a missing dependency unless a configured xRegistry + federation layer has registered it. +3. Partitions the graph into **dependency closures** (weakly-connected + components) with Thing Models topologically ordered before the Thing + Descriptions that extend them; a shared model lands in a single + closure. Cycles and missing dependencies produce deterministic + diagnostics. +4. Converts each closure to one or more NodeSet2 documents and projects + the closure as one runtime NodeManager (Add, or graceful/immediate + reload on update according to `RetirementPolicy`). + +Behaviours: + +* Independent closures commit independently; a failed or invalid closure + **retains its previous active generation**. +* An **unchanged** closure (same content digest, options and binder + version) returns `WoTOutcomeEnum.Unchanged` and emits no model change. +* `WotProjectionRetirementPolicy.Graceful` preserves existing monitored + items on the previous generation until drain. + `WotProjectionRetirementPolicy.Immediate` invalidates affected items + with `BadNodeIdUnknown` and disposes the previous generation. The proof + rejects immediate retirement when the old generation owns a durable + monitored item; configure `Graceful` for that closure. +* `Refresh` returns a detailed `WoTRefreshSummaryDataType` plus a + per-resource `WoTResourceLoadResultDataType[]` and the new generation, + matching the generated Method signature. +* The coordinator's events are re-emitted by the NodeManager as the + generated `WoTResourceEventType` / `WoTValidationFailureEventType` / + `WoTLoadFailureEventType` / `WoTBindingFailureEventType` / + `WoTRefreshCompletedEventType`. + +### 11.4 Binder integration seam + +`IWotBinderRegistry` is the runtime-neutral seam the coordinator uses during Prepare/Activate/Deactivate. `WotProtocolBinderRegistry` implements that seam and `IWotBindingChannelFactory`, compiling immutable plans from the registered binders and opening channels through independently registered executors. The base `Opc.Ua.WotCon.Bindings` package ships all eight planners and bundles HTTP, Modbus TCP, and OPC UA executors on `net8.0`, `net9.0`, and `net10.0`; MQTT remains in `Opc.Ua.WotCon.Bindings.Mqtt`. The base package retains the full `net472;net48;netstandard2.1;net8.0;net9.0;net10.0` matrix, where planner-only validation remains available even when concrete executor namespaces are not compiled. + +The generic projection runtime is implemented in `Opc.Ua.WotCon.Server.Materialization`. It resolves affordance-level OPC 10101 target mappings against freshly imported runtime NodeSets, wires async read/write handlers, opens one lazy channel per compiled form per generation, lets local monitored items sample the same read handler, supports reflection-free structured field mapping, and disposes channels with their owning generation. Updates use shadow reload, so existing monitored items keep the retired generation alive until they drain while new reads and monitored items use the replacement generation. + +The default `NullWotBinderRegistry` remains the no-binding baseline. With it, affordance forms either **fail a strict closure** (`StrictBindings = true`) or **materialize as degraded nodes** (`BadConfigurationError`) when non-strict. Protocol support is opt-in: `AddWotProtocolBinders()` registers all eight planners, while `AddHttpWotBinding()`, `AddMqttWotBinding()`, `AddModbusWotBinding()`, and `AddOpcUaWotBinding()` add their concrete executors. The core server registers none of these by default; see [WoT protocol bindings](WotBindings.md). + +### 11.5 Legacy 1.02 compatibility + +The legacy `WotConnectivityNodeManager`, its generated 1.02 namespace/NodeIds/method signatures and the client APIs are unchanged. When both features are hosted, legacy-created assets are additionally registered as Thing Description resources in a configured legacy group (`WotRegistryServerOptions.LegacyGroupId`) so they participate in registry materialization, without making the flat legacy asset list canonical for the registry. + +### 11.6 Protocol and projection scope + +The implemented data plane covers executable HTTP, Modbus TCP, MQTT, and OPC UA binding forms according to the operation coverage documented in [WoT protocol bindings](WotBindings.md). CoAP, BACnet, PROFINET, and LoRaWAN currently ship as planner-only binders: their forms are validated and represented in plans, but a non-strict closure is degraded until an executor is registered. + +OPC 10101 target mapping is authored on property affordances, not forms. `uav:mapByFieldPath` requires `uav:mapToType`, portable `nsu=` NodeIds are resolved against the runtime generation's namespace table, and the mapping is protocol-neutral as illustrated by [OPC 10101 §8.2](https://reference.opcfoundation.org/specs/OPC-10101/8.2). See [OPC 10101 §6.5.4](https://reference.opcfoundation.org/specs/OPC-10101/6.5.4) and the [binding-authoring guide](WotBindings.md#adding-your-own-binding) for the exact validation and runtime semantics. + +### 11.7 Browseable registry projection and management Methods + +The stable `WoTRegistryNodeManager` materializes the registry snapshot as a browseable object tree and wires the inherited xRegistry / registry Methods: + +* For every service group a `ThingDescriptionGroupType` or + `ThingModelGroupType` object is created beneath `WoTRegistry`, and for + every resource its `ThingDescriptionFileType` / `ThingModelFileType` + document node is created beneath the group. NodeIds are stable and + deterministic, derived from the registry Xid (for example + `WoTRegistry/groups/{groupId}/resources/{resourceId}`). The projection is + reconciled on every registry `Changed` event — including projection-only + callbacks, which never re-trigger materialization — and removes group and + resource nodes as they disappear from the snapshot. +* Each node carries its xRegistry and registry metadata (ids/Xid/epoch/name/ + description/timestamps/format/content type, desired/default/active + version, enabled/load state, validation outcome, content digest, + materialized-node count, the materialized `RootNodeId`, and selected + bindings). `HasNotifier` references chain `WoTRegistry` → group → resource + → `Server`, and resource lifecycle failure events are sourced at the + specific resource node (the registry object remains the source for the + refresh-completed summary event). +* The xRegistry `CreateGroup` / `GetOrCreateGroup` (on `WoTRegistry`), + `CreateResource` / `GetOrCreateResource` / `Delete` (on a group) and the + document `Delete`, `Validate`, `SetEnabled` and `SetDefaultVersion` (on a + resource) Methods are wired to the registry service, enforcing + `ExpectedEpoch` optimistic concurrency and the management access policy. + Registry mutations require a `SignAndEncrypt` SecureChannel; deployments + may separately permit read-only registry access over `SecurityMode.None`. +* The inherited FileType (`Open` / `Read` / `Write` / `Close` / + `GetPosition` / `SetPosition`) transfers the document body with + per-session handles, a single exclusive writer and bounds. Closing a + write handle commits the buffer as a new version; a document that fails + validation is still stored as an invalid version so the bytes are never + lost and the previous active projection is retained. +* Every browseable registry/group/resource node also carries the inherited + optional `Labels` (`AttributesType`) container. Each label is persisted as + an ordinally-ordered key/value pair on the owning `WotRegistrySnapshot` / + `WotResourceGroup` / `WotResource` model and materializes as its own + `PropertyType` child with a deterministic NodeId (for example + `WoTRegistry/groups/{groupId}/labels/{key}`) and a safe, collision-checked + BrowseName. The container's `AddAttribute(Key, Value, ExpectedEpoch)` and + `RemoveAttribute(Key, ExpectedEpoch)` Methods enforce the management access + policy, optimistic-concurrency `ExpectedEpoch` (the group/resource's own + epoch; the registry singleton has no separate epoch so its Labels compare + against the snapshot `Generation`), the configured + `WotRegistryPersistenceBounds` (`MaxLabelsPerEntity`, + `MaxLabelKeyLength`, `MaxLabelValueLength`) and reject invalid/control/BIDI/ + path characters or a key colliding with the container's own fixed + `AddAttribute`/`RemoveAttribute` member names, using the shared + `WotChildNameValidator`. `IWotRegistryService` exposes matching + `Add`/`RemoveRegistryLabelAsync`, `Add`/`RemoveGroupLabelAsync` and + `Add`/`RemoveResourceLabelAsync` service APIs; label mutations raise a + projection-only registry change so they update the browseable Labels + container without re-triggering materialization. Labels survive a registry + restart and file-store reload (persisted alongside their owning + group/resource, and — for the registry-level set — in a small + `registry.json`) and remain visible after every projection reconciliation. + Version-level labels are stored on the immutable `WotResourceVersion` + model for API completeness but are not materialized as a separate + AddressSpace node, since the xRegistry model does not define a + `VersionType.Labels` container (only Registry/Group/Resource expose one). + +### 11.8 Binding-vocabulary alignment (NodeSet2 ↔ WoT) + +`Opc.Ua.Wot.WotNodeSetConverter` maps a NodeSet2 model to a WoT Thing +Model / Thing Description and back. The deterministic, versioned +`uav:nodes` projection covers the complete UANodeSet schema and is emitted +only when the semantic/readable mapping cannot reproduce all source facts; +`uav:nodeSet` is emitted only for explicit byte archival or a demonstrated +final fallback. Unmapped WoT JSON members are stored +individually by RFC 6901 pointer in a `WoTJsonResidue` NodeSet Extension, +not by copying the source document. The readable surface tracks the current +[OPC UA WoT Binding](https://reference.opcfoundation.org/) revision: + +* **Semantic conversion is the default.** `WotNodeSetPreservationMode` + selects `WhenRequired` (default), `Always` (explicit byte archive), or + `Never` (conformance/completeness tests). The converter first reconstructs + the readable document and omits `uav:nodes` when it is equivalent; it then + validates the structured projection when fallback is required. Tests that + prove completeness use `Never` and assert that no opaque envelope exists. + `NodeSetRoundtripReport.NativeProjectionPreserved` and + `UsedPreservationEnvelope` distinguish the two paths. + +* **Unknown members survive as residue, not an envelope.** During + TD/TM-to-NodeSet synthesis, only unrecognized or unmapped JSON values are + stored in the root `Extensions` collection as digest-protected + `WoTJsonResidue/Member` entries. Reverse conversion regenerates mapped + facts from OPC UA and applies the pointer-addressed values. A collision + with a regenerated model fact is reported as + `WotDiagnosticCode.ResidueConflict`. + +* **Event affordances carry `uav:eventType`.** An OPC UA EventType (a + `BaseEventType` subtype) projects to an event affordance annotated + `@type: uav:eventType` alongside `uav:isEvent: true`; a NodeSet whose + root is an EventType is annotated the same way. The two forms are the + `@type` annotation and the boolean anchor of the same fact, so a + document that pairs `@type: uav:eventType` with `uav:isEvent: false` + is rejected (`WotDiagnosticCode.EventAnnotationConflict`). Reverse + conversion recreates a `BaseEventType` subtype from either form. + +* **Identity terms are portable ExpandedNodeIds.** Every persisted + identity term — `uav:id`, each `uav:hasComponent` / `uav:componentOf` + entry, `uav:mapToNodeId` / `uav:mapToType`, a NodeId-valued + `uav:refId`, and a generated `?id=` href — is emitted as an + OPC 10000-6 `nsu=;...` ExpandedNodeId, resolved through + the source NodeSet's `NamespaceUris` table so the value survives a + namespace-table reordering; namespace 0 keeps its canonical `i=` form + and the session-local `ns=` form is never emitted. On input the + converter diagnoses an `ns=` in any of these terms + (`WotDiagnosticCode.NonPortableIdentity`). The `uav:nodeSet` envelope + and NodeSet-local fields inside `uav:nodes` keep their own namespace + tables and are excluded from this readable-identity rule. + +* **BrowseNames are portable QualifiedNames.** Generated readable + `uav:browseName` values use OPC 10000-6 `nsu=;` for + non-base namespaces and the bare Name for namespace 0. Numeric + `namespaceIndex:name` is retained only inside `uav:nodes`, which carries + its own `namespaceUris` table. + +* **Model concepts carry NamespaceUri-qualified names.** Generated + contexts bind `ua` to the base OPC UA namespace and deterministic + `ns1`, `ns2`, … prefixes to companion NamespaceUris. A typed link emits + the ReferenceType model name directly in `rel` (for example + `ua:HasOrderedComponent`) beside its definitive `uav:refId` + ExpandedNodeId. Authored + `uav:mapToTypeName` / `uav:congruentTypeName` hints are validated and + preserved beside their definitive identifiers. Compact model names are + never used for arbitrary instance targets. + +* **`observable` advertises binding support.** A generated + `observable: true` / `observeproperty` form states that the TD exposes + observation through this binding. It is not a claim that other OPC UA + Variables are technically unmonitorable; any Variable can be a + MonitoredItem when the Server grants access. + +* **HasComponent subtypes are pinned by a typed link.** + `uav:hasComponent` / `uav:componentOf` expose parent-child ownership + for discovery across `HasComponent` and its subtypes. When the source + ReferenceType is a subtype (for example `HasOrderedComponent`, `i=49`), + the converter additionally emits a link whose `rel` is + `ua:HasOrderedComponent`, whose `uav:refId` is `i=49`, and + whose `uav:refName` names the reference. + Reverse conversion resolves the name, verifies the identifier when both + are present, recreates the exact subtype, and otherwise falls back to + plain `HasComponent`. + +### 11.9 Registry client + +`Opc.Ua.WotCon.Client` ships a registry client surface alongside the existing `WotConnectivityClient`. `WotRegistryClient` **derives from the shared xRegistry `XRegistryClient`** — the WoT registry model subtypes the xRegistry base model, so it is a *domain client* in the sense of [xRegistry — Extending for a domain registry](XRegistry.md#extending-for-a-domain-registry) and inherits the base group/resource lifecycle, `Session` and `RegistryNodeId`. The registry root is not the provisional well-known `65000`: the browse-resolved `WoTRegistry` NodeId is passed to the base constructor. The generated `WoTRegistryTypeClient` / xRegistry `GroupTypeClient` / `ResourceTypeClient` proxies are still *composed* rather than inherited, so a typed proxy is reused directly instead of being re-resolved per call: + +* `WotRegistryClient.ForServerAsync(session, telemetry, ct)` resolves the well-known `WoTRegistry` object (a `HasComponent` child of the `Server` object) via `TranslateBrowsePaths`, exactly like `WotConnectivityClient.ForServerAsync` resolves `WoTAssetConnectionManagement`. Both now share the same internal `TranslateBrowsePaths` helper. The resolved NodeId is surfaced as the inherited `RegistryNodeId`. +* `CreateThingDescriptionGroupAsync` / `CreateThingModelGroupAsync` and their `GetOrCreate…` counterparts call the inherited xRegistry `CreateGroup`/`GetOrCreateGroup` Methods. The wire protocol has no "kind" argument, so the returned `WotRegistryGroupClient` discovers whether the server materialised a `ThingDescriptionGroupType` or a `ThingModelGroupType` from the created group's reported `TypeDefinition` — this works against any conformant server regardless of its own group-naming convention. `ThingModelsGroupId`/`ThingDescriptionsGroupId` expose the two well-known reserved group ids. +* `WotRegistryGroupClient.CreateResourceAsync` / `GetOrCreateResourceAsync` call the group's `CreateResource` / `GetOrCreateResource` Methods and return a `WotRegistryResourceClient` plus the server-assigned version id. +* `WotRegistryResourceClient.UploadNewVersionAsync(ByteString | Stream, …)` uploads a new document version through the inherited `FileType` `Open(Write|EraseExisting)` → `Write` → `Close` primitives (the same `FileTypeClientExtensions` used elsewhere in this package); closing the write handle commits the buffer as a new resource version. `DownloadAsync` reads the active/default version back through the shared xRegistry `ResourceTypeClientExtensions.ReadDocumentAsync` helper — a WoT document resource *is* an xRegistry `ResourceType`, so the shared helper applies directly to the generated proxy — and `DownloadToAsync` streams it into a caller-owned `Stream`. `ValidateAsync`, `SetEnabledAsync`, `SetDefaultVersionAsync` and `DeleteAsync` call the matching document Methods. +* `WotRegistryClient.RefreshAsync` / `RefreshAllAsync` call the generated `Refresh` Method and return a typed `WotRegistryRefreshResult` (`Summary`, `Results`, `NewGeneration`, `HasFailures`, `EnsureSuccess()`). +* `WotRegistryClient.LoadDocumentsAsync` loads a caller-supplied `ArrayOf` (an immutable `Kind`/`GroupId`/`ResourceId`/`Content` (`ByteString`)/`VersionId` descriptor), get-or-creating each target group/resource and uploading its content, then optionally calls `RefreshAllAsync` — one workflow. Thing Models are always processed before Thing Descriptions (preserving the caller's relative order within each kind) so referenced models are materialised before the descriptions that depend on them. A mutation failure or a group/document kind mismatch aborts immediately (`ServiceResultException`); a refresh failure is *not* thrown — it is surfaced on the returned `WotRegistryBulkLoadResult.Refresh` for the caller to inspect, since a partial refresh outcome is legitimate application data. + +```csharp +WotRegistryClient registry = await WotRegistryClient.ForServerAsync( + session, session.MessageContext.Telemetry, ct); + +WotRegistryGroupClient group = await registry.CreateThingDescriptionGroupAsync(ct); +(WotRegistryResourceClient resource, string versionId, bool created) = + await group.GetOrCreateResourceAsync("sensor01", ct: ct); + +await resource.UploadNewVersionAsync( + ByteString.From(File.ReadAllBytes("sensor01.td.json")), ct: ct); + +WotRegistryRefreshResult refresh = await registry.RefreshAllAsync(ct: ct); +refresh.EnsureSuccess(); +``` + +Register the registry client with DI alongside `AddWotConClient` via `AddWotRegistryClient` (on `IOpcUaBuilder` or `IOpcUaClientBuilder`, bindable from `IConfiguration`/`IConfigurationSection`, default section `OpcUa:WotCon:RegistryClient`). It follows the same lazy `ManagedSession`-backed factory pattern: resolve `Func>` for the lazily connected form, or `Func>` to wrap an already-connected session. diff --git a/docs/WotBindings.md b/docs/WotBindings.md new file mode 100644 index 0000000000..ee231a0068 --- /dev/null +++ b/docs/WotBindings.md @@ -0,0 +1,790 @@ +# WoT Connectivity protocol bindings + +The WoT Connectivity 1.1 runtime materializes Thing Descriptions and Thing Models into the OPC UA AddressSpace. Each interaction-affordance **form** in a document describes how to reach a value over a concrete protocol (HTTP, MQTT, Modbus, OPC UA, …). The **protocol binder** subsystem turns those forms into validated, immutable **binding plans** and, when an executor is present, drives the live transport operations. + +The subsystem is deliberately layered so the model remains transport-neutral while the base Bindings package can bundle the dependency-compatible executors on modern .NET. + +This document starts with the bindings that ship today and how to register them, then describes the contributor workflow for adding your own binding. + +## Table of contents + +- [Bindings that ship today](#bindings-that-ship-today) + - [Package and assembly layout](#package-and-assembly-layout) + - [Stable public interfaces](#stable-public-interfaces) + - [Polling, retry and backoff](#polling-retry-and-backoff) + - [Runtime integration](#runtime-integration) + - [OPC UA target-mapping binding runtime](#opc-ua-target-mapping-binding-runtime) + - [Registering binders and executors](#registering-binders-and-executors) + - [Intentionally unsupported operations](#intentionally-unsupported-operations) + - [Transport security](#transport-security) + - [Operation coverage (OPC UA executor)](#operation-coverage-opc-ua-executor) +- [Adding your own binding](#adding-your-own-binding) + - [Architecture and lifecycle](#architecture-and-lifecycle) + - [Identification and capability](#identification-and-capability) + - [Form extraction and vocabulary terms](#form-extraction-and-vocabulary-terms) + - [Authoring OPC 10101 target mapping](#authoring-opc-10101-target-mapping) + - [Planner validation and compiled forms](#planner-validation-and-compiled-forms) + - [Executors, channels, and disposal](#executors-channels-and-disposal) + - [Payload codecs](#payload-codecs) + - [Credentials and trust](#credentials-and-trust) + - [Registration](#registration) + - [Monitoring and local sampling](#monitoring-and-local-sampling) + - [Structured target mapping](#structured-target-mapping) + - [Status and error mapping](#status-and-error-mapping) + - [Memory-binding implementation](#memory-binding-implementation) + - [Memory-binding tests](#memory-binding-tests) + - [NativeAOT and trimming](#nativeaot-and-trimming) + - [Packaging and TFM decisions](#packaging-and-tfm-decisions) + - [Contributor checklist](#contributor-checklist) + - [Testing matrix](#testing-matrix) +- [Related documentation](#related-documentation) + +## Bindings that ship today + +### Package and assembly layout + +| Project, assembly, or namespace | Contents | Availability and dependencies | +| --- | --- | --- | +| `src/Opc.Ua.WotCon.Bindings` / `Opc.Ua.WotCon.Bindings` | Stable interfaces, plan model, codecs, the eight planner/validator binders, and registry. No sample binding ships in this library. | Base package `OPCFoundation.NetStandard.Opc.Ua.WotCon.Bindings`; full `net472;net48;netstandard2.1;net8.0;net9.0;net10.0` matrix. | +| `Opc.Ua.WotCon.Bindings.Http` | HTTP executor and options, included in the base Bindings package | `net8.0`, `net9.0`, and `net10.0`; `HttpClient`. | +| `Opc.Ua.WotCon.Bindings.Modbus` | Modbus TCP client, executor, addressing, and conversion, included in the base Bindings package | `net8.0`, `net9.0`, and `net10.0`; sockets only. | +| `Opc.Ua.WotCon.Bindings.OpcUa` | OPC UA-to-OPC UA executor and options, included in the base Bindings package | `net8.0`, `net9.0`, and `net10.0`; `Opc.Ua.Client`. | +| `src/Opc.Ua.WotCon.Bindings.Mqtt` / `Opc.Ua.WotCon.Bindings.Mqtt` | MQTT executor and options | Separate `OPCFoundation.NetStandard.Opc.Ua.WotCon.Bindings.Mqtt` package for `net8.0`, `net9.0`, and `net10.0`; MQTTnet. | +| `Opc.Ua.WotCon.Server` | Materialization coordinator integration | References `Opc.Ua.WotCon.Bindings` only. | +| `samples/WotCon` | Runnable sample guide plus `AggregationClient`, `AggregationServer`, and `FlatTagServer` projects. `AggregationServer/Bindings/MemoryWotBinding.cs` is a reference custom binding only. | Sample applications; the memory binding is deliberately not registered in the sample host. | + +The base Bindings package keeps its full TFM matrix, but its concrete HTTP, Modbus, and OPC UA executor namespaces are compiled only for `net8.0`, `net9.0`, and `net10.0`. MQTT remains separate because it carries an optional external transport dependency. Planner-only use therefore remains available on every base-package TFM. The WoT samples now live under `samples/WotCon`; their project, assembly, and namespace names are `AggregationClient`, `AggregationServer`, and `FlatTagServer` without a `Wot` prefix. The sample guide is [`samples/WotCon/README.md`](../samples/WotCon/README.md). + +The plural `Bindings` name is part of every current artifact and namespace. Do not add new references to the retired singular `Opc.Ua.WotCon.Binding*` names. + +### Stable public interfaces + +All contracts live in the `Opc.Ua.WotCon.Bindings` namespace. + +* **Identification, version and capability** + * `WotBindingIdentity` — a binder's stable `Id` + `Version` (`id@version` key). Multiple versions of a binding coexist. + * `WotBindingSource` / `WotBindingMaturity` — the version-pinned specification a binder implements (URL, version/date, commit, standards maturity). + * `WotBindingCapability` — supported operations, content types, executable flag; projects onto the generated `WoTBindingCapabilityDataType`. + * `IWotBindingIdentification` — deterministic selection. A binder returns a `WotBindingMatch` (kind + priority) so selection uses pinned rules (explicit pin > vocabulary > subprotocol > scheme), **not the URI scheme alone**. +* **Form validation and compilation** + * `WotFormExtractor` / `WotAffordanceForm` — reflection-free extraction of forms (with resolved `op` defaults, security scheme references and JSON Pointers). + * `IWotBindingPlanner` — validates a form and compiles it into a `WotBindingCompilation` of immutable `WotCompiledForm` entries carrying `WotEndpointDescriptor` / `WotAddressingDescriptor` / `WotOperationDescriptor` / `WotPayloadDescriptor` / `WotTargetMappingDescriptor` metadata. +* **Target mapping ([OPC 10101 §6.5.4](https://reference.opcfoundation.org/specs/OPC-10101/6.5.4), with the protocol-neutral example in [§8.2](https://reference.opcfoundation.org/specs/OPC-10101/8.2))** + * `WotTargetMappingDescriptor` — the protocol-neutral `uav:mapToNodeId` / `uav:mapToType` / `uav:mapByFieldPath` terms authored on a **property affordance** (never on a form), letting a non-OPC-UA source (Modbus, HTTP, …) be projected onto an OPC UA target NodeId or a field of a structured target type. `WotAffordanceForm.TargetMapping` parses it from the owning affordance; `WotProtocolBinderRegistry.Prepare` validates it once for every protocol (property-only, `mapByFieldPath` requires `mapToType`, non-empty values, never authored on a form) and attaches it to every `WotCompiledForm` it produces, so individual planners never parse or duplicate it. +* **Payload codec selection** + * `IWotPayloadCodec` / `IWotCodecRegistry` — reflection-free JSON, text and octet-stream codecs; protocol executors may register more. +* **Credential / trust reference lookup (no secrets in TD / registry nodes)** + * `WotSecurityDefinition` / `WotCredentialReference` — secret-free scheme references parsed from `securityDefinitions`. + * `IWotCredentialProvider` — resolves a reference into short-lived `WotCredential` material at runtime, out-of-band. No secret ever appears in a Thing Description or on a registry node. +* **Lifecycle and operations** + * `IWotBindingExecutor` — `ActivateAsync` opens a per-form `IWotBindingChannel`. + * `IWotBindingChannel` — `ReadAsync` / `WriteAsync` / `InvokeAsync` / `ObserveAsync` / `SubscribeEventAsync`, returning `WotReadResult` / `WotWriteResult` / `WotInvokeResult` with mapped `StatusCode`s. +* **Registry and structured diagnostics** + * `IWotBinderRegistry` / `WotProtocolBinderRegistry` — the Prepare / Activate / Deactivate seam the coordinator uses. + * `WotBindingDiagnostic` — severity + stable code + **RFC 6901 JSON Pointer**. + +### Polling, retry and backoff + +A transport with no native push channel (HTTP, Modbus) implements `ObserveAsync` with the shared `PollingWotSubscription`, so a poll-only driver does not write its own timer loop. The poll callback reports **health**: it returns `false` when the source failed without throwing, which is how a binding that maps a failure onto a bad `StatusCode` reports it. Both the mapped bad status and a thrown fault are surfaced as a notification, so a variable never silently keeps its last good value while the asset is down. + +Consecutive unhealthy polls back off through an `IChannelReconnectPolicy` — the same abstraction the stack already uses for channel reconnects — so an offline device is not hammered once per poll cycle. The default is `ExponentialBackoffChannelReconnectPolicy` (500 ms doubling to 30 s, unlimited attempts); set `RetryPolicy` on `HttpWotBindingOptions` / `ModbusWotBindingOptions` to change it. Backing off never polls *faster* than the configured interval, the first healthy poll resets it, and a policy that reports "stop retrying" ends the loop rather than spinning. + +The interval itself comes from the form where the protocol binding defines a standard term for it. Modbus does: **`modv:pollingTime`** (milliseconds, per the W3C Modbus binding — distinct from `modv:timeout`, which is a request timeout) is compiled onto `WotOperationDescriptor.PollInterval` and wins over the executor's configured `ObserveInterval`. HTTP has no standard polling term, so it uses `HttpWotBindingOptions.ObserveInterval`. No vendor-specific `uav:` term is introduced for this. + +For Modbus TCP, `ModbusTcpClient` treats a faulted socket as disposable state. The next read or write transaction reconnects before sending the MBAP request, so polling backoff controls retry rate while ordinary operations can recover without recreating the binding channel. + + + +Eight planner/validator binders ship in `Opc.Ua.WotCon.Bindings` (`WotBuiltInBinders.CreateAll()`). Each pins its exact source in `Planners/WotBindingSources.cs`. + +| Binding | Id | Pinned source | Maturity | Executable | +| --- | --- | --- | --- | --- | +| HTTP | `w3c.http` | W3C TD 1.1 (normative HTTP mapping) | REC | yes (`Opc.Ua.WotCon.Bindings.Http`, bundled on net8+) | +| CoAP | `w3c.coap` | W3C Binding Templates CoAP | Editor's Draft | planner only | +| MQTT | `w3c.mqtt` | W3C Binding Templates MQTT | Editor's Draft | yes (`Opc.Ua.WotCon.Bindings.Mqtt`, separate package) | +| Modbus TCP | `w3c.modbus` | W3C Binding Templates Modbus | Editor's Draft | yes (`Opc.Ua.WotCon.Bindings.Modbus`, bundled on net8+) | +| BACnet | `w3c.bacnet` | W3C Binding Templates BACnet | Editor's Draft | planner only | +| PROFINET | `w3c.profinet` | WoT PROFINET contribution | Unofficial Draft | planner only | +| LoRaWAN | `w3c.lorawan` | WoT LoRaWAN contribution | Unofficial Draft | planner only | +| OPC UA | `opc.opcua` | OPC 10101 (OPC UA for WoT Binding) | OPC specification | yes (`Opc.Ua.WotCon.Bindings.OpcUa`, bundled on net8+) | + +Notes: + +* The **W3C Binding Templates registry is a pilot and currently empty**; no binder ever reports `RegistryCurrent`. Drafts expose their Editor's Draft maturity; OPC UA exposes the OPC specification maturity. +* BACnet, PROFINET, LoRaWAN and CoAP perform **schema / document-level planning only** and are reported as **non-executable** — the runtime materializes their nodes but marks the closure degraded so callers know they cannot be driven yet. +* Each planner validates the href scheme and the currently-defined vocabulary terms of its pinned document, checks `op` compatibility, `contentType` and required fields, produces immutable endpoint/addressing/operation/payload metadata and returns precise errors/warnings with JSON Pointers. + +### Runtime integration + +`WotMaterializationCoordinator` compiles each resource's forms into a `WotBindingPlan` during **Prepare**, activates the plan only **after** the projection is committed as the active generation, and deactivates it **before** the projection is retired or unloaded. + +* **Strict mode** (`WotRegistryServerOptions.StrictBindings = true`) fails the closure when any required form is unsupported or invalid. +* **Degraded mode** materializes nodes with `BadConfigurationError` and emits a `WoTBindingFailureEvent`. Validated-but-non-executable forms also degrade the closure so their nodes are visible but flagged. +* Binding capability snapshots populate the registry `SelectedBindings` node and contribute to refresh unchanged-detection. +* The legacy 1.02 `IWotAssetProviderFactory` provider model is preserved untouched. +* The coordinator passes its prepared `WotBindingPlan`s to the host as `WotProjectionDocument.BindingPlans` (an `ArrayOf`), so the projection host can wire a per-generation OPC UA binding runtime once the closure's NodeSet2 content has been imported. + +### OPC UA target-mapping binding runtime + +Once a closure's forms are materialized as NodeSet2 content, `LifecycleWotProjectionHost` wires each runtime NodeSet generation's `RuntimeNodeSetOptions.ConfigureAsync` to build a **projection binding runtime** from the document's `BindingPlans`. This implemented generic runtime drives live target-mapped value exchange between the resolved OPC UA variable and the compiled forms of its non-OPC-UA or OPC UA source; it is not limited to a protocol-specific projection. + +* `IWotBindingChannelFactory` (implemented by `WotProtocolBinderRegistry` alongside `IWotBinderRegistry`) opens a live `IWotBindingChannel` for a compiled, executable form. Dependency injection registers the **same** `WotProtocolBinderRegistry` singleton for both interfaces regardless of whether `AddWotRegistryServer` or `AddWotProtocolBinders`/`AddWotBinding` is called first. +* `IWotTargetVariableResolver` (default `WotTargetVariableResolver`) resolves the target `BaseVariableState` a `WotTargetMappingDescriptor` declares against the freshly imported predefined nodes: + * `uav:mapToNodeId` alone resolves that exact portable NodeId (parsed including `nsu=` forms against `INodeManagerBuilder.Context.NamespaceUris`) and requires a `BaseVariableState`. + * `uav:mapToType` alone resolves the unique variable whose `DataType` equals the target type. + * Both terms resolve the exact node and validate its `DataType` equals the declared target type. + * Missing, malformed, ambiguous, wrong-node-class or type-mismatch mappings fail activation with a deterministic `ServiceResultException` status (`BadNodeIdInvalid` / `BadNodeIdUnknown` / `BadBrowseNameDuplicated` / `BadTypeMismatch`); every portable NodeId parse failure — including one the parser itself raises as a `ServiceResultException` — is wrapped as `BadNodeIdInvalid` naming the offending term (`uav:mapToNodeId` / `uav:mapToType`) rather than surfacing the parser's own exception shape. +* `IWotProjectionBindingRuntimeFactory` (default `WotProjectionBindingRuntimeFactory`) groups the closure's target-mapped, executable compiled forms by resolved target variable and returns a `WotProjectionBindingRuntime` — the `IAsyncDisposable` the NodeSet generation owns: + * A **direct** target (`uav:mapToNodeId` and/or `uav:mapToType` alone) wires the executable `readproperty`/`writeproperty` forms as full async `OnRead`/`OnWrite` handlers that preserve the source `StatusCode` and `SourceTimestamp`; local monitored items sample the same read handler, so no second observe bridge is created for an `observeproperty` form on the same target. + * A **structured** target (`uav:mapToType` + `uav:mapByFieldPath`) composes the value by reading every mapped field concurrently, building nested structures via `IEncodeableFactory` / `IStructure` / `IDataTypeDefinitionSource` (no reflection); writes extract and write each mapped field concurrently from the incoming structure. A single failing field fails the whole read or write; a successful read preserves a non-default `Good` status if any field reported one and uses the oldest non-`MinValue` `SourceTimestamp` across the fields, rather than always reporting plain `Good`/now. + * Conflicting direct-vs-field mappings, duplicate read/write mappings for the same target/field, and unsupported target operations all fail activation deterministically. Everything else about a structured target that depends on its structure type being registered — the encodeable type lookup, root instance validation, and `uav:mapByFieldPath` path resolution (empty segments, unknown fields, array-valued or non-structure intermediate fields) — is deferred to the first structured read or write instead of failing activation, because `RuntimeNodeSetOptions.ConfigureAsync` runs before `NodeManagerLifecycle.RefreshComplexTypesAsync` registers the server's custom structure types. Resolution is retried, uncached, on every first use until it succeeds against the (by-then-populated) `IEncodeableFactory` instance; a still-unresolved first use returns a deterministic `BadConfigurationError` read/write status instead of throwing out of the request pipeline. + * Channels are opened lazily and cached one-per-compiled-form for the generation; concurrent first use opens once, and a failed open is evicted so a later call can retry. Every successfully opened channel is disposed with the generation; disposal failures are aggregated. A channel open racing with, or started after, generation disposal never leaks: disposal marks the slot disposed under its lock so no later open can start, and still awaits and disposes a channel whose open was already in flight. +* Both abstractions are always available via direct construction (no DI container required) and are registered through `AddWotRegistryServer` using `TryAdd*` so a host application can supply its own implementation. + +### Registering binders and executors + +The planner binders are opt-in and replaceable. `AddHttpWotBinding`, `AddModbusWotBinding`, and `AddOpcUaWotBinding` come from the base Bindings package on `net8.0+`; `AddMqttWotBinding` requires the separate MQTT package: + +```csharp +builder + .AddWotRegistryServer(o => o.StrictBindings = false) + .AddHttpWotBinding() // planners + HTTP executor + .AddModbusWotBinding() // + Modbus TCP executor + .AddMqttWotBinding() // + MQTT executor + .AddOpcUaWotBinding(o => o.SessionFactory = ConnectSessionAsync); +``` + +Each `AddWotBinding` registers the eight planner binders (idempotently) and its executor. Without any executor, `AddWotProtocolBinders()` still validates and compiles plans, materializing non-executable nodes. + +Replace or add binders directly: + +```csharp +builder.AddWotBinder(new MyCustomBinder()); // custom planner +builder.AddWotBindingExecutor(new MyCustomExecutor()); // custom executor +builder.AddWotCredentialProvider(new VaultCredentialProvider()); +``` + +Selection is deterministic: the registry evaluates binders in ordinal `id@version` order and chooses the highest-priority `WotBindingMatch`. + +To write `MyCustomBinder` and `MyCustomExecutor` see [Adding your own binding](#adding-your-own-binding). The worked +`AggregationServer.MemoryWotBinder` implementation in the WotCon aggregation sample binds a fictitious `mem://` protocol +to an in-process key/value store. + +### Intentionally unsupported operations + +* CoAP, BACnet, PROFINET and LoRaWAN ship as **planner-only** (non-executable) in this build. +* The Modbus binding does not support action invocation or events (Modbus has no such concept); those operations return `BadNotSupported`. +* The OPC UA executor implements read/write/invoke and **native** observe / event subscription (a `Subscription` / `MonitoredItem` pair per channel, Part 4 §5.12 / §5.13) — see [Operation coverage](#operation-coverage-opc-ua-executor) below. +* The MQTT executor implements publish/subscribe; request/response RPC with a dedicated response topic is not modelled (actions publish only). + +### Transport security + +The executable bindings fail closed and never downgrade a secure form to an insecure transport: + +* **MQTT** — an `mqtts://` href always enables TLS and defaults to port 8883; an `mqtt://` href stays explicit plaintext (port 1883). Username / password, the TLS client certificate and TLS trust anchors are resolved through the `IWotCredentialProvider`; a form that declares a security scheme is refused when the provider resolves no credential. Username / password over plaintext `mqtt://` is refused unless `MqttWotBindingOptions.AllowCredentialsOverPlaintext` is set. +* **HTTP** — the executor-owned `HttpClient` disables automatic redirects and applies a bounded, origin-aware redirect policy: custom header and query credentials are stripped across origins, redirect loops and non-`http(s)` schemes are refused, an `https`→`http` downgrade is refused unless `AllowInsecureRedirectDowngrade` is set, and the hop count is capped by `MaxAutomaticRedirects` (default 5). A caller-supplied client used with a credential-bearing form fails closed unless `HttpWotBindingOptions.CallerClientHandlesRedirectSafety` confirms the client handles redirects without leaking credentials. +* **Modbus** — `modv:address` must be 0–65535 and the addressed range (`address + quantity - 1`) must stay in the 16-bit space; function-only forms map exactly onto function codes 1, 2, 3, 4, 5, 6, 15 and 16, and op/function (or entity/function) mismatches are rejected. The executor re-validates the range before narrowing to `ushort` / `byte`. + +### Operation coverage (OPC UA executor) + +| Operation | Mechanism | +| --- | --- | +| `readproperty` | `Read` service (`ISession.ReadValueAsync`). | +| `writeproperty` | `Write` service; the mapped `StatusCode` is preserved. | +| `observeproperty` | A native data-change `MonitoredItem` (`AttributeId = Value`, queue size 1) on a dedicated `Subscription`; no client-side polling. | +| `invokeaction` | `Call` service; the method NodeId is `uav:id` and its owner object is resolved from `uav:componentOf`. | +| `subscribeevent` | A native event `MonitoredItem` (`AttributeId = EventNotifier`) selecting `EventId`, `EventType`, `SourceNode`, `SourceName`, `Time`, `ReceiveTime`, `Message` and `Severity`, plus any `uav:eventFields`-authored extra select clauses. Every selected field is delivered in `WotNotification.EventFields`, keyed by its browse path, with the event's own `Time` / `ReceiveTime` as the source / server timestamp. | + +Both subscription kinds share one code path: a dedicated `Subscription` is created per channel subscription, its `MonitoredItem` is disposed and the subscription removed from the session (`ISession.RemoveSubscriptionAsync`) when the returned `IWotSubscription` is disposed, so no session or subscription is leaked — including when creation fails partway through. + +A compiled form's NodeId (`uav:id`, and `uav:componentOf` for actions) is resolved with `NodeId.Parse` for the plain `ns=` / `i=` / `s=` / `g=` / `b=` forms; a portable NodeId carrying an `nsu=` namespace URI is parsed as an `ExpandedNodeId` and resolved against the connected session's namespace table, since `NodeId.Parse` alone cannot resolve a namespace URI without one. + +## Adding your own binding + +This guide explains how to add a protocol binding to the WoT Connectivity runtime from form identification through live +value exchange, registration, diagnostics, tests, packaging, and NativeAOT validation. The current worked implementation +is [`MemoryWotBinding.cs`](../samples/WotCon/AggregationServer/Bindings/MemoryWotBinding.cs) in the WotCon aggregation +sample, so it demonstrates the extension pattern without shipping in the `Opc.Ua.WotCon.Bindings` package or being +registered by the sample host. A test-only copy lives in +[`tests/Opc.Ua.WotCon.Tests/Support/MemoryWotBinding.cs`](../tests/Opc.Ua.WotCon.Tests/Support/MemoryWotBinding.cs). +The production HTTP, Modbus TCP, OPC UA, and MQTT implementations provide protocol-specific examples. + +### Architecture and lifecycle + +The binding pipeline separates pure document processing from transport I/O: + +1. `WotFormExtractor` parses property, action, and event forms into immutable `WotAffordanceForm` values. It applies default WoT `op` values, inherits Thing-level security when a form has no override, clones the form and affordance JSON, and records RFC 6901 JSON Pointers. +2. Every `IWotProtocolBinder` exposes a stable `WotBindingIdentity`, a version-pinned `WotBindingCapability`, deterministic `IWotBindingIdentification`, and an `IWotBindingPlanner`. +3. `WotProtocolBinderRegistry.Prepare` validates protocol-neutral target mapping, selects one binder for each form, and calls its planner without performing transport I/O. +4. The planner validates protocol vocabulary and addressing, then emits one immutable `WotCompiledForm` per supported operation. A compiled form carries endpoint, addressing, operation, payload, secret-free credential references, target mapping, and executability. +5. The materialization coordinator converts a dependency closure to runtime NodeSet2 content and passes its plans in `WotProjectionDocument.BindingPlans`. +6. After the NodeSet is imported, `WotProjectionBindingRuntimeFactory` wires the compiled forms to target variables. Wiring is synchronous and performs no transport I/O. +7. On first read or write, `WotBindingChannelSlot` asks `IWotBindingChannelFactory.OpenChannelAsync` for a live channel. The registry resolves the matching `IWotBindingExecutor` and creates a `WotExecutorContext` containing credentials, codecs, and bounds. +8. The runtime NodeSet generation owns the resulting `IAsyncDisposable` binding runtime. The runtime owns every lazily opened channel and disposes them when that generation drains and is removed. + +`IWotBinderRegistry.ActivateAsync` is called only after the new projection becomes active. On replacement, the shadow switch succeeds before the coordinator deactivates the old plans and activates the new plans. The old runtime NodeSet generation can continue serving its existing monitored items until they drain; its generation-owned channels are not disposed until that old generation is removed. If conversion, wiring, or shadow activation fails, the previous active generation remains available. + +### Identification and capability + +Use a stable binder id and a version that identifies the planner behavior. `WotBindingIdentity.Key` is `id@version`, and multiple versions can coexist. Executor lookup first uses the exact key and then the id-level default. + +`WotBindingCapability` must accurately describe the version-pinned source document, operations, content types, and whether the binding has a runtime implementation. The capability is projected to `WoTBindingCapabilityDataType`, advertised by the registry, and included in unchanged-generation decisions. + +Identification must be deterministic. `WotProtocolBinderBase.MatchStandard` implements the normal precedence: an explicit resource pin is stronger than a vocabulary match, which is stronger than a URI-scheme match. The registry evaluates binders in ordinal `id@version` order and uses that order to break equal-priority matches. Override `Match` directly when the protocol also requires a subprotocol or a pinned shape rule. + +Do not claim a form merely because its URI scheme is vaguely related to the protocol. A false positive prevents a better binder from compiling the form and turns a protocol-selection problem into misleading planner diagnostics. + +### Form extraction and vocabulary terms + +`WotAffordanceForm.FormElement` contains the form object and is where protocol-specific form vocabulary normally belongs. `AffordanceElement` contains the owning property, action, or event. Use `TryGetString`, `TryGetBoolean`, `TryGetInt32`, and `TryGetStringArray` instead of deserializing arbitrary objects or using reflection. + +The planner should validate every term it consumes, reject contradictory terms, enforce `WotBindingBounds`, and report diagnostics at `form.Pointer("term")`. Use `form.AffordancePointer("term")` only for terms defined on the owning affordance. Unknown terms from a pinned vocabulary should produce `UnknownVocabularyTerm` when accepting them could change behavior. + +`WotFormExtractor` emits a formless descriptor for an affordance with no `forms` array. This intentionally makes strict materialization reject an affordance that has no executable route instead of silently ignoring it. + +### Authoring OPC 10101 target mapping + +[OPC 10101 section 6.5.4](https://reference.opcfoundation.org/specs/OPC-10101/6.5.4) defines generic OPC UA vocabulary terms for annotating Thing Descriptions. [Section 8.2](https://reference.opcfoundation.org/specs/OPC-10101/8.2) demonstrates that the mapping vocabulary is not limited to OPC UA source forms: its example maps properties from a Modbus energy meter into an OPC UA data model. + +The runtime implements the following affordance-level semantics: + +* `uav:mapToNodeId` identifies the exact OPC UA target variable. +* `uav:mapToType` identifies the target variable by its OPC UA `DataType`; resolution requires a unique variable of that type. +* When both are present, the exact node is resolved and its `DataType` must equal `uav:mapToType`. +* `uav:mapByFieldPath` maps a property to a field within a structured target and is valid only together with `uav:mapToType`. +* All three terms belong on a property affordance. Authoring them inside an individual form is invalid, and authoring them on an action or event is invalid. +* Values must be non-empty strings. The registry validates these rules before any protocol planner runs and copies one `WotTargetMappingDescriptor` to every compiled operation for that property. + +This direct mapping is valid because the target term is a sibling of `forms` on the property affordance: + +```json +{ + "properties": { + "temperature": { + "type": "number", + "uav:mapToNodeId": "nsu=urn:example:aggregate;s=Device1.Temperature", + "forms": [ + { + "href": "https://sensor.example.test/temperature", + "op": "readproperty" + } + ] + } + } +} +``` + +A structured mapping puts both type and field path on the property: + +```json +{ + "properties": { + "lineVoltage": { + "type": "number", + "uav:mapToType": "nsu=urn:example:types;s=EnergyMeasurementsType", + "uav:mapByFieldPath": "VoltageL1N", + "forms": [ + { + "href": "modbus+tcp://meter.example.test", + "op": "readproperty", + "modv:entity": "holdingregister", + "modv:address": 100 + } + ] + } + } +} +``` + +Moving any `uav:mapTo*` or `uav:mapByFieldPath` member inside the form object is invalid even if the form uses the OPC UA protocol. + +Use portable `nsu=` NodeIds whenever documents can move between servers whose namespace indexes differ. `WotTargetVariableResolver` parses `uav:mapToNodeId` and `uav:mapToType` with `ExpandedNodeId.Parse(text, builder.Context.NamespaceUris)`, so `nsu=urn:vendor:model;s=Device1.Value` resolves against the materialized generation's namespace table. A numeric `ns=` identifier is valid only when the author controls the target server's namespace-index assignment. + +Target mapping is protocol-neutral. The form can address HTTP, Modbus, MQTT, OPC UA, or a custom protocol while the affordance maps the resulting value to an OPC UA variable. Protocol planners must not parse, reinterpret, or discard `uav:mapToNodeId`, `uav:mapToType`, or `uav:mapByFieldPath`. + +### Planner validation and compiled forms + +Deriving from `WotProtocolBinderBase` provides helpers for common work: + +* `RequireHref` validates presence and `MaxUriLength`. +* `TryParseUri`, `SchemeOf`, `MakeEndpoint`, and `MakeEndpointOrSynthetic` normalize endpoint metadata. +* `ResolveOperations` validates affordance/operation compatibility, filters unsupported operations, and avoids duplicate teardown entries. +* `ResolveCodec` selects a codec and creates `WotPayloadDescriptor`. +* `ResolveSecurity` converts document security definitions into secret-free `WotCredentialReference` values. + +Return `WotBindingCompilation.Unsupported(...)` when the binder cannot produce any valid entry. Return `Supported(entries, diagnostics)` only when entries are non-empty and there are no error diagnostics. The registry treats a compilation with errors as unsupported even if entries were returned. + +Keep `WotCompiledForm` immutable and transport-neutral. Put protocol additions in the `Metadata` dictionaries of `WotEndpointDescriptor`, `WotAddressingDescriptor`, `WotOperationDescriptor`, or `WotPayloadDescriptor`. Do not store open clients, mutable protocol state, credentials, delegates, or disposable resources in a plan. + +A planner can ship without an executor. The registry still validates and compiles its forms but marks its entries non-executable and the non-strict projection degraded. This is the preferred path for landing a validator before the transport runtime is ready. + +### Executors, channels, and disposal + +`IWotBindingExecutor.CanExecute` should reject compiled forms for another identity. `ActivateAsync` receives one immutable compiled form and a `WotExecutorContext`; it returns a live `IWotBindingChannel`. + +The channel implements read, write, invoke, property observation, event subscription, and asynchronous disposal. Unsupported operations return `BadNotSupported` instead of throwing. Transport failures should be translated into deterministic `StatusCode` results; cancellation requested by the caller should normally remain cancellation, while an executor-owned timeout should become `BadTimeout`. + +The projection runtime opens channels lazily. One `WotBindingChannelSlot` is shared for each compiled-form object within a generation, concurrent first use opens exactly once, a failed open is evicted for retry, and one caller's cancellation does not cancel the generation-scoped open for other callers. Disposal marks the slot closed before awaiting an in-flight open, then disposes any successfully created channel. Channel disposal must be idempotent, and subscription disposal must stop delivery and release its transport resources. + +Do not create transport connections in the planner, binder constructor, or DI registration callback unless the executor itself explicitly owns a long-lived pooled client. Prefer an injectable client/session factory in options, as the built-in executors do. + +### Payload codecs + +The default `WotPayloadCodecRegistry` contains reflection-free JSON, text, and octet-stream codecs. A planner records only the codec id and payload metadata; a channel selects the codec from `WotExecutorContext.Codecs` when it encodes or decodes. + +Custom codecs implement `IWotPayloadCodec` and return `WotEncodeResult` or `WotDecodeResult` rather than throwing for expected malformed input. Register custom codecs ahead of the built-ins with `WotPayloadCodecRegistry.Register`, or provide an `IWotCodecRegistry` through DI. Keep codecs deterministic, bounded, culture-invariant, and free of runtime type discovery. + +### Credentials and trust + +Thing Descriptions and registry nodes contain only `WotSecurityDefinition` and `WotCredentialReference` data. Actual headers, query values, usernames, passwords, certificates, and trust anchors are resolved at channel activation or request time through `IWotCredentialProvider`. + +Register a provider with `AddWotCredentialProvider`. Scope credentials by the reference's scheme name, binding URI, and endpoint. Fail closed when a form declares security but the provider cannot resolve the required material. Never serialize `WotCredential`, cache secret text in `WotCompiledForm`, or include secrets in diagnostics. + +### Registration + +The direct-construction path is useful in focused tests: + +```csharp +var store = new MemoryWotStore(); +var registry = new WotProtocolBinderRegistry( + [new MemoryWotBinder()], + [new MemoryWotBindingExecutor(store)]); +``` + +The normal host path uses `IOpcUaBuilder` extensions: + +```csharp +MemoryWotStore store = new(); + +IOpcUaBuilder opcUa = services + .AddOpcUa() + .AddServer(server => { /* server configuration */ }) + .AddWotRegistryServer(options => options.StrictBindings = false); + +opcUa + .AddWotBinder(new MemoryWotBinder()) + .AddWotBindingExecutor(new MemoryWotBindingExecutor(store)) + .AddWotCredentialProvider(NullWotCredentialProvider.Instance); +``` + +`EnsureWotBinderRegistry` registers one `WotProtocolBinderRegistry` singleton and exposes that same instance as both `IWotBinderRegistry` and `IWotBindingChannelFactory`, independent of registration order. A custom binding package should expose one fluent `AddWotBinding` method that creates options, calls `AddWotProtocolBinders` or `AddWotBinder`, and registers its executor. + +### Monitoring and local sampling + +For a target-mapped variable, the generic projection runtime wires executable `readproperty` and `writeproperty` forms to async `OnRead` and `OnWrite` handlers. Local OPC UA monitored items sample that same read handler. An `observeproperty` entry does not create a second upstream observe bridge for target mapping, so a binding must provide a reliable and bounded read operation even when its native protocol also supports push observation. + +Outside target mapping, callers can use `IWotBindingChannel.ObserveAsync` or `SubscribeEventAsync` directly. The returned `IWotSubscription` owns the native subscription or polling loop and must stop it in `DisposeAsync`. + +### Structured target mapping + +Direct mapping reads or writes the whole target value. Structured mapping groups forms by target variable and field path. Reads run all mapped field reads concurrently, build nested `IStructure` instances without reflection, and return one `ExtensionObject`. Writes extract each mapped field and run the field writes concurrently. + +The runtime rejects a target that mixes direct and field mappings, duplicate read mappings for the same field, duplicate write mappings for the same field, and target-mapped operations other than read, write, or observe. A failed field fails the entire structured operation. A successful structured read preserves a non-default Good status when present and uses the oldest available source timestamp. + +Structure type and field-path resolution is delayed until first structured use because runtime NodeSet configuration completes before custom encodeable types are registered in the shared factory. Failed resolution is not cached; later operations retry. Until resolution succeeds, the read or write returns `BadConfigurationError`. + +### Status and error mapping + +Return a `WotReadResult`, `WotWriteResult`, or `WotInvokeResult` for expected protocol outcomes. Reserve exceptions for invalid API use, cancellation, resource construction failures, and conditions that prevent a channel from being opened. + +| Condition | Recommended status | +| --- | --- | +| Unsupported channel operation | `BadNotSupported` | +| Payload encode/decode failure | `BadEncodingError` / `BadDecodingError` | +| Executor-owned timeout | `BadTimeout` | +| Network or broker failure | `BadCommunicationError` | +| Missing protocol target | `BadNodeIdUnknown` or a protocol-specific mapped status | +| Invalid compiled address | `BadNodeIdInvalid` or `BadInvalidArgument` | +| Authentication or authorization rejection | `BadUserAccessDenied` | +| Response exceeds configured bounds | `BadEncodingLimitsExceeded` | +| Invalid runtime mapping or structured configuration | `BadConfigurationError` | + +Preserve a source protocol's meaningful OPC UA status and timestamps when the source is OPC UA. Do not expose credentials or stack traces through `Error`; use concise operator-safe text and server-side telemetry for detailed exceptions. + +### Memory-binding implementation + +The following excerpt is the checked-in sample implementation pattern. It supports `mem://` property read, write, and polling-based observation. Use the linked source file as the authoritative copy if this excerpt is trimmed in rendered documentation. + +```csharp +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Bindings; + +namespace AggregationServer +{ + /// + /// A worked sample showing how a third party contributes a replaceable + /// protocol binder as pure code-behind. The fictitious mem protocol + /// binds property affordances to an in-process key/value store, demonstrating + /// the full extension surface: identity, capability, deterministic + /// identification, a planner and an executor with a live channel. Register it + /// with builder.AddWotBinder(new MemoryWotBinder()) and + /// builder.AddWotBindingExecutor(new MemoryWotBindingExecutor(store)). + /// + public sealed class MemoryWotBinder : WotProtocolBinderBase + { + /// + /// The sample binding vocabulary URI. + /// + public const string BindingUri = "urn:example:wot:mem"; + + private static readonly string[] s_schemes = ["mem"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("example.mem", "1.0", BindingUri, "Sample In-Memory Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "Sample In-Memory Binding", + new WotBindingSource("urn:example:wot:mem", "1.0", WotBindingMaturity.UnofficialDraft, + note: "A sample custom binding for documentation and tests."), + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty + ], + ["application/json", "text/plain"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "memv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href) || + !TryParseUri(href, out Uri uri) || + !string.Equals(uri.Scheme, "mem", StringComparison.OrdinalIgnoreCase)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid mem:// URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string key = uri.AbsolutePath.Trim('/'); + ResolveCodec(form, context, out WotPayloadDescriptor payload); + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor(key); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, capability.ToString()); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + return entries.Count == 0 + ? WotBindingCompilation.Unsupported([.. diagnostics]) + : WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + } + + /// + /// The in-process key/value store the sample binding reads and writes. + /// + public sealed class MemoryWotStore + { + /// + /// Gets the value stored under a key. + /// + public DataValue Get(string key) + { + return m_values.TryGetValue(key, out DataValue value) ? value : new DataValue(Variant.Null); + } + + /// + /// Sets the value stored under a key. + /// + public void Set(string key, DataValue value) + { + m_values[key] = value; + } + + private readonly ConcurrentDictionary m_values = + new(StringComparer.Ordinal); + } + + /// + /// The executor for the sample in-memory binding. + /// + public sealed class MemoryWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new sample executor over the supplied store. + /// + public MemoryWotBindingExecutor(MemoryWotStore store) + { + m_store = store ?? throw new ArgumentNullException(nameof(store)); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("example.mem", "1.0", MemoryWotBinder.BindingUri, "Sample In-Memory Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + return form is not null && string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal); + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "The channel is owned by the caller, who disposes it via DisposeAsync.")] + public ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + IWotBindingChannel channel = new MemoryWotBindingChannel(m_store, form); + return new ValueTask(channel); + } + + private readonly MemoryWotStore m_store; + } + + /// + /// The live channel for the sample in-memory binding. + /// + internal sealed class MemoryWotBindingChannel : IWotBindingChannel + { + public MemoryWotBindingChannel(MemoryWotStore store, WotCompiledForm form) + { + m_store = store; + Form = form; + m_key = form.Addressing.Target; + } + + public WotCompiledForm Form { get; } + + public ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + return new ValueTask(new WotReadResult(StatusCodes.Good, m_store.Get(m_key))); + } + + public ValueTask WriteAsync(DataValue value, CancellationToken cancellationToken = default) + { + m_store.Set(m_key, value); + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + } + + public ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + return new ValueTask(new WotInvokeResult( + StatusCodes.BadNotSupported, null, "The sample binding has no actions.")); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller, who disposes it.")] + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + var subscription = new PollingWotSubscription(Form, token => + { + onNotification(new WotNotification(m_store.Get(m_key))); + return new ValueTask(true); + }, TimeSpan.FromMilliseconds(200)); + return new ValueTask(subscription); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + return ObserveAsync(onEvent, cancellationToken); + } + + public ValueTask DisposeAsync() + { + return default; + } + + private readonly MemoryWotStore m_store; + private readonly string m_key; + } +} +``` + +### Memory-binding tests + +The positive test compiles a TD, selects the generated read and write entries, opens channels through the registry, and verifies round-trip behavior: + +```csharp +[Test] +public async Task SampleBinderCompilesAndExecutesReadWrite() +{ + var store = new MemoryWotStore(); + var registry = new WotProtocolBinderRegistry( + [new MemoryWotBinder()], + [new MemoryWotBindingExecutor(store)]); + + const string td = + """ + { + "@context": "https://www.w3.org/2022/wot/td/v1.1", + "title": "Memory device", + "properties": { + "setpoint": { + "type": "number", + "forms": [{ "href": "mem://store/setpoint" }] + } + } + } + """; + + WotBindingPlan plan = registry.Prepare( + WotBindingPlanRequest.FromDocument( + "memory-device", + WoTDocumentKindEnum.ThingDescription, + Encoding.UTF8.GetBytes(td))); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.HasExecutableForms, Is.True); + + WotCompiledForm write = plan.CompiledForms.Single( + form => form.Operation == WoTBindingCapabilityEnum.WriteProperty); + WotCompiledForm read = plan.CompiledForms.Single( + form => form.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write); + await using (writeChannel.ConfigureAwait(false)) + { + WotWriteResult result = await writeChannel.WriteAsync( + new DataValue(new Variant(42.5))); + Assert.That(result.Success, Is.True); + } + + IWotBindingChannel readChannel = await registry.OpenChannelAsync(read); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult result = await readChannel.ReadAsync(); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(42.5)); + } +} +``` + +Add a diagnostic test so malformed input remains actionable: + +```csharp +[Test] +public void SampleBinderReportsInvalidHrefAtTheFormPointer() +{ + var registry = new WotProtocolBinderRegistry( + [new MemoryWotBinder()]); + + const string td = + """ + { + "title": "Invalid memory device", + "properties": { + "setpoint": { + "forms": [{ "href": "mem://[invalid" }] + } + } + } + """; + + WotBindingPlan plan = registry.Prepare( + WotBindingPlanRequest.FromDocument( + "invalid-memory-device", + WoTDocumentKindEnum.ThingDescription, + Encoding.UTF8.GetBytes(td))); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidHref && + d.JsonPointer == "/properties/setpoint/forms/0/href"), + Is.True); +} +``` + +The checked-in equivalent is [`WotCustomBinderSampleTests.cs`](../tests/Opc.Ua.WotCon.Tests/Binding/WotCustomBinderSampleTests.cs). Protocol executor tests belong in [`tests/Opc.Ua.WotCon.Bindings.Tests`](../tests/Opc.Ua.WotCon.Bindings.Tests), while planner, registry, target-mapping, and materialization tests belong in [`tests/Opc.Ua.WotCon.Tests`](../tests/Opc.Ua.WotCon.Tests). + +### NativeAOT and trimming + +Binding code must remain compatible with trimming and NativeAOT. Parse form vocabulary with `JsonElement`; do not use runtime assembly scanning, unbounded reflection, `Type.GetType`, dynamic code generation, or serializer overloads that require runtime metadata. Use source-generated JSON contexts when a protocol needs typed JSON beyond the built-in scalar codec. + +Keep plan objects data-only and immutable. Inject transport factories and credential providers instead of locating services dynamically. Ensure asynchronous cleanup does not depend on finalizers. If a dependency is not annotated as AOT-compatible, add a NativeAOT smoke path that exercises every used feature. + +The base Bindings project sets `IsAotCompatible` for compatible `net10.0` builds, and the aggregation samples publish with `PublishAot` on `net10.0`. Validate a new concrete executor with a `net10.0` build and, when it participates in a sample or app, a real `dotnet publish -f net10.0 -r `. + +### Packaging and TFM decisions + +Keep protocol abstractions and planners in the base Bindings project when they can compile across the full library matrix without a transport dependency. Place a concrete executor in the base project only when its dependencies are already suitable for the bundled `net8.0+` build, as with HTTP, Modbus TCP, and OPC UA. Use a separate package when the executor introduces an optional external dependency, as MQTT does. + +Conditionally exclude executor source on older TFMs rather than reducing the base package's TFM matrix. Public documentation and package README files must state both facts: the package is available on all library TFMs, and the concrete executor namespaces exist only on `net8.0+`. + +### Contributor checklist + +- [ ] Use plural `Opc.Ua.WotCon.Bindings` project, package, and namespace names. +- [ ] Pin an authoritative binding source and version in `WotBindingSource`. +- [ ] Choose a stable binder id, version, binding URI, display name, and capability set. +- [ ] Implement deterministic identification and verify tie/pin behavior. +- [ ] Validate required vocabulary, conflicts, bounds, operations, content types, and security references without transport I/O. +- [ ] Emit immutable compiled forms with precise endpoint, address, operation, payload, credential, and JSON Pointer data. +- [ ] Leave OPC 10101 target mapping to the protocol-neutral registry/runtime. +- [ ] Implement an executor only for operations the transport can actually perform. +- [ ] Map expected failures to OPC UA status codes and keep caller cancellation distinct from executor timeout. +- [ ] Resolve credentials out of band and verify that diagnostics never contain secrets. +- [ ] Make channels, subscriptions, and in-flight activation safe under asynchronous disposal. +- [ ] Register direct-construction and DI/fluent paths. +- [ ] Add planner, diagnostics, executor, concurrency, disposal, and security tests. +- [ ] Test local monitored-item sampling when the binding is used through target mapping. +- [ ] Test direct and structured mappings when the protocol is intended for aggregation. +- [ ] Verify all supported TFMs, `net10.0` trimming/AOT behavior, package contents, and README accuracy. + +### Testing matrix + +| Area | Required cases | +| --- | --- | +| Identification | Scheme match, vocabulary match, explicit pin, no match, deterministic tie, multiple binder versions. | +| Form extraction | Default operations, form operation override, Thing-level security fallback, relative/base URI behavior if supported, formless affordance. | +| Planner validation | Valid form, missing/invalid href, incompatible operation, unsupported content type, missing term, invalid term shape/range, conflicting terms, configured bounds. | +| Diagnostics | Stable code, severity, offending term, exact RFC 6901 form or affordance pointer, no secret leakage. | +| Compiled plan | Endpoint, addressing, operation, payload, security references, target mapping, executable/non-executable state. | +| Codec | Encode/decode round trip, malformed payload, empty payload, maximum payload, culture independence. | +| Credentials | No-security path, missing required credential, correct endpoint scoping, secure transport, explicit rejection of unsafe downgrade. | +| Executor | Read, write, invoke, observe, event, every intentionally unsupported operation, source status/timestamp preservation. | +| Failure mapping | Timeout, cancellation, connection loss, protocol error, encode/decode failure, authentication failure, oversized response. | +| Concurrency | Concurrent first channel use opens once, failed open retries, parallel operations obey transport rules. | +| Disposal | Never-opened channel, successfully opened channel, failed open, in-flight open racing disposal, subscription partial-construction failure, repeated disposal. | +| Target mapping | Affordance-level direct mapping, `nsu=` mapping, forms-level rejection, action/event rejection, field path requires type, direct/field conflict, duplicate field direction. | +| Structured mapping | Nested fields, unknown field, non-structure intermediate, array-valued intermediate, one failed field, status/timestamp aggregation. | +| Materialization | Strict rejection, non-strict degradation, successful activation, failed shadow replacement retaining old generation, old monitored-item drain. | +| Packaging | Full base TFM matrix, executor source absent before `net8.0`, MQTT separate package, package README and dependency graph. | +| AOT/trimming | `net10.0` analyzer-clean build and NativeAOT publish/run smoke test for the concrete executor path. | + +## Related documentation + +* [WoT Connectivity model, server, registry, and client](WoTConnectivity.md) +* [WoT aggregation sample](../samples/WotCon/README.md) - exercises the complete generic projection runtime with two OPC UA source servers, runtime-loaded DI/Machinery/Pumps models, local monitored items, and shadow-generation replacement. +* [Dependency injection](DependencyInjection.md) +* [Runtime NodeSets](RuntimeNodeSets.md) diff --git a/docs/XRegistry.md b/docs/XRegistry.md index 905a189564..ce295b6ba0 100644 --- a/docs/XRegistry.md +++ b/docs/XRegistry.md @@ -174,7 +174,7 @@ public sealed class MyResourceStore : IXRegistryResourceStore } public ValueTask WriteAsync( - string resourceKey, long offset, ReadOnlyMemory data, CancellationToken ct = default) + string resourceKey, long offset, ByteString data, CancellationToken ct = default) { // Random access: the chunk may land anywhere. Writing past the end grows the document and // the gap reads back as zeros; writing at 0 does *not* truncate what follows. @@ -217,6 +217,11 @@ Two rules make a store substitutable: The contract is exercised by `XRegistryResourceStoreContractTests`; deriving a fixture from it is the quickest way to validate a new implementation. +`Opc.Ua.WotCon.Server` is a worked example: `WotBlobResourceStore` implements this interface over +the `{root}/{digest}.bin` layout the WoT registry has always written, so a domain registry can adopt +the shared byte layer without an on-disk migration. See +[WoT Connectivity — keeping the document bytes in a shared store](WoTConnectivity.md#keeping-the-document-bytes-in-a-shared-store). + ### Transport security Registry **writes always require a `SignAndEncrypt` secure channel**. A document and its @@ -411,6 +416,39 @@ hierarchy (`SchemaFileTypeClient : ResourceTypeClient : FileTypeClient`). Two th of the base type. Discovery must be subtype-aware (browse with `includeSubtypes`, test with `IsTypeOf`) rather than comparing TypeDefinition NodeIds for equality. +#### Registry roots that are not well-known + +`XRegistryWellKnown.RegistryObject` (`65000`) is *provisional*, and a domain registry generally +declares its own root instead — the WoT Connectivity registry publishes `WoTRegistry` as a +`HasComponent` child of the `Server` object, which a client discovers by Browse. Pass the resolved +NodeId to the constructor so the root is a construction-time input that cannot subsequently drift: + +```csharp +public sealed class WotRegistryClient : XRegistryClient +{ + public WotRegistryClient(ISession session, NodeId registryObjectId, ITelemetryContext telemetry) + : base(session, Namespaces.WotCon, registryObjectId, telemetry) + { + Proxy = new WoTRegistryTypeClient(session, registryObjectId, telemetry); + } +} +``` + +`RegistryNodeId` then reports that root, and every inherited lifecycle method targets it. Passing a +null NodeId selects the well-known root, so the overload stays equivalent to the namespace-only +constructor. `GenericXRegistryClient` exposes the same overload, so a caller can drive a domain +registry without deriving a client at all: + +```csharp +var registry = new GenericXRegistryClient( + session, Namespaces.WotCon, wotRegistryNodeId, telemetry); +``` + +`Opc.Ua.WotCon.Client` is the worked example: `WotRegistryClient` derives from `XRegistryClient`, +inherits `Session`, `RegistryNodeId` and the group/resource lifecycle, and adds only WoT-specific +surface — the `ForServerAsync` Browse resolution, the reserved Thing Description / Thing Model +groups, a typed `Refresh` result and a dependency-ordered bulk load. + ## Well-known identifiers `XRegistryWellKnown` carries the base companion namespace URI and the provisional NodeIds a generic diff --git a/samples/Quickstarts.Servers/SampleNodeManager/SampleNodeManager.cs b/samples/Quickstarts.Servers/SampleNodeManager/SampleNodeManager.cs index 7a8c57560d..96a9edcdc9 100644 --- a/samples/Quickstarts.Servers/SampleNodeManager/SampleNodeManager.cs +++ b/samples/Quickstarts.Servers/SampleNodeManager/SampleNodeManager.cs @@ -3108,15 +3108,19 @@ protected virtual void OnDeleteMonitoredItem( /// The set of monitoring items to update. /// The list of bool with items that were already processed. /// Any errors. + /// Options that describe the transfer execution. public virtual void TransferMonitoredItems( OperationContext context, bool sendInitialValues, IList monitoredItems, IList processedItems, - IList errors) + IList errors, + MonitoredItemTransferOptions? transferOptions = null) { ServerSystemContext systemContext = SystemContext.Copy(context); IList transferredItems = []; + bool deferInitialValues = transferOptions?.DeferInitialValues + ?? MonitoredItemTransferExecution.DeferInitialValues; lock (Lock) { for (int ii = 0; ii < monitoredItems.Count; ii++) @@ -3138,7 +3142,7 @@ public virtual void TransferMonitoredItems( processedItems[ii] = true; transferredItems.Add(monitoredItems[ii]); - if (sendInitialValues) + if (sendInitialValues && !deferInitialValues) { monitoredItems[ii].SetupResendDataTrigger(); } @@ -3150,6 +3154,46 @@ public virtual void TransferMonitoredItems( OnMonitoredItemsTransferred(systemContext, transferredItems); } + /// + /// Rolls back side effects produced by a failed monitored-item transfer. + /// + /// The source context to restore. + /// The set of monitoring items to roll back. + /// The list of bool with items that were already processed. + /// Any errors. + /// Options that describe the transfer execution. + public virtual void RollbackMonitoredItemsTransfer( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null) + { + ServerSystemContext systemContext = SystemContext.Copy(context); + IList rolledBackItems = []; + lock (Lock) + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (processedItems[ii] || monitoredItems[ii] == null) + { + continue; + } + + if (monitoredItems[ii].ManagerHandle is not MonitoredNode) + { + continue; + } + + processedItems[ii] = true; + rolledBackItems.Add(monitoredItems[ii]); + errors[ii] = StatusCodes.Good; + } + } + + OnMonitoredItemsTransferRolledBack(systemContext, rolledBackItems); + } + /// /// Called after transfer of MonitoredItems. /// @@ -3162,6 +3206,18 @@ protected virtual void OnMonitoredItemsTransferred( // overridden by the sub-class. } + /// + /// Called after rollback of a failed monitored-item transfer. + /// + /// The source context restored by rollback. + /// The monitored items rolled back. + protected virtual void OnMonitoredItemsTransferRolledBack( + ServerSystemContext context, + IList monitoredItems) + { + // overridden by the sub-class. + } + /// /// Changes the monitoring mode for a set of monitored items. /// diff --git a/samples/WotCon/AggregationClient/AggregationClient.csproj b/samples/WotCon/AggregationClient/AggregationClient.csproj new file mode 100644 index 0000000000..9917796bba --- /dev/null +++ b/samples/WotCon/AggregationClient/AggregationClient.csproj @@ -0,0 +1,28 @@ + + + $(AppTargetFrameworks) + Exe + false + AggregationClient + AggregationClient + OPC Foundation + OPC UA WoT aggregation document loader and reader sample. + Copyright © 2004-2026 OPC Foundation, Inc + enable + true + + + + + + + + + + + + + PreserveNewest + + + diff --git a/samples/WotCon/AggregationClient/AggregationClientModels.cs b/samples/WotCon/AggregationClient/AggregationClientModels.cs new file mode 100644 index 0000000000..35e60d7f89 --- /dev/null +++ b/samples/WotCon/AggregationClient/AggregationClientModels.cs @@ -0,0 +1,190 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using Opc.Ua; +using Opc.Ua.WotCon.Client; + +namespace AggregationClient +{ + /// + /// Configures the reusable aggregation loader and reader workflow. + /// + public sealed class AggregationClientOptions + { + /// + /// Gets or sets the aggregation server endpoint. + /// + public string AggregationEndpoint { get; set; } = + "opc.tcp://localhost:62550/AggregationServer"; + + /// + /// Gets or sets the Source A endpoint substituted into the Pump TD. + /// + public string SourceAEndpoint { get; set; } = + "opc.tcp://localhost:62551/SourceA"; + + /// + /// Gets or sets the Source B endpoint substituted into the Pump TD. + /// + public string SourceBEndpoint { get; set; } = + "opc.tcp://localhost:62552/SourceB"; + + /// + /// Gets or sets the OPC UA application name. + /// + public string ApplicationName { get; set; } = "AggregationClient"; + + /// + /// Gets or sets the isolated PKI root. + /// + public string? PkiRoot { get; set; } + + /// + /// Gets or sets the directory containing documents.json and its documents. + /// + public string DocumentsDirectory { get; set; } = + System.IO.Path.Combine(System.AppContext.BaseDirectory, "Documents"); + } + + /// + /// Result of loading, refreshing, browsing and reading the aggregate Pump. + /// + public sealed class AggregationClientResult + { + /// + /// Initializes a result. + /// + public AggregationClientResult( + WotRegistryBulkLoadResult loadResult, + ArrayOf browsedNodes, + ArrayOf values) + { + LoadResult = loadResult; + BrowsedNodes = browsedNodes; + Values = values; + } + + /// + /// Gets the document load and refresh result. + /// + public WotRegistryBulkLoadResult LoadResult { get; } + + /// + /// Gets the recursively browsed Pump nodes. + /// + public ArrayOf BrowsedNodes { get; } + + /// + /// Gets the values read from the materialized Pump. + /// + public ArrayOf Values { get; } + } + + /// + /// Describes one node found while browsing the materialized Pump. + /// + public sealed class WotPumpBrowseNode + { + /// + /// Initializes a browse result. + /// + public WotPumpBrowseNode( + NodeId nodeId, + QualifiedName browseName, + LocalizedText displayName, + NodeClass nodeClass) + { + NodeId = nodeId; + BrowseName = browseName; + DisplayName = displayName; + NodeClass = nodeClass; + } + + /// + /// Gets the node id. + /// + public NodeId NodeId { get; } + + /// + /// Gets the browse name. + /// + public QualifiedName BrowseName { get; } + + /// + /// Gets the display name. + /// + public LocalizedText DisplayName { get; } + + /// + /// Gets the node class. + /// + public NodeClass NodeClass { get; } + } + + /// + /// Contains one materialized Pump value. + /// + public sealed class WotPumpValueResult + { + /// + /// Initializes a value result. + /// + public WotPumpValueResult( + string name, + NodeId nodeId, + StatusCode statusCode, + Variant value) + { + Name = name; + NodeId = nodeId; + StatusCode = statusCode; + Value = value; + } + + /// + /// Gets the stable property name. + /// + public string Name { get; } + + /// + /// Gets the materialized node id. + /// + public NodeId NodeId { get; } + + /// + /// Gets the read status. + /// + public StatusCode StatusCode { get; } + + /// + /// Gets the read value. + /// + public Variant Value { get; } + } +} diff --git a/samples/WotCon/AggregationClient/AggregationClientRunner.cs b/samples/WotCon/AggregationClient/AggregationClientRunner.cs new file mode 100644 index 0000000000..d73295ff32 --- /dev/null +++ b/samples/WotCon/AggregationClient/AggregationClientRunner.cs @@ -0,0 +1,504 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Opc.Ua; +using Opc.Ua.Client; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Client; + +namespace AggregationClient +{ + /// + /// Executes the real sample loader and reader workflow in process. + /// + public static class AggregationClientRunner + { + /// + /// Builds the client host used by the workflow. + /// + public static IHost BuildHost(AggregationClientOptions options) + { + Validate(options); + HostApplicationBuilder builder = Host.CreateApplicationBuilder(); + builder.Logging.ClearProviders(); + builder.Logging.AddConsole(); + builder.Logging.SetMinimumLevel(LogLevel.Warning); + builder.Services + .AddOpcUa() + .AddOpcTcpTransport() + .AddClient(client => + { + client.ApplicationName = options.ApplicationName; + client.ApplicationUri = + $"urn:localhost:OPCFoundation:{options.ApplicationName}"; + client.ProductUri = "uri:opcfoundation.org:AggregationClient"; + if (!string.IsNullOrWhiteSpace(options.PkiRoot)) + { + client.PkiRoot = options.PkiRoot; + } + client.AutoAcceptUntrustedCertificates = true; + client.Session = new ManagedSessionOptions + { + SessionName = "AggregationClient", + SessionTimeout = TimeSpan.FromSeconds(60) + }; + }) + .AddDiscoveryAndConnect(discovery => + { + discovery.DiscoveryUrl = options.AggregationEndpoint; + discovery.SecurityMode = MessageSecurityMode.None; + discovery.SecurityPolicyUri = SecurityPolicies.None; + }) + .AddWotRegistryClient(); + return builder.Build(); + } + + /// + /// Loads the four documents, refreshes the registry and reads the Pump. + /// + public static async Task RunAsync( + AggregationClientOptions options, + CancellationToken cancellationToken = default) + { + using IHost host = BuildHost(options); + await host.StartAsync(cancellationToken).ConfigureAwait(false); + try + { + Func> connect = + host.Services.GetRequiredService< + Func>>(); + ManagedSession session = await connect(cancellationToken).ConfigureAwait(false); + await using (session.ConfigureAwait(false)) + { + session.MessageContext.NamespaceUris.Update( + session.NamespaceUris.ToArray()); + Func> createClient = + host.Services.GetRequiredService< + Func>>(); + WotRegistryClient client = await createClient(session, cancellationToken) + .ConfigureAwait(false); + ArrayOf documents = await LoadDocumentsAsync( + options, + cancellationToken).ConfigureAwait(false); + WotRegistryBulkLoadResult loadResult = await client.LoadDocumentsAsync( + documents, + refresh: true, + requestId: Guid.NewGuid().ToString("N"), + ct: cancellationToken).ConfigureAwait(false); + EnsureRefreshSucceeded(loadResult); + await session.FetchNamespaceTablesAsync(cancellationToken).ConfigureAwait(false); + session.MessageContext.NamespaceUris.Update( + session.NamespaceUris.ToArray()); + + NodeId pumpNodeId = ResolvePumpNodeId(session); + ArrayOf browsedNodes = await BrowsePumpAsync( + session, + pumpNodeId, + cancellationToken).ConfigureAwait(false); + ArrayOf values = await ReadPumpValuesAsync( + session, + cancellationToken).ConfigureAwait(false); + return new AggregationClientResult(loadResult, browsedNodes, values); + } + } + finally + { + await host.StopAsync(cancellationToken).ConfigureAwait(false); + } + } + + private static async ValueTask> LoadDocumentsAsync( + AggregationClientOptions options, + CancellationToken cancellationToken) + { + string manifestPath = Path.Combine(options.DocumentsDirectory, "documents.json"); + string manifestText = await ReadTextAsync(manifestPath, cancellationToken) + .ConfigureAwait(false); + using var manifest = JsonDocument.Parse(manifestText); + var entries = new List(); + foreach (JsonElement item in manifest.RootElement.EnumerateArray()) + { + var dependencies = new List(); + foreach (JsonElement dependency in item.GetProperty("dependsOn").EnumerateArray()) + { + dependencies.Add(dependency.GetString() ?? + throw new InvalidDataException("A dependency id is required.")); + } + + entries.Add(new ManifestEntry( + item.GetProperty("documentKind").GetString() ?? + throw new InvalidDataException("Document kind is required."), + item.GetProperty("groupId").GetString() ?? + throw new InvalidDataException("Group id is required."), + item.GetProperty("path").GetString() ?? + throw new InvalidDataException("Document path is required."), + item.GetProperty("resourceId").GetString() ?? + throw new InvalidDataException("Resource id is required."), + dependencies)); + } + + List ordered = OrderByDependencies(entries); + var documents = new WotRegistryDocument[ordered.Count]; + for (int i = 0; i < ordered.Count; i++) + { + ManifestEntry entry = ordered[i]; + string content = await ReadTextAsync( + Path.Combine(options.DocumentsDirectory, entry.Path), + cancellationToken).ConfigureAwait(false); + WoTDocumentKindEnum kind = ParseKind(entry.DocumentKind); + if (kind == WoTDocumentKindEnum.ThingDescription && + string.Equals(entry.Path, "SamplePump.td.json", StringComparison.Ordinal)) + { +#if NET8_0_OR_GREATER + content = content + .Replace( + "${SOURCE_A_ENDPOINT}", + options.SourceAEndpoint, + StringComparison.Ordinal) + .Replace( + "${SOURCE_B_ENDPOINT}", + options.SourceBEndpoint, + StringComparison.Ordinal); +#else + content = content + .Replace("${SOURCE_A_ENDPOINT}", options.SourceAEndpoint) + .Replace("${SOURCE_B_ENDPOINT}", options.SourceBEndpoint); +#endif + } + + documents[i] = new WotRegistryDocument( + kind, + entry.GroupId, + entry.ResourceId, + ByteString.From(Encoding.UTF8.GetBytes(content))); + } + return new ArrayOf(documents); + } + + private static void EnsureRefreshSucceeded(WotRegistryBulkLoadResult loadResult) + { + WotRegistryRefreshResult refresh = loadResult.Refresh ?? + throw new InvalidOperationException("The registry refresh did not run."); + if (!refresh.HasFailures) + { + return; + } + + var details = new List(); + foreach (WoTResourceLoadResultDataType resource in refresh.Results) + { + if (resource.Outcome is WoTOutcomeEnum.Failed or WoTOutcomeEnum.Rejected) + { + details.Add( + $"{resource.ResourceId}: {resource.Phase}/{resource.Outcome}: " + + resource.Message); + } + } + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + string.Join("; ", details)); + } + + private static List OrderByDependencies(List entries) + { + var byId = new Dictionary(StringComparer.Ordinal); + foreach (ManifestEntry entry in entries) + { + if (!byId.TryAdd(entry.ResourceId, entry)) + { + throw new InvalidDataException( + $"Duplicate resource id '{entry.ResourceId}' in documents.json."); + } + } + + var ordered = new List(entries.Count); + var completed = new HashSet(StringComparer.Ordinal); + while (ordered.Count < entries.Count) + { + bool progressed = false; + foreach (ManifestEntry entry in entries) + { + if (completed.Contains(entry.ResourceId) || + !DependenciesSatisfied(entry, completed, byId)) + { + continue; + } + ordered.Add(entry); + completed.Add(entry.ResourceId); + progressed = true; + } + if (!progressed) + { + throw new InvalidDataException( + "documents.json contains a missing or cyclic dependency."); + } + } + return ordered; + } + + private static bool DependenciesSatisfied( + ManifestEntry entry, + HashSet completed, + Dictionary byId) + { + foreach (string dependency in entry.DependsOn) + { + if (!byId.ContainsKey(dependency) || !completed.Contains(dependency)) + { + return false; + } + } + return true; + } + + private static WoTDocumentKindEnum ParseKind(string kind) + { + return kind switch + { + "ThingModel" => WoTDocumentKindEnum.ThingModel, + "ThingDescription" => WoTDocumentKindEnum.ThingDescription, + _ => throw new InvalidDataException($"Unsupported document kind '{kind}'.") + }; + } + + private static NodeId ResolvePumpNodeId(ManagedSession session) + { + const string pumpNamespace = + "urn:opcfoundation.org:UA:WotAggregation:PumpInstance"; + ushort namespaceIndex = ResolveRequiredNamespaceIndex( + session.NamespaceUris, + pumpNamespace); + return new NodeId("Pump1", namespaceIndex); + } + + private static async ValueTask> BrowsePumpAsync( + ManagedSession session, + NodeId pumpNodeId, + CancellationToken cancellationToken) + { + var browser = new Browser(session) + { + BrowseDirection = BrowseDirection.Forward, + NodeClassMask = (uint)NodeClass.Object | (uint)NodeClass.Variable, + ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HierarchicalReferences, + IncludeSubtypes = true + }; + var pending = new Queue(); + var visited = new HashSet(); + var nodes = new List(); + pending.Enqueue(pumpNodeId); + visited.Add(pumpNodeId); + while (pending.Count > 0) + { + NodeId parent = pending.Dequeue(); + ArrayOf references = await browser.BrowseAsync( + parent, + cancellationToken).ConfigureAwait(false); + foreach (ReferenceDescription reference in references) + { + var nodeId = ExpandedNodeId.ToNodeId( + reference.NodeId, + session.NamespaceUris); + nodes.Add(new WotPumpBrowseNode( + nodeId, + reference.BrowseName, + reference.DisplayName, + reference.NodeClass)); + if (reference.NodeClass == NodeClass.Object && visited.Add(nodeId)) + { + pending.Enqueue(nodeId); + } + } + } + return nodes.ToArray().ToArrayOf(); + } + + private static async ValueTask> ReadPumpValuesAsync( + ManagedSession session, + CancellationToken cancellationToken) + { + const string pumpNamespace = + "urn:opcfoundation.org:UA:WotAggregation:PumpInstance"; + ushort namespaceIndex = ResolveRequiredNamespaceIndex( + session.NamespaceUris, + pumpNamespace); + (string Name, string Path)[] definitions = + [ + ("DifferentialPressure", "Operational.Measurements.DifferentialPressure"), + ("FluidTemperature", "Operational.Measurements.FluidTemperature"), + ("BearingTemperature", "Operational.Measurements.BearingTemperature"), + ("PumpPowerInput", "Operational.Measurements.PumpPowerInput"), + ("MassFlow", "Operational.Measurements.MassFlow"), + ("PumpEfficiency", "Operational.Measurements.PumpEfficiency"), + ("Level", "Operational.Measurements.Level"), + ("NumberOfStarts", "Operational.Measurements.NumberOfStarts"), + ("Cavitation", "Events.SupervisionProcessFluid.Cavitation"), + ("MotorOverheat", "Events.SupervisionPumpOperation.MotorOverheat") + ]; + var nodesToRead = new ReadValueId[definitions.Length]; + for (int i = 0; i < definitions.Length; i++) + { + nodesToRead[i] = new ReadValueId + { + NodeId = new NodeId($"Pump1.{definitions[i].Path}", namespaceIndex), + AttributeId = Attributes.Value + }; + } + + ReadResponse response = await session.ReadAsync( + null, + 0, + TimestampsToReturn.Both, + new ArrayOf(nodesToRead), + cancellationToken).ConfigureAwait(false); + var values = new WotPumpValueResult[definitions.Length]; + for (int i = 0; i < definitions.Length; i++) + { + DataValue value = response.Results[i]; + if (StatusCode.IsBad(value.StatusCode)) + { + throw new ServiceResultException( + value.StatusCode, + $"Reading materialized Pump value '{definitions[i].Name}' failed."); + } + values[i] = new WotPumpValueResult( + definitions[i].Name, + nodesToRead[i].NodeId, + value.StatusCode, + value.WrappedValue); + } + return new ArrayOf(values); + } + + private static ushort ResolveRequiredNamespaceIndex( + NamespaceTable namespaceUris, + string namespaceUri) + { + int namespaceIndex = namespaceUris.GetIndex(namespaceUri); + if (namespaceIndex < 0) + { + throw new ServiceResultException( + StatusCodes.BadNodeIdUnknown, + $"The materialized namespace '{namespaceUri}' is not present on the server."); + } + return checked((ushort)namespaceIndex); + } + + private static async Task ReadTextAsync( + string path, + CancellationToken cancellationToken) + { + using var stream = new FileStream( + path, + FileMode.Open, + FileAccess.Read, + FileShare.Read, + 4096, + useAsync: true); + if (stream.Length > int.MaxValue) + { + throw new IOException($"Document '{path}' is too large."); + } + byte[] bytes = new byte[(int)stream.Length]; + int offset = 0; + while (offset < bytes.Length) + { +#if NET8_0_OR_GREATER + int read = await stream.ReadAsync( + bytes.AsMemory(offset, bytes.Length - offset), + cancellationToken).ConfigureAwait(false); +#else + int read = await stream.ReadAsync( + bytes, + offset, + bytes.Length - offset, + cancellationToken).ConfigureAwait(false); +#endif + if (read == 0) + { + throw new EndOfStreamException($"Document '{path}' ended unexpectedly."); + } + offset += read; + } + return Encoding.UTF8.GetString(bytes); + } + + private static void Validate(AggregationClientOptions options) + { + if (options is null) + { + throw new ArgumentNullException(nameof(options)); + } + if (string.IsNullOrWhiteSpace(options.AggregationEndpoint) || + string.IsNullOrWhiteSpace(options.SourceAEndpoint) || + string.IsNullOrWhiteSpace(options.SourceBEndpoint) || + string.IsNullOrWhiteSpace(options.DocumentsDirectory)) + { + throw new ArgumentException("All client endpoint and document options are required."); + } + } + + private sealed class ManifestEntry + { + public ManifestEntry( + string documentKind, + string groupId, + string path, + string resourceId, + List dependsOn) + { + DocumentKind = documentKind; + GroupId = groupId; + Path = path; + ResourceId = resourceId; + DependsOn = dependsOn; + } + + public string DocumentKind { get; } + + public string GroupId { get; } + + public string Path { get; } + + public string ResourceId { get; } + + public List DependsOn { get; } + } + } +} diff --git a/samples/WotCon/AggregationClient/Documents/Opc.Ua.Di.tm.json b/samples/WotCon/AggregationClient/Documents/Opc.Ua.Di.tm.json new file mode 100644 index 0000000000..5a391241be --- /dev/null +++ b/samples/WotCon/AggregationClient/Documents/Opc.Ua.Di.tm.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/2022/wot/td/v1.1",{"ns1":"http://opcfoundation.org/UA/DI/","ua":"http://opcfoundation.org/UA/","uav":"http://opcfoundation.org/UA/WoT-Binding/"}],"@type":["tm:ThingModel","uav:objectType"],"description":"Defines the basic information components for all configurable elements in a device topology","title":"OPC UA Device Integration","uav:browseName":"ns1:TopologyElementType","uav:id":"nsu=http://opcfoundation.org/UA/DI/;i=1001","uav:nodes":{"@type":"uav:NodeModel","aliases":[{"alias":"Boolean","value":"i=1"},{"alias":"SByte","value":"i=2"},{"alias":"Byte","value":"i=3"},{"alias":"Int16","value":"i=4"},{"alias":"UInt16","value":"i=5"},{"alias":"Int32","value":"i=6"},{"alias":"UInt32","value":"i=7"},{"alias":"Int64","value":"i=8"},{"alias":"UInt64","value":"i=9"},{"alias":"Float","value":"i=10"},{"alias":"Double","value":"i=11"},{"alias":"DateTime","value":"i=13"},{"alias":"String","value":"i=12"},{"alias":"ByteString","value":"i=15"},{"alias":"Guid","value":"i=14"},{"alias":"XmlElement","value":"i=16"},{"alias":"NodeId","value":"i=17"},{"alias":"ExpandedNodeId","value":"i=18"},{"alias":"QualifiedName","value":"i=20"},{"alias":"LocalizedText","value":"i=21"},{"alias":"StatusCode","value":"i=19"},{"alias":"Structure","value":"i=22"},{"alias":"Number","value":"i=26"},{"alias":"Integer","value":"i=27"},{"alias":"UInteger","value":"i=28"},{"alias":"HasComponent","value":"i=47"},{"alias":"HasProperty","value":"i=46"},{"alias":"Organizes","value":"i=35"},{"alias":"HasEventSource","value":"i=36"},{"alias":"HasNotifier","value":"i=48"},{"alias":"HasSubtype","value":"i=45"},{"alias":"HasTypeDefinition","value":"i=40"},{"alias":"HasModellingRule","value":"i=37"},{"alias":"HasEncoding","value":"i=38"},{"alias":"HasDescription","value":"i=39"},{"alias":"HasCause","value":"i=53"},{"alias":"ToState","value":"i=52"},{"alias":"FromState","value":"i=51"},{"alias":"HasEffect","value":"i=54"},{"alias":"HasTrueSubState","value":"i=9004"},{"alias":"HasFalseSubState","value":"i=9005"},{"alias":"HasDictionaryEntry","value":"i=17597"},{"alias":"HasCondition","value":"i=9006"},{"alias":"HasGuard","value":"i=15112"},{"alias":"HasAddIn","value":"i=17604"},{"alias":"HasInterface","value":"i=17603"}],"lastModified":"2022-11-03T00:00:00Z","models":[{"modelUri":"http://opcfoundation.org/UA/DI/","publicationDate":"2022-11-03T00:00:00Z","requiredModels":[{"modelUri":"http://opcfoundation.org/UA/","publicationDate":"2022-02-24T00:00:00Z","version":"1.05.01","xmlSchemaUri":"http://opcfoundation.org/UA/2008/02/Types.xsd"}],"version":"1.04.0","xmlSchemaUri":"http://opcfoundation.org/UA/DI/Types.xsd"}],"namespaceUris":["http://opcfoundation.org/UA/DI/"],"nodes":[{"browseName":"1:http://opcfoundation.org/UA/DI/","displayName":[{"value":"http://opcfoundation.org/UA/DI/"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/12.1","nodeClass":"Object","nodeId":"ns=1;i=15001","references":[{"referenceType":"HasProperty","target":"ns=1;i=15002"},{"referenceType":"HasProperty","target":"ns=1;i=15003"},{"referenceType":"HasProperty","target":"ns=1;i=15004"},{"referenceType":"HasProperty","target":"ns=1;i=15005"},{"referenceType":"HasProperty","target":"ns=1;i=15006"},{"referenceType":"HasProperty","target":"ns=1;i=15007"},{"referenceType":"HasProperty","target":"ns=1;i=15008"},{"referenceType":"HasProperty","target":"ns=1;i=15031"},{"referenceType":"HasProperty","target":"ns=1;i=15032"},{"referenceType":"HasProperty","target":"ns=1;i=15033"},{"isForward":false,"referenceType":"HasComponent","target":"i=11715"},{"referenceType":"HasTypeDefinition","target":"i=11616"}],"symbolicName":"OPCUADINamespaceMetadata","typeDefinition":"i=11616"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=15002","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/DI/\u003C/String\u003E"},{"browseName":"NamespaceVersion","dataType":"String","displayName":[{"value":"NamespaceVersion"}],"nodeClass":"Variable","nodeId":"ns=1;i=15003","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1.04.0\u003C/String\u003E"},{"browseName":"NamespacePublicationDate","dataType":"DateTime","displayName":[{"value":"NamespacePublicationDate"}],"nodeClass":"Variable","nodeId":"ns=1;i=15004","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueXml":"\u003CDateTime xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2022-11-03T00:00:00Z\u003C/DateTime\u003E"},{"browseName":"IsNamespaceSubset","dataType":"Boolean","displayName":[{"value":"IsNamespaceSubset"}],"nodeClass":"Variable","nodeId":"ns=1;i=15005","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueXml":"\u003CBoolean xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/Boolean\u003E"},{"arrayDimensions":"0","browseName":"StaticNodeIdTypes","dataType":"i=256","displayName":[{"value":"StaticNodeIdTypes"}],"nodeClass":"Variable","nodeId":"ns=1;i=15006","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CInt32\u003E0\u003C/Int32\u003E\n \u003C/ListOfInt32\u003E"},{"arrayDimensions":"0","browseName":"StaticNumericNodeIdRange","dataType":"i=291","displayName":[{"value":"StaticNumericNodeIdRange"}],"nodeClass":"Variable","nodeId":"ns=1;i=15007","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CString\u003E1:2147483647\u003C/String\u003E\n \u003C/ListOfString\u003E"},{"browseName":"StaticStringNodeIdPattern","dataType":"String","displayName":[{"value":"StaticStringNodeIdPattern"}],"nodeClass":"Variable","nodeId":"ns=1;i=15008","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022 /\u003E"},{"arrayDimensions":"0","browseName":"DefaultRolePermissions","dataType":"i=96","displayName":[{"value":"DefaultRolePermissions"}],"nodeClass":"Variable","nodeId":"ns=1;i=15031","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueRank":1},{"arrayDimensions":"0","browseName":"DefaultUserRolePermissions","dataType":"i=96","displayName":[{"value":"DefaultUserRolePermissions"}],"nodeClass":"Variable","nodeId":"ns=1;i=15032","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68","valueRank":1},{"browseName":"DefaultAccessRestrictions","dataType":"i=95","displayName":[{"value":"DefaultAccessRestrictions"}],"nodeClass":"Variable","nodeId":"ns=1;i=15033","parentNodeId":"ns=1;i=15001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"}],"typeDefinition":"i=68"},{"browseName":"1:ConnectsTo","category":["DI ConnectsTo"],"description":[{"value":"Used to indicate that source and target Node have a topological connection."}],"displayName":[{"value":"ConnectsTo"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/5.5","nodeClass":"ReferenceType","nodeId":"ns=1;i=6030","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=33"}],"superType":"i=33","symmetric":true},{"browseName":"1:ConnectsToParent","category":["DI ConnectsTo"],"description":[{"value":"Defines the parent (i.e. the communication Device) of a Network."}],"displayName":[{"value":"ConnectsToParent"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/5.5","nodeClass":"ReferenceType","nodeId":"ns=1;i=6467","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=6030"}],"superType":"ns=1;i=6030","symmetric":true},{"browseName":"1:IsOnline","category":["DI Offline"],"description":[{"value":"Used to bind the offline representation of a Device to the online representation."}],"displayName":[{"value":"IsOnline"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.3.2","inverseName":[{"value":"OnlineOf"}],"nodeClass":"ReferenceType","nodeId":"ns=1;i=6031","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=44"}],"superType":"i=44"},{"browseName":"1:DeviceSet","category":["DI DeviceSet"],"description":[{"value":"Contains all instances of devices"}],"displayName":[{"value":"DeviceSet"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.9","nodeClass":"Object","nodeId":"ns=1;i=5001","references":[{"isForward":false,"referenceType":"Organizes","target":"i=85"},{"referenceType":"HasTypeDefinition","target":"i=58"}],"typeDefinition":"i=58"},{"browseName":"1:DeviceFeatures","category":["DI DeviceSet"],"displayName":[{"value":"DeviceFeatures"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.10","nodeClass":"Object","nodeId":"ns=1;i=15034","references":[{"isForward":false,"referenceType":"Organizes","target":"ns=1;i=5001"},{"referenceType":"HasTypeDefinition","target":"i=58"}],"typeDefinition":"i=58"},{"browseName":"1:NetworkSet","category":["DI NetworkSet"],"description":[{"value":"Contains all instances of communication networks"}],"displayName":[{"value":"NetworkSet"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/5.6","nodeClass":"Object","nodeId":"ns=1;i=6078","references":[{"isForward":false,"referenceType":"Organizes","target":"i=85"},{"referenceType":"HasTypeDefinition","target":"i=58"}],"typeDefinition":"i=58"},{"browseName":"1:DeviceTopology","category":["DI DeviceTopology"],"description":[{"value":"Starting point of the configured device topology."}],"displayName":[{"value":"DeviceTopology"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.2","nodeClass":"Object","nodeId":"ns=1;i=6094","references":[{"referenceType":"HasProperty","target":"ns=1;i=6095"},{"isForward":false,"referenceType":"Organizes","target":"i=85"},{"referenceType":"HasTypeDefinition","target":"i=58"}],"typeDefinition":"i=58"},{"browseName":"1:OnlineAccess","dataType":"Boolean","description":[{"value":"Hint of whether the Server is currently able to communicate to Devices in the topology."}],"displayName":[{"value":"OnlineAccess"}],"nodeClass":"Variable","nodeId":"ns=1;i=6095","parentNodeId":"ns=1;i=6094","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6094"}],"typeDefinition":"i=68"},{"browseName":"1:TopologyElementType","category":["DI Information Model"],"description":[{"value":"Defines the basic information components for all configurable elements in a device topology"}],"displayName":[{"value":"TopologyElementType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.3","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1001","references":[{"referenceType":"HasComponent","target":"ns=1;i=5002"},{"referenceType":"HasComponent","target":"ns=1;i=5003"},{"referenceType":"HasComponent","target":"ns=1;i=6567"},{"referenceType":"HasComponent","target":"ns=1;i=6014"},{"referenceType":"HasComponent","target":"ns=1;i=6161"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:ParameterSet","description":[{"value":"Flat list of Parameters"}],"displayName":[{"value":"ParameterSet"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5002","parentNodeId":"ns=1;i=1001","references":[{"referenceType":"HasComponent","target":"ns=1;i=6017"},{"referenceType":"HasTypeDefinition","target":"i=58"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1001"}],"typeDefinition":"i=58"},{"browseName":"1:\u003CParameterIdentifier\u003E","dataType":"i=24","description":[{"value":"A parameter which belongs to the topology element."}],"displayName":[{"value":"\u003CParameterIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=6017","parentNodeId":"ns=1;i=5002","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5002"}],"symbolicName":"ParameterIdentifier","typeDefinition":"i=63"},{"browseName":"1:MethodSet","description":[{"value":"Flat list of Methods"}],"displayName":[{"value":"MethodSet"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5003","parentNodeId":"ns=1;i=1001","references":[{"referenceType":"HasTypeDefinition","target":"i=58"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1001"}],"typeDefinition":"i=58"},{"browseName":"1:\u003CGroupIdentifier\u003E","description":[{"value":"An application specific functional group used to organize parameters and methods."}],"displayName":[{"value":"\u003CGroupIdentifier\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=6567","parentNodeId":"ns=1;i=1001","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1001"}],"symbolicName":"GroupIdentifier","typeDefinition":"ns=1;i=1005"},{"browseName":"1:Identification","description":[{"value":"Used to organize parameters for identification of this TopologyElement"}],"displayName":[{"value":"Identification"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6014","parentNodeId":"ns=1;i=1001","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1001"}],"typeDefinition":"ns=1;i=1005"},{"browseName":"1:Lock","description":[{"value":"Used to lock the topology element."}],"displayName":[{"value":"Lock"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6161","parentNodeId":"ns=1;i=1001","references":[{"referenceType":"HasProperty","target":"ns=1;i=6468"},{"referenceType":"HasProperty","target":"ns=1;i=6163"},{"referenceType":"HasProperty","target":"ns=1;i=6164"},{"referenceType":"HasProperty","target":"ns=1;i=6165"},{"referenceType":"HasComponent","target":"ns=1;i=6166"},{"referenceType":"HasComponent","target":"ns=1;i=6169"},{"referenceType":"HasComponent","target":"ns=1;i=6171"},{"referenceType":"HasComponent","target":"ns=1;i=6173"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=6388"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1001"}],"typeDefinition":"ns=1;i=6388"},{"browseName":"1:Locked","dataType":"Boolean","displayName":[{"value":"Locked"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6468","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6161"}],"typeDefinition":"i=68"},{"browseName":"1:LockingClient","dataType":"String","displayName":[{"value":"LockingClient"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6163","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6161"}],"typeDefinition":"i=68"},{"browseName":"1:LockingUser","dataType":"String","displayName":[{"value":"LockingUser"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6164","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6161"}],"typeDefinition":"i=68"},{"browseName":"1:RemainingLockTime","dataType":"i=290","displayName":[{"value":"RemainingLockTime"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6165","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6161"}],"typeDefinition":"i=68"},{"browseName":"1:InitLock","category":["DI Locking"],"displayName":[{"value":"InitLock"}],"methodDeclarationId":"ns=1;i=6393","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6166","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasProperty","target":"ns=1;i=6167"},{"referenceType":"HasProperty","target":"ns=1;i=6168"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6161"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6167","parentNodeId":"ns=1;i=6166","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6166"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EContext\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6168","parentNodeId":"ns=1;i=6166","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6166"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EInitLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:RenewLock","category":["DI Locking"],"displayName":[{"value":"RenewLock"}],"methodDeclarationId":"ns=1;i=6396","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6169","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasProperty","target":"ns=1;i=6170"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6161"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6170","parentNodeId":"ns=1;i=6169","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6169"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ERenewLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ExitLock","category":["DI Locking"],"displayName":[{"value":"ExitLock"}],"methodDeclarationId":"ns=1;i=6398","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6171","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasProperty","target":"ns=1;i=6172"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6161"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6172","parentNodeId":"ns=1;i=6171","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6171"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EExitLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:BreakLock","category":["DI Locking"],"displayName":[{"value":"BreakLock"}],"methodDeclarationId":"ns=1;i=6400","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6173","parentNodeId":"ns=1;i=6161","references":[{"referenceType":"HasProperty","target":"ns=1;i=6174"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6161"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6174","parentNodeId":"ns=1;i=6173","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6173"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EBreakLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:IVendorNameplateType","category":["DI Nameplate"],"displayName":[{"value":"IVendorNameplateType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.5.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=15035","references":[{"referenceType":"HasProperty","target":"ns=1;i=15036"},{"referenceType":"HasProperty","target":"ns=1;i=15037"},{"referenceType":"HasProperty","target":"ns=1;i=15038"},{"referenceType":"HasProperty","target":"ns=1;i=15039"},{"referenceType":"HasProperty","target":"ns=1;i=15040"},{"referenceType":"HasProperty","target":"ns=1;i=15041"},{"referenceType":"HasProperty","target":"ns=1;i=15042"},{"referenceType":"HasProperty","target":"ns=1;i=15043"},{"referenceType":"HasProperty","target":"ns=1;i=15044"},{"referenceType":"HasProperty","target":"ns=1;i=15045"},{"referenceType":"HasProperty","target":"ns=1;i=15046"},{"referenceType":"HasProperty","target":"ns=1;i=15047"},{"referenceType":"HasProperty","target":"ns=1;i=23"},{"referenceType":"HasProperty","target":"ns=1;i=24"},{"isForward":false,"referenceType":"HasSubtype","target":"i=17602"}],"superType":"i=17602"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15036","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15037","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:Model","dataType":"LocalizedText","displayName":[{"value":"Model"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15038","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:HardwareRevision","dataType":"String","displayName":[{"value":"HardwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15039","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15040","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceRevision","dataType":"String","displayName":[{"value":"DeviceRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15041","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:ProductCode","dataType":"String","displayName":[{"value":"ProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15042","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceManual","dataType":"String","displayName":[{"value":"DeviceManual"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15043","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceClass","dataType":"String","displayName":[{"value":"DeviceClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15044","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:SerialNumber","dataType":"String","displayName":[{"value":"SerialNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15045","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:ProductInstanceUri","dataType":"String","displayName":[{"value":"ProductInstanceUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15046","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:RevisionCounter","dataType":"Int32","displayName":[{"value":"RevisionCounter"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15047","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareReleaseDate","dataType":"DateTime","displayName":[{"value":"SoftwareReleaseDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=23","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68"},{"arrayDimensions":"0","browseName":"1:PatchIdentifiers","dataType":"String","displayName":[{"value":"PatchIdentifiers"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=24","parentNodeId":"ns=1;i=15035","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"}],"typeDefinition":"i=68","valueRank":1},{"browseName":"1:ITagNameplateType","category":["DI TagNameplate"],"displayName":[{"value":"ITagNameplateType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.5.3","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=15048","references":[{"referenceType":"HasProperty","target":"ns=1;i=15049"},{"referenceType":"HasProperty","target":"ns=1;i=15050"},{"isForward":false,"referenceType":"HasSubtype","target":"i=17602"}],"superType":"i=17602"},{"browseName":"1:AssetId","dataType":"String","displayName":[{"value":"AssetId"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15049","parentNodeId":"ns=1;i=15048","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15048"}],"typeDefinition":"i=68"},{"browseName":"1:ComponentName","dataType":"LocalizedText","displayName":[{"value":"ComponentName"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15050","parentNodeId":"ns=1;i=15048","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15048"}],"typeDefinition":"i=68"},{"browseName":"1:IDeviceHealthType","category":["DI DeviceHealth"],"displayName":[{"value":"IDeviceHealthType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.5.4","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=15051","references":[{"referenceType":"HasComponent","target":"ns=1;i=15052"},{"referenceType":"HasComponent","target":"ns=1;i=15053"},{"isForward":false,"referenceType":"HasSubtype","target":"i=17602"}],"superType":"i=17602"},{"browseName":"1:DeviceHealth","dataType":"ns=1;i=6244","displayName":[{"value":"DeviceHealth"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15052","parentNodeId":"ns=1;i=15051","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15051"}],"typeDefinition":"i=63"},{"browseName":"1:DeviceHealthAlarms","displayName":[{"value":"DeviceHealthAlarms"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=15053","parentNodeId":"ns=1;i=15051","references":[{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15051"}],"typeDefinition":"i=61"},{"browseName":"1:ISupportInfoType","category":["DI DeviceSupportInfo"],"displayName":[{"value":"ISupportInfoType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.5.6","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=15054","references":[{"referenceType":"HasComponent","target":"ns=1;i=15055"},{"referenceType":"HasComponent","target":"ns=1;i=15057"},{"referenceType":"HasComponent","target":"ns=1;i=27"},{"referenceType":"HasComponent","target":"ns=1;i=15059"},{"referenceType":"HasComponent","target":"ns=1;i=15061"},{"isForward":false,"referenceType":"HasSubtype","target":"i=17602"}],"superType":"i=17602"},{"browseName":"1:DeviceTypeImage","displayName":[{"value":"DeviceTypeImage"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=15055","parentNodeId":"ns=1;i=15054","references":[{"referenceType":"HasComponent","target":"ns=1;i=15056"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15054"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CImageIdentifier\u003E","dataType":"i=30","displayName":[{"value":"\u003CImageIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=15056","parentNodeId":"ns=1;i=15055","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15055"}],"symbolicName":"ImageIdentifier","typeDefinition":"i=63"},{"browseName":"1:Documentation","displayName":[{"value":"Documentation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=15057","parentNodeId":"ns=1;i=15054","references":[{"referenceType":"HasComponent","target":"ns=1;i=15058"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15054"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CDocumentIdentifier\u003E","dataType":"ByteString","displayName":[{"value":"\u003CDocumentIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=15058","parentNodeId":"ns=1;i=15057","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15057"}],"symbolicName":"DocumentIdentifier","typeDefinition":"i=63"},{"browseName":"1:DocumentationFiles","displayName":[{"value":"DocumentationFiles"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=27","parentNodeId":"ns=1;i=15054","references":[{"referenceType":"HasComponent","target":"ns=1;i=28"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15054"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CDocumentFileId\u003E","displayName":[{"value":"\u003CDocumentFileId\u003E"}],"nodeClass":"Object","nodeId":"ns=1;i=28","parentNodeId":"ns=1;i=27","references":[{"referenceType":"HasProperty","target":"ns=1;i=29"},{"referenceType":"HasProperty","target":"ns=1;i=30"},{"referenceType":"HasProperty","target":"ns=1;i=31"},{"referenceType":"HasProperty","target":"ns=1;i=32"},{"referenceType":"HasComponent","target":"ns=1;i=36"},{"referenceType":"HasComponent","target":"ns=1;i=39"},{"referenceType":"HasComponent","target":"ns=1;i=63"},{"referenceType":"HasComponent","target":"ns=1;i=66"},{"referenceType":"HasComponent","target":"ns=1;i=68"},{"referenceType":"HasComponent","target":"ns=1;i=71"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=27"}],"symbolicName":"DocumentFileId","typeDefinition":"i=11575"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=29","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=28"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=30","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=28"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=31","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=28"}],"typeDefinition":"i=68"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=32","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=28"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=36","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasProperty","target":"ns=1;i=37"},{"referenceType":"HasProperty","target":"ns=1;i=38"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=28"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=37","parentNodeId":"ns=1;i=36","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=36"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EMode\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=3\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=38","parentNodeId":"ns=1;i=36","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=36"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=39","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasProperty","target":"ns=1;i=62"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=28"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=62","parentNodeId":"ns=1;i=39","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=39"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=63","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasProperty","target":"ns=1;i=64"},{"referenceType":"HasProperty","target":"ns=1;i=65"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=28"}]},{"arrayDimensions":"2","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=64","parentNodeId":"ns=1;i=63","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=63"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ELength\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=65","parentNodeId":"ns=1;i=63","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=63"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EData\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=15\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=66","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasProperty","target":"ns=1;i=67"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=28"}]},{"arrayDimensions":"2","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=67","parentNodeId":"ns=1;i=66","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=66"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EData\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=15\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=68","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasProperty","target":"ns=1;i=69"},{"referenceType":"HasProperty","target":"ns=1;i=70"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=28"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=69","parentNodeId":"ns=1;i=68","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=70","parentNodeId":"ns=1;i=68","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EPosition\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=9\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=71","parentNodeId":"ns=1;i=28","references":[{"referenceType":"HasProperty","target":"ns=1;i=72"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=28"}]},{"arrayDimensions":"2","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=72","parentNodeId":"ns=1;i=71","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=71"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EPosition\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=9\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ProtocolSupport","displayName":[{"value":"ProtocolSupport"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=15059","parentNodeId":"ns=1;i=15054","references":[{"referenceType":"HasComponent","target":"ns=1;i=15060"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15054"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CProtocolSupportIdentifier\u003E","dataType":"ByteString","displayName":[{"value":"\u003CProtocolSupportIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=15060","parentNodeId":"ns=1;i=15059","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15059"}],"symbolicName":"ProtocolSupportIdentifier","typeDefinition":"i=63"},{"browseName":"1:ImageSet","displayName":[{"value":"ImageSet"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=15061","parentNodeId":"ns=1;i=15054","references":[{"referenceType":"HasComponent","target":"ns=1;i=15062"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15054"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CImageIdentifier\u003E","dataType":"i=30","displayName":[{"value":"\u003CImageIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=15062","parentNodeId":"ns=1;i=15061","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=15061"}],"symbolicName":"ImageIdentifier","typeDefinition":"i=63"},{"browseName":"1:ComponentType","category":["DI Information Model"],"displayName":[{"value":"ComponentType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.6","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=15063","references":[{"referenceType":"HasProperty","target":"ns=1;i=15086"},{"referenceType":"HasProperty","target":"ns=1;i=15087"},{"referenceType":"HasProperty","target":"ns=1;i=15088"},{"referenceType":"HasProperty","target":"ns=1;i=15089"},{"referenceType":"HasProperty","target":"ns=1;i=15090"},{"referenceType":"HasProperty","target":"ns=1;i=15091"},{"referenceType":"HasProperty","target":"ns=1;i=15092"},{"referenceType":"HasProperty","target":"ns=1;i=15093"},{"referenceType":"HasProperty","target":"ns=1;i=15094"},{"referenceType":"HasProperty","target":"ns=1;i=15095"},{"referenceType":"HasProperty","target":"ns=1;i=15096"},{"referenceType":"HasProperty","target":"ns=1;i=15097"},{"referenceType":"HasProperty","target":"ns=1;i=15098"},{"referenceType":"HasProperty","target":"ns=1;i=15099"},{"referenceType":"HasInterface","target":"ns=1;i=15035"},{"referenceType":"HasInterface","target":"ns=1;i=15048"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1001"}],"superType":"ns=1;i=1001"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15086","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15087","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:Model","dataType":"LocalizedText","displayName":[{"value":"Model"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15088","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:HardwareRevision","dataType":"String","displayName":[{"value":"HardwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15089","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15090","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceRevision","dataType":"String","displayName":[{"value":"DeviceRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15091","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:ProductCode","dataType":"String","displayName":[{"value":"ProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15092","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceManual","dataType":"String","displayName":[{"value":"DeviceManual"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15093","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceClass","dataType":"String","displayName":[{"value":"DeviceClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15094","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:SerialNumber","dataType":"String","displayName":[{"value":"SerialNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15095","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:ProductInstanceUri","dataType":"String","displayName":[{"value":"ProductInstanceUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15096","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:RevisionCounter","dataType":"Int32","displayName":[{"value":"RevisionCounter"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15097","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:AssetId","dataType":"String","displayName":[{"value":"AssetId"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15098","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:ComponentName","dataType":"LocalizedText","displayName":[{"value":"ComponentName"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15099","parentNodeId":"ns=1;i=15063","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15063"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceType","category":["DI DeviceType"],"description":[{"value":"Defines the basic information components for all configurable elements in a device topology"}],"displayName":[{"value":"DeviceType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.7","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1002","references":[{"referenceType":"HasProperty","target":"ns=1;i=6003"},{"referenceType":"HasProperty","target":"ns=1;i=15100"},{"referenceType":"HasProperty","target":"ns=1;i=6004"},{"referenceType":"HasProperty","target":"ns=1;i=6008"},{"referenceType":"HasProperty","target":"ns=1;i=6007"},{"referenceType":"HasProperty","target":"ns=1;i=6006"},{"referenceType":"HasProperty","target":"ns=1;i=15101"},{"referenceType":"HasProperty","target":"ns=1;i=6005"},{"referenceType":"HasProperty","target":"ns=1;i=6470"},{"referenceType":"HasProperty","target":"ns=1;i=6001"},{"referenceType":"HasProperty","target":"ns=1;i=15102"},{"referenceType":"HasProperty","target":"ns=1;i=6002"},{"referenceType":"HasComponent","target":"ns=1;i=6571"},{"referenceType":"HasComponent","target":"ns=1;i=6208"},{"referenceType":"HasComponent","target":"ns=1;i=15105"},{"referenceType":"HasComponent","target":"ns=1;i=6209"},{"referenceType":"HasComponent","target":"ns=1;i=6211"},{"referenceType":"HasComponent","target":"ns=1;i=6213"},{"referenceType":"HasComponent","target":"ns=1;i=6215"},{"referenceType":"HasInterface","target":"ns=1;i=15054"},{"referenceType":"HasInterface","target":"ns=1;i=15051"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=15063"}],"superType":"ns=1;i=15063"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","description":[{"value":"Name of the company that manufactured the device"}],"displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6003","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15100","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:Model","dataType":"LocalizedText","description":[{"value":"Model name of the device"}],"displayName":[{"value":"Model"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6004","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:HardwareRevision","dataType":"String","description":[{"value":"Revision level of the hardware of the device"}],"displayName":[{"value":"HardwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6008","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","description":[{"value":"Revision level of the software/firmware of the device"}],"displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6007","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceRevision","dataType":"String","description":[{"value":"Overall revision level of the device"}],"displayName":[{"value":"DeviceRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6006","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:ProductCode","dataType":"String","displayName":[{"value":"ProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15101","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceManual","dataType":"String","description":[{"value":"Address (pathname in the file system or a URL | Web address) of user manual for the device"}],"displayName":[{"value":"DeviceManual"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6005","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:DeviceClass","dataType":"String","displayName":[{"value":"DeviceClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6470","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:SerialNumber","dataType":"String","description":[{"value":"Identifier that uniquely identifies, within a manufacturer, a device instance"}],"displayName":[{"value":"SerialNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6001","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:ProductInstanceUri","dataType":"String","displayName":[{"value":"ProductInstanceUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15102","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:RevisionCounter","dataType":"Int32","description":[{"value":"An incremental counter indicating the number of times the static data within the Device has been modified"}],"displayName":[{"value":"RevisionCounter"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6002","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1002"}],"typeDefinition":"i=68"},{"browseName":"1:\u003CCPIdentifier\u003E","displayName":[{"value":"\u003CCPIdentifier\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=6571","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasComponent","target":"ns=1;i=6592"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=6308"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"symbolicName":"CPIdentifier","typeDefinition":"ns=1;i=6308"},{"browseName":"1:NetworkAddress","description":[{"value":"The address of the device on this network."}],"displayName":[{"value":"NetworkAddress"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=6592","parentNodeId":"ns=1;i=6571","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6571"}],"typeDefinition":"ns=1;i=1005"},{"browseName":"1:DeviceHealth","dataType":"ns=1;i=6244","displayName":[{"value":"DeviceHealth"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6208","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"typeDefinition":"i=63"},{"browseName":"1:DeviceHealthAlarms","displayName":[{"value":"DeviceHealthAlarms"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=15105","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"typeDefinition":"i=61"},{"browseName":"1:DeviceTypeImage","description":[{"value":"Organizes pictures of the device."}],"displayName":[{"value":"DeviceTypeImage"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6209","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasComponent","target":"ns=1;i=6210"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CImageIdentifier\u003E","dataType":"i=30","description":[{"value":"An image of the device."}],"displayName":[{"value":"\u003CImageIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=6210","parentNodeId":"ns=1;i=6209","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6209"}],"symbolicName":"ImageIdentifier","typeDefinition":"i=63"},{"browseName":"1:Documentation","description":[{"value":"Organizes documents for the device."}],"displayName":[{"value":"Documentation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6211","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasComponent","target":"ns=1;i=6212"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CDocumentIdentifier\u003E","dataType":"ByteString","description":[{"value":"A document for the device."}],"displayName":[{"value":"\u003CDocumentIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=6212","parentNodeId":"ns=1;i=6211","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6211"}],"symbolicName":"DocumentIdentifier","typeDefinition":"i=63"},{"browseName":"1:ProtocolSupport","description":[{"value":"Protocol-specific files for the device."}],"displayName":[{"value":"ProtocolSupport"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6213","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasComponent","target":"ns=1;i=6214"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CProtocolSupportIdentifier\u003E","dataType":"ByteString","description":[{"value":"A protocol-specific file for the device."}],"displayName":[{"value":"\u003CProtocolSupportIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=6214","parentNodeId":"ns=1;i=6213","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6213"}],"symbolicName":"ProtocolSupportIdentifier","typeDefinition":"i=63"},{"browseName":"1:ImageSet","description":[{"value":"Organizes images that are used within UIElements."}],"displayName":[{"value":"ImageSet"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6215","parentNodeId":"ns=1;i=1002","references":[{"referenceType":"HasComponent","target":"ns=1;i=6216"},{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CImageIdentifier\u003E","dataType":"i=30","description":[{"value":"An image for a UIElement."}],"displayName":[{"value":"\u003CImageIdentifier\u003E"}],"nodeClass":"Variable","nodeId":"ns=1;i=6216","parentNodeId":"ns=1;i=6215","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6215"}],"symbolicName":"ImageIdentifier","typeDefinition":"i=63"},{"browseName":"1:SoftwareType","category":["DI Software Component"],"displayName":[{"value":"SoftwareType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.8","nodeClass":"ObjectType","nodeId":"ns=1;i=15106","references":[{"referenceType":"HasProperty","target":"ns=1;i=15129"},{"referenceType":"HasProperty","target":"ns=1;i=15131"},{"referenceType":"HasProperty","target":"ns=1;i=15133"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=15063"}],"superType":"ns=1;i=15063"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=15129","parentNodeId":"ns=1;i=15106","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15106"}],"typeDefinition":"i=68"},{"browseName":"1:Model","dataType":"LocalizedText","displayName":[{"value":"Model"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=15131","parentNodeId":"ns=1;i=15106","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15106"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=15133","parentNodeId":"ns=1;i=15106","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15106"}],"typeDefinition":"i=68"},{"browseName":"1:BlockType","category":["DI Blocks"],"description":[{"value":"Adds the concept of Blocks needed for block-oriented FieldDevices"}],"displayName":[{"value":"BlockType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.11","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1003","references":[{"referenceType":"HasProperty","target":"ns=1;i=6009"},{"referenceType":"HasProperty","target":"ns=1;i=6010"},{"referenceType":"HasProperty","target":"ns=1;i=6011"},{"referenceType":"HasProperty","target":"ns=1;i=6012"},{"referenceType":"HasProperty","target":"ns=1;i=6013"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1001"}],"superType":"ns=1;i=1001"},{"browseName":"1:RevisionCounter","dataType":"Int32","description":[{"value":"Incremental counter indicating the number of times the static data within the Block has been modified"}],"displayName":[{"value":"RevisionCounter"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6009","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68"},{"browseName":"1:ActualMode","dataType":"LocalizedText","description":[{"value":"Current mode of operation the Block is able to achieve"}],"displayName":[{"value":"ActualMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6010","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68"},{"arrayDimensions":"0","browseName":"1:PermittedMode","dataType":"LocalizedText","description":[{"value":"Modes of operation that are allowed for the Block based on application requirements"}],"displayName":[{"value":"PermittedMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6011","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68","valueRank":1},{"arrayDimensions":"0","browseName":"1:NormalMode","dataType":"LocalizedText","description":[{"value":"Mode the Block should be set to during normal operating conditions"}],"displayName":[{"value":"NormalMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6012","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68","valueRank":1},{"arrayDimensions":"0","browseName":"1:TargetMode","dataType":"LocalizedText","description":[{"value":"Mode of operation that is desired for the Block"}],"displayName":[{"value":"TargetMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6013","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68","valueRank":1},{"browseName":"1:DeviceHealthDiagnosticAlarmType","category":["DI HealthDiagnosticsAlarm"],"displayName":[{"value":"DeviceHealthDiagnosticAlarmType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.12.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=15143","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=18347"}],"superType":"i=18347"},{"browseName":"1:FailureAlarmType","category":["DI HealthDiagnosticsAlarm"],"displayName":[{"value":"FailureAlarmType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.12.3","nodeClass":"ObjectType","nodeId":"ns=1;i=15292","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=15143"}],"superType":"ns=1;i=15143"},{"browseName":"1:CheckFunctionAlarmType","category":["DI HealthDiagnosticsAlarm"],"displayName":[{"value":"CheckFunctionAlarmType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.12.4","nodeClass":"ObjectType","nodeId":"ns=1;i=15441","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=15143"}],"superType":"ns=1;i=15143"},{"browseName":"1:OffSpecAlarmType","category":["DI HealthDiagnosticsAlarm"],"displayName":[{"value":"OffSpecAlarmType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.12.5","nodeClass":"ObjectType","nodeId":"ns=1;i=15590","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=15143"}],"superType":"ns=1;i=15143"},{"browseName":"1:MaintenanceRequiredAlarmType","category":["DI HealthDiagnosticsAlarm"],"displayName":[{"value":"MaintenanceRequiredAlarmType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.12.6","nodeClass":"ObjectType","nodeId":"ns=1;i=15739","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=15143"}],"superType":"ns=1;i=15143"},{"browseName":"1:ConfigurableObjectType","category":["DI Information Model"],"description":[{"value":"Defines a general pattern to expose and configure modular components"}],"displayName":[{"value":"ConfigurableObjectType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/9.2.2","nodeClass":"ObjectType","nodeId":"ns=1;i=1004","references":[{"referenceType":"HasComponent","target":"ns=1;i=5004"},{"referenceType":"HasComponent","target":"ns=1;i=6026"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:SupportedTypes","description":[{"value":"Folder maintaining the set of (sub-types of) BaseObjectTypes that can be instantiated in the ConfigurableComponent"}],"displayName":[{"value":"SupportedTypes"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=5004","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasTypeDefinition","target":"i=61"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1004"}],"typeDefinition":"i=61"},{"browseName":"1:\u003CObjectIdentifier\u003E","displayName":[{"value":"\u003CObjectIdentifier\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=6026","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasTypeDefinition","target":"i=58"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1004"}],"symbolicName":"ObjectIdentifier","typeDefinition":"i=58"},{"browseName":"1:LifetimeVariableType","category":["DI LT Lifetime Base"],"dataType":"Number","description":[{"value":"Remaining lifetime"}],"displayName":[{"value":"LifetimeVariableType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.2.2","nodeClass":"VariableType","nodeId":"ns=1;i=468","references":[{"referenceType":"HasProperty","target":"ns=1;i=469"},{"referenceType":"HasProperty","target":"ns=1;i=470"},{"referenceType":"HasProperty","target":"ns=1;i=471"},{"referenceType":"HasProperty","target":"ns=1;i=472"},{"isForward":false,"referenceType":"HasSubtype","target":"i=17497"}],"superType":"i=17497"},{"browseName":"1:StartValue","dataType":"Number","description":[{"value":"StartValue indicates the initial value, when there is still the full lifetime left."}],"displayName":[{"value":"StartValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=469","parentNodeId":"ns=1;i=468","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=468"}],"typeDefinition":"i=68"},{"browseName":"1:LimitValue","dataType":"Number","description":[{"value":"LimitValue indicates when the end of lifetime has been reached."}],"displayName":[{"value":"LimitValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=470","parentNodeId":"ns=1;i=468","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=468"}],"typeDefinition":"i=68"},{"browseName":"1:Indication","dataType":"NodeId","description":[{"value":"Indication gives an indication of what is actually measured / represented by the Value of the Variable and the StartValue and LimitValue."}],"displayName":[{"value":"Indication"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=471","parentNodeId":"ns=1;i=468","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=468"}],"typeDefinition":"i=68"},{"arrayDimensions":"0","browseName":"1:WarningValues","dataType":"Number","description":[{"value":"WarningValues indicates one or more levels when the end of lifetime is reached soon and may be used to inform the user when reached."}],"displayName":[{"value":"WarningValues"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=472","parentNodeId":"ns=1;i=468","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=468"}],"typeDefinition":"i=68","valueRank":-3},{"browseName":"1:BaseLifetimeIndicationType","category":["DI LT Lifetime Base"],"description":[{"value":"Base indication type not further defining a semantic"}],"displayName":[{"value":"BaseLifetimeIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.3.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=473","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:TimeIndicationType","category":["DI LT Time Indication"],"description":[{"value":"Indicates the time the entity has been in use or can still be used"}],"displayName":[{"value":"TimeIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.4.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=474","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=473"}],"superType":"ns=1;i=473"},{"browseName":"1:NumberOfPartsIndicationType","category":["DI LT Nb Of Parts Indication"],"description":[{"value":"Indicates the total number of parts that have been produced or can still be produced."}],"displayName":[{"value":"NumberOfPartsIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.5.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=475","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=473"}],"superType":"ns=1;i=473"},{"browseName":"1:NumberOfUsagesIndicationType","category":["DI LT Nb Of Usages Indication"],"description":[{"value":"Indicates counting the process steps the entity has been used or can still be used for (for example usages of a punching tool)."}],"displayName":[{"value":"NumberOfUsagesIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.6.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=476","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=473"}],"superType":"ns=1;i=473"},{"browseName":"1:LengthIndicationType","category":["DI LT Length Indication"],"description":[{"value":"Indicates the abraded length, for example of a drill."}],"displayName":[{"value":"LengthIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.7.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=477","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=473"}],"superType":"ns=1;i=473"},{"browseName":"1:DiameterIndicationType","category":["DI LT Diameter Indication"],"description":[{"value":"Indicates the abraded diameter, for example of a drill."}],"displayName":[{"value":"DiameterIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.8.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=478","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=473"}],"superType":"ns=1;i=473"},{"browseName":"1:SubstanceVolumeIndicationType","category":["DI LT Substance Volume Indication"],"description":[{"value":"Indicates the volume of a substance, for example of a liquid."}],"displayName":[{"value":"SubstanceVolumeIndicationType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/10.9.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=479","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=473"}],"superType":"ns=1;i=473"},{"browseName":"1:FunctionalGroupType","category":["DI Information Model"],"description":[{"value":"FolderType is used to organize the Parameters and Methods from the complete set (ParameterSet, MethodSet) with regard to their application"}],"displayName":[{"value":"FunctionalGroupType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.4.1","nodeClass":"ObjectType","nodeId":"ns=1;i=1005","references":[{"referenceType":"HasComponent","target":"ns=1;i=6027"},{"referenceType":"HasComponent","target":"ns=1;i=6243"},{"isForward":false,"referenceType":"HasSubtype","target":"i=61"}],"superType":"i=61"},{"browseName":"1:\u003CGroupIdentifier\u003E","description":[{"value":"An application specific functional group used to organize parameters and methods."}],"displayName":[{"value":"\u003CGroupIdentifier\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=6027","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasComponent","target":"ns=1;i=6242"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1005"}],"symbolicName":"GroupIdentifier","typeDefinition":"ns=1;i=1005"},{"browseName":"1:UIElement","dataType":"i=24","description":[{"value":"A user interface element assigned to this group."}],"displayName":[{"value":"UIElement"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6242","parentNodeId":"ns=1;i=6027","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=6246"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6027"}],"typeDefinition":"ns=1;i=6246"},{"browseName":"1:UIElement","dataType":"i=24","description":[{"value":"A user interface element assigned to this group."}],"displayName":[{"value":"UIElement"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6243","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=6246"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1005"}],"typeDefinition":"ns=1;i=6246"},{"browseName":"1:ProtocolType","category":["DI Network","DI Protocol"],"description":[{"value":"General structure of a Protocol ObjectType"}],"displayName":[{"value":"ProtocolType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/5.2","nodeClass":"ObjectType","nodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:DeviceHealthEnumeration","category":["DI DeviceHealth"],"definition":{"fields":[{"dataType":"i=24","description":[{"value":"This device functions normally."}],"name":"NORMAL","value":0},{"dataType":"i=24","description":[{"value":"Malfunction of the device or any of its peripherals."}],"name":"FAILURE","value":1},{"dataType":"i=24","description":[{"value":"Functional checks are currently performed."}],"name":"CHECK_FUNCTION","value":2},{"dataType":"i=24","description":[{"value":"The device is currently working outside of its specified range or that internal diagnoses indicate deviations from measured or set values."}],"name":"OFF_SPEC","value":3},{"dataType":"i=24","description":[{"value":"This element is working, but a maintenance operation is required."}],"name":"MAINTENANCE_REQUIRED","value":4}],"name":"1:DeviceHealthEnumeration"},"displayName":[{"value":"DeviceHealthEnumeration"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.5.4","nodeClass":"DataType","nodeId":"ns=1;i=6244","references":[{"referenceType":"HasProperty","target":"ns=1;i=6450"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"5","browseName":"EnumStrings","dataType":"LocalizedText","displayName":[{"value":"EnumStrings"}],"nodeClass":"Variable","nodeId":"ns=1;i=6450","parentNodeId":"ns=1;i=6244","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6244"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfLocalizedText xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003ENORMAL\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EFAILURE\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003ECHECK_FUNCTION\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EOFF_SPEC\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EMAINTENANCE_REQUIRED\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003C/ListOfLocalizedText\u003E"},{"browseName":"1:IOperationCounterType","category":["DI OperationCounter Interface"],"description":[{"value":"Interface defining counters for the duration of operation"}],"displayName":[{"value":"IOperationCounterType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.5.5","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=480","references":[{"referenceType":"HasProperty","target":"ns=1;i=481"},{"referenceType":"HasProperty","target":"ns=1;i=482"},{"referenceType":"HasProperty","target":"ns=1;i=483"},{"isForward":false,"referenceType":"HasSubtype","target":"i=17602"}],"superType":"i=17602"},{"browseName":"1:PowerOnDuration","dataType":"i=290","description":[{"value":"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 might define specific rules. Typically, when the Device has supply voltage and the main CPU is running, the time is counted. This may include any kind of sleep mode, but may not 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 maybe once a minute or once an hour, depending on the application."}],"displayName":[{"value":"PowerOnDuration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=481","parentNodeId":"ns=1;i=480","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=480"}],"typeDefinition":"i=68"},{"browseName":"1:OperationDuration","dataType":"i=290","description":[{"value":"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 might 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 maybe once a minute or once an hour, depending on the application."}],"displayName":[{"value":"OperationDuration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=482","parentNodeId":"ns=1;i=480","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=480"}],"typeDefinition":"i=68"},{"browseName":"1:OperationCycleCounter","dataType":"UInteger","description":[{"value":"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."}],"displayName":[{"value":"OperationCycleCounter"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=483","parentNodeId":"ns=1;i=480","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=480"}],"typeDefinition":"i=68"},{"browseName":"1:UIElementType","category":["DI Information Model"],"dataType":"i=24","description":[{"value":"The base type for all UI Element Types."}],"displayName":[{"value":"UIElementType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/4.4.3","isAbstract":true,"nodeClass":"VariableType","nodeId":"ns=1;i=6246","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=63"}],"superType":"i=63"},{"browseName":"1:NetworkType","category":["DI Network"],"description":[{"value":"Represents the communication means for Devices that are connected to it."}],"displayName":[{"value":"NetworkType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/5.3","nodeClass":"ObjectType","nodeId":"ns=1;i=6247","references":[{"referenceType":"HasComponent","target":"ns=1;i=6596"},{"referenceType":"ns=1;i=6030","target":"ns=1;i=6248"},{"referenceType":"HasComponent","target":"ns=1;i=6294"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:\u003CProfileIdentifier\u003E","displayName":[{"value":"\u003CProfileIdentifier\u003E"}],"nodeClass":"Object","nodeId":"ns=1;i=6596","parentNodeId":"ns=1;i=6247","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6247"}],"symbolicName":"ProfileIdentifier","typeDefinition":"ns=1;i=1006"},{"browseName":"1:\u003CCPIdentifier\u003E","description":[{"value":"The ConnectionPoint(s) that have been configured for this Network."}],"displayName":[{"value":"\u003CCPIdentifier\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=6248","parentNodeId":"ns=1;i=6247","references":[{"referenceType":"HasComponent","target":"ns=1;i=6292"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=6308"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"ns=1;i=6030","target":"ns=1;i=6247"}],"symbolicName":"CPIdentifier","typeDefinition":"ns=1;i=6308"},{"browseName":"1:NetworkAddress","description":[{"value":"The address of the device on this network."}],"displayName":[{"value":"NetworkAddress"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=6292","parentNodeId":"ns=1;i=6248","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6248"}],"typeDefinition":"ns=1;i=1005"},{"browseName":"1:Lock","description":[{"value":"Used to lock the Network."}],"displayName":[{"value":"Lock"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=6294","parentNodeId":"ns=1;i=6247","references":[{"referenceType":"HasProperty","target":"ns=1;i=6497"},{"referenceType":"HasProperty","target":"ns=1;i=6296"},{"referenceType":"HasProperty","target":"ns=1;i=6297"},{"referenceType":"HasProperty","target":"ns=1;i=6298"},{"referenceType":"HasComponent","target":"ns=1;i=6299"},{"referenceType":"HasComponent","target":"ns=1;i=6302"},{"referenceType":"HasComponent","target":"ns=1;i=6304"},{"referenceType":"HasComponent","target":"ns=1;i=6306"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=6388"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6247"}],"typeDefinition":"ns=1;i=6388"},{"browseName":"1:Locked","dataType":"Boolean","displayName":[{"value":"Locked"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6497","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6294"}],"typeDefinition":"i=68"},{"browseName":"1:LockingClient","dataType":"String","displayName":[{"value":"LockingClient"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6296","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6294"}],"typeDefinition":"i=68"},{"browseName":"1:LockingUser","dataType":"String","displayName":[{"value":"LockingUser"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6297","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6294"}],"typeDefinition":"i=68"},{"browseName":"1:RemainingLockTime","dataType":"i=290","displayName":[{"value":"RemainingLockTime"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6298","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6294"}],"typeDefinition":"i=68"},{"browseName":"1:InitLock","category":["DI Locking"],"displayName":[{"value":"InitLock"}],"methodDeclarationId":"ns=1;i=6393","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6299","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasProperty","target":"ns=1;i=6300"},{"referenceType":"HasProperty","target":"ns=1;i=6301"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6294"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6300","parentNodeId":"ns=1;i=6299","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6299"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EContext\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6301","parentNodeId":"ns=1;i=6299","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6299"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EInitLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:RenewLock","category":["DI Locking"],"displayName":[{"value":"RenewLock"}],"methodDeclarationId":"ns=1;i=6396","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6302","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasProperty","target":"ns=1;i=6303"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6294"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6303","parentNodeId":"ns=1;i=6302","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6302"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ERenewLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ExitLock","category":["DI Locking"],"displayName":[{"value":"ExitLock"}],"methodDeclarationId":"ns=1;i=6398","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6304","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasProperty","target":"ns=1;i=6305"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6294"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6305","parentNodeId":"ns=1;i=6304","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6304"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EExitLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:BreakLock","category":["DI Locking"],"displayName":[{"value":"BreakLock"}],"methodDeclarationId":"ns=1;i=6400","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6306","parentNodeId":"ns=1;i=6294","references":[{"referenceType":"HasProperty","target":"ns=1;i=6307"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6294"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6307","parentNodeId":"ns=1;i=6306","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6306"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EBreakLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ConnectionPointType","category":["DI ConnectionPoint"],"description":[{"value":"Represents the interface (interface card) of a Device to a Network."}],"displayName":[{"value":"ConnectionPointType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/5.4","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=6308","references":[{"referenceType":"HasComponent","target":"ns=1;i=6354"},{"referenceType":"HasComponent","target":"ns=1;i=6499"},{"referenceType":"ns=1;i=6030","target":"ns=1;i=6599"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1001"}],"superType":"ns=1;i=1001"},{"browseName":"1:NetworkAddress","description":[{"value":"The address of the device on this network."}],"displayName":[{"value":"NetworkAddress"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=6354","parentNodeId":"ns=1;i=6308","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6308"}],"typeDefinition":"ns=1;i=1005"},{"browseName":"1:\u003CProfileIdentifier\u003E","displayName":[{"value":"\u003CProfileIdentifier\u003E"}],"nodeClass":"Object","nodeId":"ns=1;i=6499","parentNodeId":"ns=1;i=6308","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6308"}],"symbolicName":"ProfileIdentifier","typeDefinition":"ns=1;i=1006"},{"browseName":"1:\u003CNetworkIdentifier\u003E","displayName":[{"value":"\u003CNetworkIdentifier\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=6599","parentNodeId":"ns=1;i=6308","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=6247"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"ns=1;i=6030","target":"ns=1;i=6308"}],"symbolicName":"NetworkIdentifier","typeDefinition":"ns=1;i=6247"},{"browseName":"1:FetchResultDataType","category":["DI Offline"],"definition":{"name":"1:FetchResultDataType"},"displayName":[{"value":"FetchResultDataType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.6","isAbstract":true,"nodeClass":"DataType","nodeId":"ns=1;i=6522","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=22"}],"superType":"i=22"},{"browseName":"1:TransferResultErrorDataType","category":["DI Offline"],"definition":{"fields":[{"dataType":"i=6","name":"Status"},{"dataType":"i=25","name":"Diagnostics"}],"name":"1:TransferResultErrorDataType"},"displayName":[{"value":"TransferResultErrorDataType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.6","nodeClass":"DataType","nodeId":"ns=1;i=15888","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=6522"}],"superType":"ns=1;i=6522"},{"browseName":"1:TransferResultDataDataType","category":["DI Offline"],"definition":{"fields":[{"dataType":"i=6","name":"SequenceNumber"},{"dataType":"i=1","name":"EndOfResults"},{"dataType":"ns=1;i=6525","name":"ParameterDefs","valueRank":1}],"name":"1:TransferResultDataDataType"},"displayName":[{"value":"TransferResultDataDataType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.6","nodeClass":"DataType","nodeId":"ns=1;i=15889","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=6522"}],"superType":"ns=1;i=6522"},{"browseName":"1:ParameterResultDataType","definition":{"fields":[{"dataType":"i=20","name":"NodePath","valueRank":1},{"dataType":"i=19","name":"StatusCode"},{"dataType":"i=25","name":"Diagnostics"}],"name":"1:ParameterResultDataType"},"displayName":[{"value":"ParameterResultDataType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.6","nodeClass":"DataType","nodeId":"ns=1;i=6525","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=22"}],"superType":"i=22"},{"browseName":"1:TransferServicesType","category":["DI Offline"],"displayName":[{"value":"TransferServicesType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.2","nodeClass":"ObjectType","nodeId":"ns=1;i=6526","references":[{"referenceType":"HasComponent","target":"ns=1;i=6527"},{"referenceType":"HasComponent","target":"ns=1;i=6529"},{"referenceType":"HasComponent","target":"ns=1;i=6531"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:TransferToDevice","category":["DI Offline"],"displayName":[{"value":"TransferToDevice"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.4","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6527","parentNodeId":"ns=1;i=6526","references":[{"referenceType":"HasProperty","target":"ns=1;i=6528"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6526"}]},{"arrayDimensions":"2","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6528","parentNodeId":"ns=1;i=6527","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6527"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ETransferID\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EInitTransferStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:TransferFromDevice","category":["DI Offline"],"displayName":[{"value":"TransferFromDevice"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.5","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6529","parentNodeId":"ns=1;i=6526","references":[{"referenceType":"HasProperty","target":"ns=1;i=6530"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6526"}]},{"arrayDimensions":"2","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6530","parentNodeId":"ns=1;i=6529","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6529"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ETransferID\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EInitTransferStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:FetchTransferResultData","category":["DI Offline"],"displayName":[{"value":"FetchTransferResultData"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/6.4.6","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6531","parentNodeId":"ns=1;i=6526","references":[{"referenceType":"HasProperty","target":"ns=1;i=6532"},{"referenceType":"HasProperty","target":"ns=1;i=6533"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6526"}]},{"arrayDimensions":"4","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6532","parentNodeId":"ns=1;i=6531","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6531"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ETransferID\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ESequenceNumber\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EMaxParameterResultsToReturn\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EOmitGoodResults\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=1\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6533","parentNodeId":"ns=1;i=6531","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6531"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFetchResultData\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=22\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:MaxInactiveLockTime","dataType":"i=290","description":[{"value":"Server-specific period of time in milliseconds until the Server will revoke a lock."}],"displayName":[{"value":"MaxInactiveLockTime"}],"nodeClass":"Variable","nodeId":"ns=1;i=6387","references":[{"isForward":false,"referenceType":"HasProperty","target":"i=2268"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:LockingServicesType","category":["DI Locking"],"description":[{"value":"An interface for Locking."}],"displayName":[{"value":"LockingServicesType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/7.2","nodeClass":"ObjectType","nodeId":"ns=1;i=6388","references":[{"referenceType":"HasProperty","target":"ns=1;i=15890"},{"referenceType":"HasProperty","target":"ns=1;i=6534"},{"referenceType":"HasProperty","target":"ns=1;i=6390"},{"referenceType":"HasProperty","target":"ns=1;i=6391"},{"referenceType":"HasProperty","target":"ns=1;i=6392"},{"referenceType":"HasComponent","target":"ns=1;i=6393"},{"referenceType":"HasComponent","target":"ns=1;i=6396"},{"referenceType":"HasComponent","target":"ns=1;i=6398"},{"referenceType":"HasComponent","target":"ns=1;i=6400"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"DefaultInstanceBrowseName","dataType":"QualifiedName","displayName":[{"value":"DefaultInstanceBrowseName"}],"nodeClass":"Variable","nodeId":"ns=1;i=15890","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6388"}],"typeDefinition":"i=68","valueXml":"\u003CQualifiedName xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CNamespaceIndex\u003E1\u003C/NamespaceIndex\u003E\n \u003CName\u003ELock\u003C/Name\u003E\n \u003C/QualifiedName\u003E"},{"browseName":"1:Locked","dataType":"Boolean","displayName":[{"value":"Locked"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6534","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6388"}],"typeDefinition":"i=68"},{"browseName":"1:LockingClient","dataType":"String","displayName":[{"value":"LockingClient"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6390","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6388"}],"typeDefinition":"i=68"},{"browseName":"1:LockingUser","dataType":"String","displayName":[{"value":"LockingUser"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6391","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6388"}],"typeDefinition":"i=68"},{"browseName":"1:RemainingLockTime","dataType":"i=290","displayName":[{"value":"RemainingLockTime"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6392","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6388"}],"typeDefinition":"i=68"},{"browseName":"1:InitLock","category":["DI Locking"],"displayName":[{"value":"InitLock"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/7.5","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6393","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasProperty","target":"ns=1;i=6394"},{"referenceType":"HasProperty","target":"ns=1;i=6395"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6388"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6394","parentNodeId":"ns=1;i=6393","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6393"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EContext\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6395","parentNodeId":"ns=1;i=6393","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6393"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EInitLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:RenewLock","category":["DI Locking"],"displayName":[{"value":"RenewLock"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/7.7","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6396","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasProperty","target":"ns=1;i=6397"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6388"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6397","parentNodeId":"ns=1;i=6396","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6396"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ERenewLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ExitLock","category":["DI Locking"],"displayName":[{"value":"ExitLock"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/7.6","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6398","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasProperty","target":"ns=1;i=6399"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6388"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6399","parentNodeId":"ns=1;i=6398","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6398"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EExitLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:BreakLock","category":["DI Locking"],"displayName":[{"value":"BreakLock"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/7.8","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=6400","parentNodeId":"ns=1;i=6388","references":[{"referenceType":"HasProperty","target":"ns=1;i=6401"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6388"}]},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6401","parentNodeId":"ns=1;i=6400","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6400"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EBreakLockStatus\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:SoftwareUpdateType","category":["DI SU Software Update"],"displayName":[{"value":"SoftwareUpdateType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.1/#8.4.1.1","nodeClass":"ObjectType","nodeId":"ns=1;i=1","references":[{"referenceType":"HasComponent","target":"ns=1;i=2"},{"referenceType":"HasComponent","target":"ns=1;i=4"},{"referenceType":"HasComponent","target":"ns=1;i=40"},{"referenceType":"HasComponent","target":"ns=1;i=76"},{"referenceType":"HasComponent","target":"ns=1;i=98"},{"referenceType":"HasComponent","target":"ns=1;i=122"},{"referenceType":"HasComponent","target":"ns=1;i=133"},{"referenceType":"HasComponent","target":"ns=1;i=402"},{"referenceType":"HasProperty","target":"ns=1;i=134"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:Loading","displayName":[{"value":"Loading"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=2","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=135"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"ns=1;i=135"},{"browseName":"1:PrepareForUpdate","displayName":[{"value":"PrepareForUpdate"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=4","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasComponent","target":"ns=1;i=5"},{"referenceType":"HasComponent","target":"ns=1;i=19"},{"referenceType":"HasComponent","target":"ns=1;i=20"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=213"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"ns=1;i=213"},{"browseName":"CurrentState","dataType":"LocalizedText","displayName":[{"value":"CurrentState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=5","parentNodeId":"ns=1;i=4","references":[{"referenceType":"HasProperty","target":"ns=1;i=6"},{"referenceType":"HasTypeDefinition","target":"i=2760"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=4"}],"typeDefinition":"i=2760"},{"browseName":"Id","dataType":"NodeId","displayName":[{"value":"Id"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6","parentNodeId":"ns=1;i=5","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5"}],"typeDefinition":"i=68"},{"browseName":"1:Prepare","displayName":[{"value":"Prepare"}],"methodDeclarationId":"ns=1;i=228","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=19","parentNodeId":"ns=1;i=4","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=4"}]},{"browseName":"1:Abort","displayName":[{"value":"Abort"}],"methodDeclarationId":"ns=1;i=229","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=20","parentNodeId":"ns=1;i=4","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=4"}]},{"browseName":"1:Installation","displayName":[{"value":"Installation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=40","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasComponent","target":"ns=1;i=41"},{"referenceType":"HasComponent","target":"ns=1;i=61"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=249"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"ns=1;i=249"},{"browseName":"CurrentState","dataType":"LocalizedText","displayName":[{"value":"CurrentState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=41","parentNodeId":"ns=1;i=40","references":[{"referenceType":"HasProperty","target":"ns=1;i=42"},{"referenceType":"HasTypeDefinition","target":"i=2760"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=40"}],"typeDefinition":"i=2760"},{"browseName":"Id","dataType":"NodeId","displayName":[{"value":"Id"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=42","parentNodeId":"ns=1;i=41","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=41"}],"typeDefinition":"i=68"},{"browseName":"1:Resume","displayName":[{"value":"Resume"}],"methodDeclarationId":"ns=1;i=270","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=61","parentNodeId":"ns=1;i=40","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=40"}]},{"browseName":"1:PowerCycle","displayName":[{"value":"PowerCycle"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=76","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasComponent","target":"ns=1;i=77"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=285"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"ns=1;i=285"},{"browseName":"CurrentState","dataType":"LocalizedText","displayName":[{"value":"CurrentState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=77","parentNodeId":"ns=1;i=76","references":[{"referenceType":"HasProperty","target":"ns=1;i=78"},{"referenceType":"HasTypeDefinition","target":"i=2760"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=76"}],"typeDefinition":"i=2760"},{"browseName":"Id","dataType":"NodeId","displayName":[{"value":"Id"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=78","parentNodeId":"ns=1;i=77","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=77"}],"typeDefinition":"i=68"},{"browseName":"1:Confirmation","displayName":[{"value":"Confirmation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=98","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasComponent","target":"ns=1;i=99"},{"referenceType":"HasComponent","target":"ns=1;i=112"},{"referenceType":"HasComponent","target":"ns=1;i=113"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=307"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"ns=1;i=307"},{"browseName":"CurrentState","dataType":"LocalizedText","displayName":[{"value":"CurrentState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=99","parentNodeId":"ns=1;i=98","references":[{"referenceType":"HasProperty","target":"ns=1;i=100"},{"referenceType":"HasTypeDefinition","target":"i=2760"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=98"}],"typeDefinition":"i=2760"},{"browseName":"Id","dataType":"NodeId","displayName":[{"value":"Id"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=100","parentNodeId":"ns=1;i=99","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=99"}],"typeDefinition":"i=68"},{"browseName":"1:Confirm","displayName":[{"value":"Confirm"}],"methodDeclarationId":"ns=1;i=321","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=112","parentNodeId":"ns=1;i=98","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=98"}]},{"browseName":"1:ConfirmationTimeout","dataType":"i=290","displayName":[{"value":"ConfirmationTimeout"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=113","parentNodeId":"ns=1;i=98","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=98"}],"typeDefinition":"i=63"},{"browseName":"1:Parameters","displayName":[{"value":"Parameters"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=122","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasProperty","target":"ns=1;i=123"},{"referenceType":"HasComponent","target":"ns=1;i=124"},{"referenceType":"HasComponent","target":"ns=1;i=127"},{"referenceType":"HasComponent","target":"ns=1;i=130"},{"referenceType":"HasTypeDefinition","target":"i=15744"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"i=15744"},{"browseName":"ClientProcessingTimeout","dataType":"i=290","displayName":[{"value":"ClientProcessingTimeout"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=123","parentNodeId":"ns=1;i=122","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=122"}],"typeDefinition":"i=68"},{"browseName":"GenerateFileForRead","displayName":[{"value":"GenerateFileForRead"}],"methodDeclarationId":"i=15746","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=124","parentNodeId":"ns=1;i=122","references":[{"referenceType":"HasProperty","target":"ns=1;i=125"},{"referenceType":"HasProperty","target":"ns=1;i=126"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=122"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=125","parentNodeId":"ns=1;i=124","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=124"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EGenerateOptions\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=24\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"3","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=126","parentNodeId":"ns=1;i=124","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=124"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ECompletionStateMachine\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"GenerateFileForWrite","displayName":[{"value":"GenerateFileForWrite"}],"methodDeclarationId":"i=15749","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=127","parentNodeId":"ns=1;i=122","references":[{"referenceType":"HasProperty","target":"ns=1;i=128"},{"referenceType":"HasProperty","target":"ns=1;i=129"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=122"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=128","parentNodeId":"ns=1;i=127","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=127"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EGenerateOptions\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=24\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"2","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=129","parentNodeId":"ns=1;i=127","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=127"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"CloseAndCommit","displayName":[{"value":"CloseAndCommit"}],"methodDeclarationId":"i=15751","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=130","parentNodeId":"ns=1;i=122","references":[{"referenceType":"HasProperty","target":"ns=1;i=131"},{"referenceType":"HasProperty","target":"ns=1;i=132"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=122"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=131","parentNodeId":"ns=1;i=130","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=130"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=132","parentNodeId":"ns=1;i=130","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=130"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ECompletionStateMachine\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:UpdateStatus","dataType":"LocalizedText","displayName":[{"value":"UpdateStatus"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=133","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"i=63"},{"browseName":"1:VendorErrorCode","dataType":"Int32","displayName":[{"value":"VendorErrorCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=402","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1"}],"typeDefinition":"i=63"},{"browseName":"DefaultInstanceBrowseName","dataType":"QualifiedName","displayName":[{"value":"DefaultInstanceBrowseName"}],"nodeClass":"Variable","nodeId":"ns=1;i=134","parentNodeId":"ns=1;i=1","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1"}],"typeDefinition":"i=68","valueXml":"\u003CQualifiedName xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CNamespaceIndex\u003E1\u003C/NamespaceIndex\u003E\n \u003CName\u003ESoftwareUpdate\u003C/Name\u003E\n \u003C/QualifiedName\u003E"},{"browseName":"1:SoftwareLoadingType","category":["DI SU Software Update"],"displayName":[{"value":"SoftwareLoadingType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.2/#8.4.2.1","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=135","references":[{"referenceType":"HasComponent","target":"ns=1;i=136"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:UpdateKey","dataType":"String","displayName":[{"value":"UpdateKey"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=136","parentNodeId":"ns=1;i=135","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=135"}],"typeDefinition":"i=63"},{"browseName":"1:PackageLoadingType","category":["DI SU Software Update"],"displayName":[{"value":"PackageLoadingType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.3/#8.4.3.1","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=137","references":[{"referenceType":"HasComponent","target":"ns=1;i=139"},{"referenceType":"HasComponent","target":"ns=1;i=140"},{"referenceType":"HasComponent","target":"ns=1;i=151"},{"referenceType":"HasProperty","target":"ns=1;i=152"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=135"}],"superType":"ns=1;i=135"},{"browseName":"1:CurrentVersion","displayName":[{"value":"CurrentVersion"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=139","parentNodeId":"ns=1;i=137","references":[{"referenceType":"HasProperty","target":"ns=1;i=345"},{"referenceType":"HasProperty","target":"ns=1;i=346"},{"referenceType":"HasProperty","target":"ns=1;i=347"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=212"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=137"}],"typeDefinition":"ns=1;i=212"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=345","parentNodeId":"ns=1;i=139","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=139"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=346","parentNodeId":"ns=1;i=139","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=139"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=347","parentNodeId":"ns=1;i=139","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=139"}],"typeDefinition":"i=68"},{"browseName":"1:FileTransfer","displayName":[{"value":"FileTransfer"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=140","parentNodeId":"ns=1;i=137","references":[{"referenceType":"HasProperty","target":"ns=1;i=141"},{"referenceType":"HasComponent","target":"ns=1;i=142"},{"referenceType":"HasComponent","target":"ns=1;i=145"},{"referenceType":"HasComponent","target":"ns=1;i=148"},{"referenceType":"HasTypeDefinition","target":"i=15744"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=137"}],"typeDefinition":"i=15744"},{"browseName":"ClientProcessingTimeout","dataType":"i=290","displayName":[{"value":"ClientProcessingTimeout"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=141","parentNodeId":"ns=1;i=140","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=140"}],"typeDefinition":"i=68"},{"browseName":"GenerateFileForRead","displayName":[{"value":"GenerateFileForRead"}],"methodDeclarationId":"i=15746","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=142","parentNodeId":"ns=1;i=140","references":[{"referenceType":"HasProperty","target":"ns=1;i=143"},{"referenceType":"HasProperty","target":"ns=1;i=144"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=140"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=143","parentNodeId":"ns=1;i=142","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=142"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EGenerateOptions\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=24\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"3","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=144","parentNodeId":"ns=1;i=142","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=142"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ECompletionStateMachine\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"GenerateFileForWrite","displayName":[{"value":"GenerateFileForWrite"}],"methodDeclarationId":"i=15749","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=145","parentNodeId":"ns=1;i=140","references":[{"referenceType":"HasProperty","target":"ns=1;i=146"},{"referenceType":"HasProperty","target":"ns=1;i=147"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=140"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=146","parentNodeId":"ns=1;i=145","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=145"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EGenerateOptions\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=24\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"2","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=147","parentNodeId":"ns=1;i=145","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=145"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"CloseAndCommit","displayName":[{"value":"CloseAndCommit"}],"methodDeclarationId":"i=15751","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=148","parentNodeId":"ns=1;i=140","references":[{"referenceType":"HasProperty","target":"ns=1;i=149"},{"referenceType":"HasProperty","target":"ns=1;i=150"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=140"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=149","parentNodeId":"ns=1;i=148","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=148"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=150","parentNodeId":"ns=1;i=148","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=148"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ECompletionStateMachine\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ErrorMessage","dataType":"LocalizedText","displayName":[{"value":"ErrorMessage"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=151","parentNodeId":"ns=1;i=137","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=137"}],"typeDefinition":"i=63"},{"browseName":"1:WriteBlockSize","dataType":"UInt32","displayName":[{"value":"WriteBlockSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=152","parentNodeId":"ns=1;i=137","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=137"}],"typeDefinition":"i=68"},{"browseName":"1:DirectLoadingType","category":["DI SU DirectLoading"],"displayName":[{"value":"DirectLoadingType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.4/#8.4.4.1","nodeClass":"ObjectType","nodeId":"ns=1;i=153","references":[{"referenceType":"HasComponent","target":"ns=1;i=169"},{"referenceType":"HasProperty","target":"ns=1;i=170"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=137"}],"superType":"ns=1;i=137"},{"browseName":"1:UpdateBehavior","dataType":"ns=1;i=333","displayName":[{"value":"UpdateBehavior"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=169","parentNodeId":"ns=1;i=153","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=153"}],"typeDefinition":"i=63"},{"browseName":"1:WriteTimeout","dataType":"i=290","displayName":[{"value":"WriteTimeout"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=170","parentNodeId":"ns=1;i=153","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=153"}],"typeDefinition":"i=68"},{"browseName":"1:CachedLoadingType","category":["DI SU CachedLoading"],"displayName":[{"value":"CachedLoadingType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.5/#8.4.5.1","nodeClass":"ObjectType","nodeId":"ns=1;i=171","references":[{"referenceType":"HasComponent","target":"ns=1;i=187"},{"referenceType":"HasComponent","target":"ns=1;i=188"},{"referenceType":"HasComponent","target":"ns=1;i=189"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=137"}],"superType":"ns=1;i=137"},{"browseName":"1:PendingVersion","displayName":[{"value":"PendingVersion"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=187","parentNodeId":"ns=1;i=171","references":[{"referenceType":"HasProperty","target":"ns=1;i=366"},{"referenceType":"HasProperty","target":"ns=1;i=367"},{"referenceType":"HasProperty","target":"ns=1;i=368"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=212"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=171"}],"typeDefinition":"ns=1;i=212"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=366","parentNodeId":"ns=1;i=187","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=187"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=367","parentNodeId":"ns=1;i=187","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=187"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=368","parentNodeId":"ns=1;i=187","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=187"}],"typeDefinition":"i=68"},{"browseName":"1:FallbackVersion","displayName":[{"value":"FallbackVersion"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=188","parentNodeId":"ns=1;i=171","references":[{"referenceType":"HasProperty","target":"ns=1;i=373"},{"referenceType":"HasProperty","target":"ns=1;i=374"},{"referenceType":"HasProperty","target":"ns=1;i=375"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=212"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=171"}],"typeDefinition":"ns=1;i=212"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=373","parentNodeId":"ns=1;i=188","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=188"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=374","parentNodeId":"ns=1;i=188","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=188"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=375","parentNodeId":"ns=1;i=188","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=188"}],"typeDefinition":"i=68"},{"browseName":"1:GetUpdateBehavior","category":["DI SU CachedLoading"],"displayName":[{"value":"GetUpdateBehavior"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.5/#8.4.5.5","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=189","parentNodeId":"ns=1;i=171","references":[{"referenceType":"HasProperty","target":"ns=1;i=190"},{"referenceType":"HasProperty","target":"ns=1;i=191"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=171"}]},{"arrayDimensions":"3","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=190","parentNodeId":"ns=1;i=189","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=189"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EManufacturerUri\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ESoftwareRevision\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EPatchIdentifiers\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E1\u003C/ValueRank\u003E\n \u003CArrayDimensions\u003E\n \u003CUInt32\u003E0\u003C/UInt32\u003E\n \u003C/ArrayDimensions\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=191","parentNodeId":"ns=1;i=189","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=189"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EUpdateBehavior\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ens=1;i=333\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:FileSystemLoadingType","category":["DI SU FileSystem Loading"],"displayName":[{"value":"FileSystemLoadingType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.6/#8.4.6.1","nodeClass":"ObjectType","nodeId":"ns=1;i=192","references":[{"referenceType":"HasComponent","target":"ns=1;i=194"},{"referenceType":"HasComponent","target":"ns=1;i=206"},{"referenceType":"HasComponent","target":"ns=1;i=209"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=135"}],"superType":"ns=1;i=135"},{"browseName":"FileSystem","displayName":[{"value":"FileSystem"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=194","parentNodeId":"ns=1;i=192","references":[{"referenceType":"HasComponent","target":"ns=1;i=195"},{"referenceType":"HasComponent","target":"ns=1;i=198"},{"referenceType":"HasComponent","target":"ns=1;i=201"},{"referenceType":"HasComponent","target":"ns=1;i=203"},{"referenceType":"HasTypeDefinition","target":"i=13353"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=192"}],"typeDefinition":"i=13353"},{"browseName":"CreateDirectory","displayName":[{"value":"CreateDirectory"}],"methodDeclarationId":"i=13387","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=195","parentNodeId":"ns=1;i=194","references":[{"referenceType":"HasProperty","target":"ns=1;i=196"},{"referenceType":"HasProperty","target":"ns=1;i=197"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=194"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=196","parentNodeId":"ns=1;i=195","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=195"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EDirectoryName\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=197","parentNodeId":"ns=1;i=195","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=195"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EDirectoryNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"CreateFile","displayName":[{"value":"CreateFile"}],"methodDeclarationId":"i=13390","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=198","parentNodeId":"ns=1;i=194","references":[{"referenceType":"HasProperty","target":"ns=1;i=199"},{"referenceType":"HasProperty","target":"ns=1;i=200"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=194"}]},{"arrayDimensions":"2","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=199","parentNodeId":"ns=1;i=198","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=198"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileName\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ERequestFileOpen\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=1\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"2","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=200","parentNodeId":"ns=1;i=198","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=198"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EFileHandle\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=7\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"Delete","displayName":[{"value":"Delete"}],"methodDeclarationId":"i=13393","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=201","parentNodeId":"ns=1;i=194","references":[{"referenceType":"HasProperty","target":"ns=1;i=202"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=194"}],"symbolicName":"DeleteFileSystemObject"},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=202","parentNodeId":"ns=1;i=201","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=201"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EObjectToDelete\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"MoveOrCopy","displayName":[{"value":"MoveOrCopy"}],"methodDeclarationId":"i=13395","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=203","parentNodeId":"ns=1;i=194","references":[{"referenceType":"HasProperty","target":"ns=1;i=204"},{"referenceType":"HasProperty","target":"ns=1;i=205"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=194"}]},{"arrayDimensions":"4","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=204","parentNodeId":"ns=1;i=203","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=203"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EObjectToMoveOrCopy\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ETargetDirectory\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ECreateCopy\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=1\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ENewName\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=205","parentNodeId":"ns=1;i=203","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=203"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ENewNodeId\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:GetUpdateBehavior","category":["DI SU FileSystem Loading"],"displayName":[{"value":"GetUpdateBehavior"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.6/#8.4.6.3","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=206","parentNodeId":"ns=1;i=192","references":[{"referenceType":"HasProperty","target":"ns=1;i=207"},{"referenceType":"HasProperty","target":"ns=1;i=208"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=192"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=207","parentNodeId":"ns=1;i=206","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=206"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ENodeIds\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E1\u003C/ValueRank\u003E\n \u003CArrayDimensions\u003E\n \u003CUInt32\u003E0\u003C/UInt32\u003E\n \u003C/ArrayDimensions\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"1","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=208","parentNodeId":"ns=1;i=206","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=206"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EUpdateBehavior\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ens=1;i=333\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:ValidateFiles","category":["DI SU FileSystem Loading"],"displayName":[{"value":"ValidateFiles"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.6/#8.4.6.4","modellingRule":"Optional","nodeClass":"Method","nodeId":"ns=1;i=209","parentNodeId":"ns=1;i=192","references":[{"referenceType":"HasProperty","target":"ns=1;i=210"},{"referenceType":"HasProperty","target":"ns=1;i=211"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=192"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=210","parentNodeId":"ns=1;i=209","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=209"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ENodeIds\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E1\u003C/ValueRank\u003E\n \u003CArrayDimensions\u003E\n \u003CUInt32\u003E0\u003C/UInt32\u003E\n \u003C/ArrayDimensions\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"arrayDimensions":"2","browseName":"OutputArguments","dataType":"i=296","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=211","parentNodeId":"ns=1;i=209","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=209"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EErrorCode\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=6\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EErrorMessage\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=21\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:SoftwareVersionType","category":["DI SU Software Update"],"displayName":[{"value":"SoftwareVersionType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.7/#8.4.7.1","nodeClass":"ObjectType","nodeId":"ns=1;i=212","references":[{"referenceType":"HasProperty","target":"ns=1;i=380"},{"referenceType":"HasProperty","target":"ns=1;i=381"},{"referenceType":"HasProperty","target":"ns=1;i=382"},{"referenceType":"HasProperty","target":"ns=1;i=383"},{"referenceType":"HasProperty","target":"ns=1;i=384"},{"referenceType":"HasProperty","target":"ns=1;i=385"},{"referenceType":"HasProperty","target":"ns=1;i=386"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=380","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68"},{"browseName":"1:ManufacturerUri","dataType":"String","displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=381","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68"},{"browseName":"1:SoftwareRevision","dataType":"String","displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=382","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68"},{"arrayDimensions":"0","browseName":"1:PatchIdentifiers","dataType":"String","displayName":[{"value":"PatchIdentifiers"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=383","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68","valueRank":1},{"browseName":"1:ReleaseDate","dataType":"DateTime","displayName":[{"value":"ReleaseDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=384","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68"},{"browseName":"1:ChangeLogReference","dataType":"String","displayName":[{"value":"ChangeLogReference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=385","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68"},{"browseName":"1:Hash","dataType":"ByteString","displayName":[{"value":"Hash"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=386","parentNodeId":"ns=1;i=212","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=212"}],"typeDefinition":"i=68"},{"browseName":"1:PrepareForUpdateStateMachineType","category":["DI SU PrepareForUpdate"],"displayName":[{"value":"PrepareForUpdateStateMachineType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.8/#8.4.8.1","nodeClass":"ObjectType","nodeId":"ns=1;i=213","references":[{"referenceType":"HasComponent","target":"ns=1;i=227"},{"referenceType":"HasComponent","target":"ns=1;i=228"},{"referenceType":"HasComponent","target":"ns=1;i=229"},{"referenceType":"HasComponent","target":"ns=1;i=230"},{"referenceType":"HasComponent","target":"ns=1;i=231"},{"referenceType":"HasComponent","target":"ns=1;i=233"},{"referenceType":"HasComponent","target":"ns=1;i=235"},{"referenceType":"HasComponent","target":"ns=1;i=237"},{"referenceType":"HasComponent","target":"ns=1;i=239"},{"referenceType":"HasComponent","target":"ns=1;i=241"},{"referenceType":"HasComponent","target":"ns=1;i=243"},{"referenceType":"HasComponent","target":"ns=1;i=245"},{"referenceType":"HasComponent","target":"ns=1;i=247"},{"isForward":false,"referenceType":"HasSubtype","target":"i=2771"}],"superType":"i=2771"},{"browseName":"1:PercentComplete","dataType":"Byte","displayName":[{"value":"PercentComplete"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=227","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=63"},{"browseName":"1:Prepare","displayName":[{"value":"Prepare"}],"modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=228","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}]},{"browseName":"1:Abort","displayName":[{"value":"Abort"}],"modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=229","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}]},{"browseName":"1:Resume","displayName":[{"value":"Resume"}],"modellingRule":"Optional","nodeClass":"Method","nodeId":"ns=1;i=230","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}]},{"browseName":"1:Idle","displayName":[{"value":"Idle"}],"nodeClass":"Object","nodeId":"ns=1;i=231","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=232"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=239"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=241"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=247"},{"referenceType":"HasTypeDefinition","target":"i=2309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2309"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=232","parentNodeId":"ns=1;i=231","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=231"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1\u003C/UInt32\u003E"},{"browseName":"1:Preparing","displayName":[{"value":"Preparing"}],"nodeClass":"Object","nodeId":"ns=1;i=233","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=234"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=239"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=241"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=243"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=234","parentNodeId":"ns=1;i=233","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=233"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2\u003C/UInt32\u003E"},{"browseName":"1:PreparedForUpdate","displayName":[{"value":"PreparedForUpdate"}],"nodeClass":"Object","nodeId":"ns=1;i=235","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=236"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=243"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=245"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=236","parentNodeId":"ns=1;i=235","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=235"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E3\u003C/UInt32\u003E"},{"browseName":"1:Resuming","displayName":[{"value":"Resuming"}],"nodeClass":"Object","nodeId":"ns=1;i=237","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=238"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=245"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=247"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=238","parentNodeId":"ns=1;i=237","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=237"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E4\u003C/UInt32\u003E"},{"browseName":"1:IdleToPreparing","displayName":[{"value":"IdleToPreparing"}],"nodeClass":"Object","nodeId":"ns=1;i=239","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=240"},{"referenceType":"FromState","target":"ns=1;i=231"},{"referenceType":"ToState","target":"ns=1;i=233"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=240","parentNodeId":"ns=1;i=239","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=239"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E12\u003C/UInt32\u003E"},{"browseName":"1:PreparingToIdle","displayName":[{"value":"PreparingToIdle"}],"nodeClass":"Object","nodeId":"ns=1;i=241","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=242"},{"referenceType":"ToState","target":"ns=1;i=231"},{"referenceType":"FromState","target":"ns=1;i=233"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=242","parentNodeId":"ns=1;i=241","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=241"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E21\u003C/UInt32\u003E"},{"browseName":"1:PreparingToPreparedForUpdate","displayName":[{"value":"PreparingToPreparedForUpdate"}],"nodeClass":"Object","nodeId":"ns=1;i=243","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=244"},{"referenceType":"FromState","target":"ns=1;i=233"},{"referenceType":"ToState","target":"ns=1;i=235"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=244","parentNodeId":"ns=1;i=243","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=243"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E23\u003C/UInt32\u003E"},{"browseName":"1:PreparedForUpdateToResuming","displayName":[{"value":"PreparedForUpdateToResuming"}],"nodeClass":"Object","nodeId":"ns=1;i=245","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=246"},{"referenceType":"FromState","target":"ns=1;i=235"},{"referenceType":"ToState","target":"ns=1;i=237"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=246","parentNodeId":"ns=1;i=245","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=245"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E34\u003C/UInt32\u003E"},{"browseName":"1:ResumingToIdle","displayName":[{"value":"ResumingToIdle"}],"nodeClass":"Object","nodeId":"ns=1;i=247","parentNodeId":"ns=1;i=213","references":[{"referenceType":"HasProperty","target":"ns=1;i=248"},{"referenceType":"ToState","target":"ns=1;i=231"},{"referenceType":"FromState","target":"ns=1;i=237"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=213"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=248","parentNodeId":"ns=1;i=247","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=247"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E41\u003C/UInt32\u003E"},{"browseName":"1:InstallationStateMachineType","category":["DI SU Software Update"],"displayName":[{"value":"InstallationStateMachineType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.9/#8.4.9.1","nodeClass":"ObjectType","nodeId":"ns=1;i=249","references":[{"referenceType":"HasComponent","target":"ns=1;i=263"},{"referenceType":"HasComponent","target":"ns=1;i=264"},{"referenceType":"HasComponent","target":"ns=1;i=265"},{"referenceType":"HasComponent","target":"ns=1;i=268"},{"referenceType":"HasComponent","target":"ns=1;i=270"},{"referenceType":"HasComponent","target":"ns=1;i=271"},{"referenceType":"HasComponent","target":"ns=1;i=273"},{"referenceType":"HasComponent","target":"ns=1;i=275"},{"referenceType":"HasComponent","target":"ns=1;i=277"},{"referenceType":"HasComponent","target":"ns=1;i=279"},{"referenceType":"HasComponent","target":"ns=1;i=281"},{"referenceType":"HasComponent","target":"ns=1;i=283"},{"isForward":false,"referenceType":"HasSubtype","target":"i=2771"}],"superType":"i=2771"},{"browseName":"1:PercentComplete","dataType":"Byte","displayName":[{"value":"PercentComplete"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=263","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=63"},{"browseName":"1:InstallationDelay","dataType":"i=290","displayName":[{"value":"InstallationDelay"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=264","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=63"},{"browseName":"1:InstallSoftwarePackage","category":["DI SU Software Update"],"displayName":[{"value":"InstallSoftwarePackage"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.9/#8.4.9.4","modellingRule":"Optional","nodeClass":"Method","nodeId":"ns=1;i=265","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=266"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}]},{"arrayDimensions":"4","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=266","parentNodeId":"ns=1;i=265","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=265"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EManufacturerUri\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ESoftwareRevision\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EPatchIdentifiers\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=12\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E1\u003C/ValueRank\u003E\n \u003CArrayDimensions\u003E\n \u003CUInt32\u003E0\u003C/UInt32\u003E\n \u003C/ArrayDimensions\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003EHash\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=15\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E-1\u003C/ValueRank\u003E\n \u003CArrayDimensions /\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:InstallFiles","category":["DI SU Software Update"],"displayName":[{"value":"InstallFiles"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.9/#8.4.9.5","modellingRule":"Optional","nodeClass":"Method","nodeId":"ns=1;i=268","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=269"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}]},{"arrayDimensions":"1","browseName":"InputArguments","dataType":"i=296","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=269","parentNodeId":"ns=1;i=268","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=268"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfExtensionObject xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CExtensionObject\u003E\n \u003CTypeId\u003E\n \u003CIdentifier\u003Ei=297\u003C/Identifier\u003E\n \u003C/TypeId\u003E\n \u003CBody\u003E\n \u003CArgument\u003E\n \u003CName\u003ENodeIds\u003C/Name\u003E\n \u003CDataType\u003E\n \u003CIdentifier\u003Ei=17\u003C/Identifier\u003E\n \u003C/DataType\u003E\n \u003CValueRank\u003E1\u003C/ValueRank\u003E\n \u003CArrayDimensions\u003E\n \u003CUInt32\u003E0\u003C/UInt32\u003E\n \u003C/ArrayDimensions\u003E\n \u003CDescription /\u003E\n \u003C/Argument\u003E\n \u003C/Body\u003E\n \u003C/ExtensionObject\u003E\n \u003C/ListOfExtensionObject\u003E"},{"browseName":"1:Resume","displayName":[{"value":"Resume"}],"modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=270","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}]},{"browseName":"1:Idle","displayName":[{"value":"Idle"}],"nodeClass":"Object","nodeId":"ns=1;i=271","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=272"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=277"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=279"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=283"},{"referenceType":"HasTypeDefinition","target":"i=2309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2309"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=272","parentNodeId":"ns=1;i=271","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=271"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1\u003C/UInt32\u003E"},{"browseName":"1:Installing","displayName":[{"value":"Installing"}],"nodeClass":"Object","nodeId":"ns=1;i=273","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=274"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=277"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=279"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=281"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=274","parentNodeId":"ns=1;i=273","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=273"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2\u003C/UInt32\u003E"},{"browseName":"1:Error","displayName":[{"value":"Error"}],"nodeClass":"Object","nodeId":"ns=1;i=275","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=276"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=281"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=283"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=276","parentNodeId":"ns=1;i=275","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=275"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E3\u003C/UInt32\u003E"},{"browseName":"1:IdleToInstalling","displayName":[{"value":"IdleToInstalling"}],"nodeClass":"Object","nodeId":"ns=1;i=277","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=387"},{"referenceType":"FromState","target":"ns=1;i=271"},{"referenceType":"ToState","target":"ns=1;i=273"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=387","parentNodeId":"ns=1;i=277","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=277"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E12\u003C/UInt32\u003E"},{"browseName":"1:InstallingToIdle","displayName":[{"value":"InstallingToIdle"}],"nodeClass":"Object","nodeId":"ns=1;i=279","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=280"},{"referenceType":"ToState","target":"ns=1;i=271"},{"referenceType":"FromState","target":"ns=1;i=273"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=280","parentNodeId":"ns=1;i=279","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=279"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E21\u003C/UInt32\u003E"},{"browseName":"1:InstallingToError","displayName":[{"value":"InstallingToError"}],"nodeClass":"Object","nodeId":"ns=1;i=281","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=282"},{"referenceType":"FromState","target":"ns=1;i=273"},{"referenceType":"ToState","target":"ns=1;i=275"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=282","parentNodeId":"ns=1;i=281","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=281"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E23\u003C/UInt32\u003E"},{"browseName":"1:ErrorToIdle","displayName":[{"value":"ErrorToIdle"}],"nodeClass":"Object","nodeId":"ns=1;i=283","parentNodeId":"ns=1;i=249","references":[{"referenceType":"HasProperty","target":"ns=1;i=284"},{"referenceType":"ToState","target":"ns=1;i=271"},{"referenceType":"FromState","target":"ns=1;i=275"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=249"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=284","parentNodeId":"ns=1;i=283","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=283"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E31\u003C/UInt32\u003E"},{"browseName":"1:PowerCycleStateMachineType","category":["DI SU Manual Power Cycle"],"displayName":[{"value":"PowerCycleStateMachineType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.10","nodeClass":"ObjectType","nodeId":"ns=1;i=285","references":[{"referenceType":"HasComponent","target":"ns=1;i=299"},{"referenceType":"HasComponent","target":"ns=1;i=301"},{"referenceType":"HasComponent","target":"ns=1;i=303"},{"referenceType":"HasComponent","target":"ns=1;i=305"},{"isForward":false,"referenceType":"HasSubtype","target":"i=2771"}],"superType":"i=2771"},{"browseName":"1:NotWaitingForPowerCycle","displayName":[{"value":"NotWaitingForPowerCycle"}],"nodeClass":"Object","nodeId":"ns=1;i=299","parentNodeId":"ns=1;i=285","references":[{"referenceType":"HasProperty","target":"ns=1;i=300"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=303"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=305"},{"referenceType":"HasTypeDefinition","target":"i=2309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=285"}],"typeDefinition":"i=2309"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=300","parentNodeId":"ns=1;i=299","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=299"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1\u003C/UInt32\u003E"},{"browseName":"1:WaitingForPowerCycle","displayName":[{"value":"WaitingForPowerCycle"}],"nodeClass":"Object","nodeId":"ns=1;i=301","parentNodeId":"ns=1;i=285","references":[{"referenceType":"HasProperty","target":"ns=1;i=302"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=303"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=305"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=285"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=302","parentNodeId":"ns=1;i=301","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=301"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2\u003C/UInt32\u003E"},{"browseName":"1:NotWaitingForPowerCycleToWaitingForPowerCycle","displayName":[{"value":"NotWaitingForPowerCycleToWaitingForPowerCycle"}],"nodeClass":"Object","nodeId":"ns=1;i=303","parentNodeId":"ns=1;i=285","references":[{"referenceType":"HasProperty","target":"ns=1;i=304"},{"referenceType":"FromState","target":"ns=1;i=299"},{"referenceType":"ToState","target":"ns=1;i=301"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=285"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=304","parentNodeId":"ns=1;i=303","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=303"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E12\u003C/UInt32\u003E"},{"browseName":"1:WaitingForPowerCycleToNotWaitingForPowerCycle","displayName":[{"value":"WaitingForPowerCycleToNotWaitingForPowerCycle"}],"nodeClass":"Object","nodeId":"ns=1;i=305","parentNodeId":"ns=1;i=285","references":[{"referenceType":"HasProperty","target":"ns=1;i=306"},{"referenceType":"ToState","target":"ns=1;i=299"},{"referenceType":"FromState","target":"ns=1;i=301"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=285"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=306","parentNodeId":"ns=1;i=305","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=305"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E21\u003C/UInt32\u003E"},{"browseName":"1:ConfirmationStateMachineType","category":["DI SU Update Confirmation"],"displayName":[{"value":"ConfirmationStateMachineType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.4.11/#8.4.11.1","nodeClass":"ObjectType","nodeId":"ns=1;i=307","references":[{"referenceType":"HasComponent","target":"ns=1;i=321"},{"referenceType":"HasComponent","target":"ns=1;i=322"},{"referenceType":"HasComponent","target":"ns=1;i=323"},{"referenceType":"HasComponent","target":"ns=1;i=325"},{"referenceType":"HasComponent","target":"ns=1;i=327"},{"referenceType":"HasComponent","target":"ns=1;i=329"},{"isForward":false,"referenceType":"HasSubtype","target":"i=2771"}],"superType":"i=2771"},{"browseName":"1:Confirm","displayName":[{"value":"Confirm"}],"modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=321","parentNodeId":"ns=1;i=307","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=307"}]},{"browseName":"1:ConfirmationTimeout","dataType":"i=290","displayName":[{"value":"ConfirmationTimeout"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=322","parentNodeId":"ns=1;i=307","references":[{"referenceType":"HasTypeDefinition","target":"i=63"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=307"}],"typeDefinition":"i=63"},{"browseName":"1:NotWaitingForConfirm","displayName":[{"value":"NotWaitingForConfirm"}],"nodeClass":"Object","nodeId":"ns=1;i=323","parentNodeId":"ns=1;i=307","references":[{"referenceType":"HasProperty","target":"ns=1;i=324"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=327"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=329"},{"referenceType":"HasTypeDefinition","target":"i=2309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=307"}],"typeDefinition":"i=2309"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=324","parentNodeId":"ns=1;i=323","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=323"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1\u003C/UInt32\u003E"},{"browseName":"1:WaitingForConfirm","displayName":[{"value":"WaitingForConfirm"}],"nodeClass":"Object","nodeId":"ns=1;i=325","parentNodeId":"ns=1;i=307","references":[{"referenceType":"HasProperty","target":"ns=1;i=326"},{"isForward":false,"referenceType":"ToState","target":"ns=1;i=327"},{"isForward":false,"referenceType":"FromState","target":"ns=1;i=329"},{"referenceType":"HasTypeDefinition","target":"i=2307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=307"}],"typeDefinition":"i=2307"},{"browseName":"StateNumber","dataType":"UInt32","displayName":[{"value":"StateNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=326","parentNodeId":"ns=1;i=325","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=325"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2\u003C/UInt32\u003E"},{"browseName":"1:NotWaitingForConfirmToWaitingForConfirm","displayName":[{"value":"NotWaitingForConfirmToWaitingForConfirm"}],"nodeClass":"Object","nodeId":"ns=1;i=327","parentNodeId":"ns=1;i=307","references":[{"referenceType":"HasProperty","target":"ns=1;i=328"},{"referenceType":"FromState","target":"ns=1;i=323"},{"referenceType":"ToState","target":"ns=1;i=325"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=307"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=328","parentNodeId":"ns=1;i=327","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=327"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E12\u003C/UInt32\u003E"},{"browseName":"1:WaitingForConfirmToNotWaitingForConfirm","displayName":[{"value":"WaitingForConfirmToNotWaitingForConfirm"}],"nodeClass":"Object","nodeId":"ns=1;i=329","parentNodeId":"ns=1;i=307","references":[{"referenceType":"HasProperty","target":"ns=1;i=330"},{"referenceType":"ToState","target":"ns=1;i=323"},{"referenceType":"FromState","target":"ns=1;i=325"},{"referenceType":"HasEffect","target":"i=2311"},{"referenceType":"HasTypeDefinition","target":"i=2310"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=307"}],"typeDefinition":"i=2310"},{"browseName":"TransitionNumber","dataType":"UInt32","displayName":[{"value":"TransitionNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=330","parentNodeId":"ns=1;i=329","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=329"}],"typeDefinition":"i=68","valueXml":"\u003CUInt32 xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E21\u003C/UInt32\u003E"},{"browseName":"1:SoftwareVersionFileType","category":["DI SU Software Update"],"definition":{"fields":[{"dataType":"i=24","description":[{"value":"The currently used version of the software identified by the CurrentVersion Object."}],"name":"Current","value":0},{"dataType":"i=24","description":[{"value":"The pending version of the software that could be installed identified by the PendingVersion Object."}],"name":"Pending","value":1},{"dataType":"i=24","description":[{"value":"The fallback version of the software identified by the FallbackVersion Object."}],"name":"Fallback","value":2}],"name":"1:SoftwareVersionFileType"},"displayName":[{"value":"SoftwareVersionFileType"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.5.1","nodeClass":"DataType","nodeId":"ns=1;i=331","references":[{"referenceType":"HasProperty","target":"ns=1;i=332"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"3","browseName":"EnumStrings","dataType":"LocalizedText","displayName":[{"value":"EnumStrings"}],"nodeClass":"Variable","nodeId":"ns=1;i=332","parentNodeId":"ns=1;i=331","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=331"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfLocalizedText xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003ECurrent\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EPending\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EFallback\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003C/ListOfLocalizedText\u003E"},{"browseName":"1:UpdateBehavior","category":["DI SU Software Update"],"definition":{"fields":[{"dataType":"i=24","description":[{"value":"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."}],"name":"KeepsParameters","value":0},{"dataType":"i=24","description":[{"value":"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."}],"name":"WillDisconnect","value":1},{"dataType":"i=24","description":[{"value":"If RequiresPowerCycle is set, the devices require a manual power off / power on for installation."}],"name":"RequiresPowerCycle","value":2},{"dataType":"i=24","description":[{"value":"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."}],"name":"WillReboot","value":3},{"dataType":"i=24","description":[{"value":"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."}],"name":"NeedsPreparation","value":4}],"isOptionSet":true,"name":"1:UpdateBehavior"},"displayName":[{"value":"UpdateBehavior"}],"documentation":"https://reference.opcfoundation.org/DI/v104/docs/8.5.2","nodeClass":"DataType","nodeId":"ns=1;i=333","references":[{"referenceType":"HasProperty","target":"ns=1;i=388"},{"isForward":false,"referenceType":"HasSubtype","target":"i=7"}],"superType":"i=7"},{"arrayDimensions":"5","browseName":"OptionSetValues","dataType":"LocalizedText","displayName":[{"value":"OptionSetValues"}],"nodeClass":"Variable","nodeId":"ns=1;i=388","parentNodeId":"ns=1;i=333","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=333"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfLocalizedText xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EKeepsParameters\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EWillDisconnect\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003ERequiresPowerCycle\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003EWillReboot\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003CLocalizedText\u003E\n \u003CText\u003ENeedsPreparation\u003C/Text\u003E\n \u003C/LocalizedText\u003E\n \u003C/ListOfLocalizedText\u003E"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=6551","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=6522"},{"referenceType":"HasDescription","target":"ns=1;i=6555"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=15891","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=15888"},{"referenceType":"HasDescription","target":"ns=1;i=15894"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=15892","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=15889"},{"referenceType":"HasDescription","target":"ns=1;i=15897"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=6554","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=6525"},{"referenceType":"HasDescription","target":"ns=1;i=6564"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"1:Opc.Ua.Di","dataType":"ByteString","displayName":[{"value":"Opc.Ua.Di"}],"nodeClass":"Variable","nodeId":"ns=1;i=6435","references":[{"referenceType":"HasProperty","target":"ns=1;i=6437"},{"referenceType":"HasProperty","target":"ns=1;i=15893"},{"referenceType":"HasComponent","target":"ns=1;i=6555"},{"referenceType":"HasComponent","target":"ns=1;i=15894"},{"referenceType":"HasComponent","target":"ns=1;i=15897"},{"referenceType":"HasComponent","target":"ns=1;i=6564"},{"isForward":false,"referenceType":"HasComponent","target":"i=93"},{"referenceType":"HasTypeDefinition","target":"i=72"}],"releaseStatus":"Deprecated","symbolicName":"OpcUaDi_BinarySchema","typeDefinition":"i=72","valueXml":"\u003CByteString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPG9wYzpUeXBlRGljdGlvbmFyeQ0KICB4bWxuczpvcGM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9y\nZy9CaW5hcnlTY2hlbWEvIg0KICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1M\nU2NoZW1hLWluc3RhbmNlIg0KICB4bWxuczp1YT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VB\nLyINCiAgeG1sbnM6dG5zPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvREkvIg0KICBEZWZh\ndWx0Qnl0ZU9yZGVyPSJMaXR0bGVFbmRpYW4iDQogIFRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29w\nY2ZvdW5kYXRpb24ub3JnL1VBL0RJLyINCj4NCiAgPG9wYzpJbXBvcnQgTmFtZXNwYWNlPSJodHRw\nOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvIiBMb2NhdGlvbj0iT3BjLlVhLkJpbmFyeVNjaGVtYS5i\nc2QiLz4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IkRldmljZUhlYWx0aEVudW1lcmF0\naW9uIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJO\nT1JNQUwiIFZhbHVlPSIwIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkZBSUxV\nUkUiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkNIRUNLX0ZV\nTkNUSU9OIiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJPRkZf\nU1BFQyIgVmFsdWU9IjMiIC8\u002BDQogICAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTUFJTlRF\nTkFOQ0VfUkVRVUlSRUQiIFZhbHVlPSI0IiAvPg0KICA8L29wYzpFbnVtZXJhdGVkVHlwZT4NCg0K\nICA8b3BjOlN0cnVjdHVyZWRUeXBlIE5hbWU9IkZldGNoUmVzdWx0RGF0YVR5cGUiIEJhc2VUeXBl\nPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0KICA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3Bj\nOlN0cnVjdHVyZWRUeXBlIE5hbWU9IlRyYW5zZmVyUmVzdWx0RXJyb3JEYXRhVHlwZSIgQmFzZVR5\ncGU9InRuczpGZXRjaFJlc3VsdERhdGFUeXBlIj4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IlN0YXR1\ncyIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3BjOkZpZWxkIE5hbWU9IkRpYWdub3N0\naWNzIiBUeXBlTmFtZT0idWE6RGlhZ25vc3RpY0luZm8iIC8\u002BDQogIDwvb3BjOlN0cnVjdHVyZWRU\neXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0iVHJhbnNmZXJSZXN1bHREYXRhRGF0\nYVR5cGUiIEJhc2VUeXBlPSJ0bnM6RmV0Y2hSZXN1bHREYXRhVHlwZSI\u002BDQogICAgPG9wYzpGaWVs\nZCBOYW1lPSJTZXF1ZW5jZU51bWJlciIgVHlwZU5hbWU9Im9wYzpJbnQzMiIgLz4NCiAgICA8b3Bj\nOkZpZWxkIE5hbWU9IkVuZE9mUmVzdWx0cyIgVHlwZU5hbWU9Im9wYzpCb29sZWFuIiAvPg0KICAg\nIDxvcGM6RmllbGQgTmFtZT0iTm9PZlBhcmFtZXRlckRlZnMiIFR5cGVOYW1lPSJvcGM6SW50MzIi\nIC8\u002BDQogICAgPG9wYzpGaWVsZCBOYW1lPSJQYXJhbWV0ZXJEZWZzIiBUeXBlTmFtZT0idG5zOlBh\ncmFtZXRlclJlc3VsdERhdGFUeXBlIiBMZW5ndGhGaWVsZD0iTm9PZlBhcmFtZXRlckRlZnMiIC8\u002B\nDQogIDwvb3BjOlN0cnVjdHVyZWRUeXBlPg0KDQogIDxvcGM6U3RydWN0dXJlZFR5cGUgTmFtZT0i\nUGFyYW1ldGVyUmVzdWx0RGF0YVR5cGUiIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiPg0K\nICAgIDxvcGM6RmllbGQgTmFtZT0iTm9PZk5vZGVQYXRoIiBUeXBlTmFtZT0ib3BjOkludDMyIiAv\nPg0KICAgIDxvcGM6RmllbGQgTmFtZT0iTm9kZVBhdGgiIFR5cGVOYW1lPSJ1YTpRdWFsaWZpZWRO\nYW1lIiBMZW5ndGhGaWVsZD0iTm9PZk5vZGVQYXRoIiAvPg0KICAgIDxvcGM6RmllbGQgTmFtZT0i\nU3RhdHVzQ29kZSIgVHlwZU5hbWU9InVhOlN0YXR1c0NvZGUiIC8\u002BDQogICAgPG9wYzpGaWVsZCBO\nYW1lPSJEaWFnbm9zdGljcyIgVHlwZU5hbWU9InVhOkRpYWdub3N0aWNJbmZvIiAvPg0KICA8L29w\nYzpTdHJ1Y3R1cmVkVHlwZT4NCg0KICA8b3BjOkVudW1lcmF0ZWRUeXBlIE5hbWU9IlNvZnR3YXJl\nVmVyc2lvbkZpbGVUeXBlIiBMZW5ndGhJbkJpdHM9IjMyIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRW\nYWx1ZSBOYW1lPSJDdXJyZW50IiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1\nZSBOYW1lPSJQZW5kaW5nIiBWYWx1ZT0iMSIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBO\nYW1lPSJGYWxsYmFjayIgVmFsdWU9IjIiIC8\u002BDQogIDwvb3BjOkVudW1lcmF0ZWRUeXBlPg0KDQog\nIDxvcGM6RW51bWVyYXRlZFR5cGUgTmFtZT0iVXBkYXRlQmVoYXZpb3IiIExlbmd0aEluQml0cz0i\nMzIiIElzT3B0aW9uU2V0PSJ0cnVlIj4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJO\nb25lIiBWYWx1ZT0iMCIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJLZWVwc1Bh\ncmFtZXRlcnMiIFZhbHVlPSIxIiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ildp\nbGxEaXNjb25uZWN0IiBWYWx1ZT0iMiIgLz4NCiAgICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1l\nPSJSZXF1aXJlc1Bvd2VyQ3ljbGUiIFZhbHVlPSI0IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh\nbHVlIE5hbWU9IldpbGxSZWJvb3QiIFZhbHVlPSI4IiAvPg0KICAgIDxvcGM6RW51bWVyYXRlZFZh\nbHVlIE5hbWU9Ik5lZWRzUHJlcGFyYXRpb24iIFZhbHVlPSIxNiIgLz4NCiAgPC9vcGM6RW51bWVy\nYXRlZFR5cGU\u002BDQoNCjwvb3BjOlR5cGVEaWN0aW9uYXJ5Pg==\u003C/ByteString\u003E"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=6437","parentNodeId":"ns=1;i=6435","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6435"}],"releaseStatus":"Deprecated","typeDefinition":"i=68","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/DI/\u003C/String\u003E"},{"browseName":"Deprecated","dataType":"Boolean","displayName":[{"value":"Deprecated"}],"nodeClass":"Variable","nodeId":"ns=1;i=15893","parentNodeId":"ns=1;i=6435","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6435"}],"releaseStatus":"Deprecated","typeDefinition":"i=68","valueXml":"\u003CBoolean xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etrue\u003C/Boolean\u003E"},{"browseName":"1:FetchResultDataType","dataType":"String","displayName":[{"value":"FetchResultDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=6555","parentNodeId":"ns=1;i=6435","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6435"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EFetchResultDataType\u003C/String\u003E"},{"browseName":"1:TransferResultErrorDataType","dataType":"String","displayName":[{"value":"TransferResultErrorDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=15894","parentNodeId":"ns=1;i=6435","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6435"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003ETransferResultErrorDataType\u003C/String\u003E"},{"browseName":"1:TransferResultDataDataType","dataType":"String","displayName":[{"value":"TransferResultDataDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=15897","parentNodeId":"ns=1;i=6435","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6435"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003ETransferResultDataDataType\u003C/String\u003E"},{"browseName":"1:ParameterResultDataType","dataType":"String","displayName":[{"value":"ParameterResultDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=6564","parentNodeId":"ns=1;i=6435","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6435"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EParameterResultDataType\u003C/String\u003E"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=6535","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=6522"},{"referenceType":"HasDescription","target":"ns=1;i=6539"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=15900","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=15888"},{"referenceType":"HasDescription","target":"ns=1;i=15903"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=15901","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=15889"},{"referenceType":"HasDescription","target":"ns=1;i=15906"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=6538","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=6525"},{"referenceType":"HasDescription","target":"ns=1;i=6548"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"1:Opc.Ua.Di","dataType":"ByteString","displayName":[{"value":"Opc.Ua.Di"}],"nodeClass":"Variable","nodeId":"ns=1;i=6423","references":[{"referenceType":"HasProperty","target":"ns=1;i=6425"},{"referenceType":"HasProperty","target":"ns=1;i=15902"},{"referenceType":"HasComponent","target":"ns=1;i=6539"},{"referenceType":"HasComponent","target":"ns=1;i=15903"},{"referenceType":"HasComponent","target":"ns=1;i=15906"},{"referenceType":"HasComponent","target":"ns=1;i=6548"},{"isForward":false,"referenceType":"HasComponent","target":"i=92"},{"referenceType":"HasTypeDefinition","target":"i=72"}],"releaseStatus":"Deprecated","symbolicName":"OpcUaDi_XmlSchema","typeDefinition":"i=72","valueXml":"\u003CByteString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPHhzOnNjaGVtYQ0KICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEi\nDQogIHhtbG5zOnVhPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54\nc2QiDQogIHhtbG5zOnRucz0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBL0RJL1R5cGVzLnhz\nZCINCiAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvREkvVHlw\nZXMueHNkIg0KICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCINCj4NCiAgPHhzOmFubm90\nYXRpb24\u002BDQogICAgPHhzOmFwcGluZm8\u002BDQogICAgICA8dWE6TW9kZWwgTW9kZWxVcmk9Imh0dHA6\nLy9vcGNmb3VuZGF0aW9uLm9yZy9VQS9ESS8iIFZlcnNpb249IjEuMDQuMCIgUHVibGljYXRpb25E\nYXRlPSIyMDIyLTExLTAzVDAwOjAwOjAwWiIgLz4NCiAgICA8L3hzOmFwcGluZm8\u002BDQogIDwveHM6\nYW5ub3RhdGlvbj4NCiAgDQogIDx4czppbXBvcnQgbmFtZXNwYWNlPSJodHRwOi8vb3BjZm91bmRh\ndGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54c2QiIC8\u002BDQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5h\nbWU9IkRldmljZUhlYWx0aEVudW1lcmF0aW9uIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0i\neHM6c3RyaW5nIj4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9STUFMXzAiIC8\u002BDQog\nICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZBSUxVUkVfMSIgLz4NCiAgICAgIDx4czplbnVt\nZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfRlVOQ1RJT05fMiIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlv\nbiB2YWx1ZT0iT0ZGX1NQRUNfMyIgLz4NCiAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTUFJ\nTlRFTkFOQ0VfUkVRVUlSRURfNCIgLz4NCiAgICA8L3hzOnJlc3RyaWN0aW9uPg0KICA8L3hzOnNp\nbXBsZVR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9IkRldmljZUhlYWx0aEVudW1lcmF0aW9uIiB0\neXBlPSJ0bnM6RGV2aWNlSGVhbHRoRW51bWVyYXRpb24iIC8\u002BDQoNCiAgPHhzOmNvbXBsZXhUeXBl\nIG5hbWU9Ikxpc3RPZkRldmljZUhlYWx0aEVudW1lcmF0aW9uIj4NCiAgICA8eHM6c2VxdWVuY2U\u002B\nDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEZXZpY2VIZWFsdGhFbnVtZXJhdGlvbiIgdHlwZT0i\ndG5zOkRldmljZUhlYWx0aEVudW1lcmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5i\nb3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U\u002BDQogIDwveHM6Y29tcGxleFR5cGU\u002BDQogIDx4\nczplbGVtZW50IG5hbWU9Ikxpc3RPZkRldmljZUhlYWx0aEVudW1lcmF0aW9uIiB0eXBlPSJ0bnM6\nTGlzdE9mRGV2aWNlSGVhbHRoRW51bWVyYXRpb24iIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1l\nbnQ\u002BDQoNCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkZldGNoUmVzdWx0RGF0YVR5cGUiPg0KICAg\nIDx4czpzZXF1ZW5jZT4NCiAgICA8L3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0K\nICA8eHM6ZWxlbWVudCBuYW1lPSJGZXRjaFJlc3VsdERhdGFUeXBlIiB0eXBlPSJ0bnM6RmV0Y2hS\nZXN1bHREYXRhVHlwZSIgLz4NCg0KICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRmV0Y2hS\nZXN1bHREYXRhVHlwZSI\u002BDQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFt\nZT0iRmV0Y2hSZXN1bHREYXRhVHlwZSIgdHlwZT0idG5zOkZldGNoUmVzdWx0RGF0YVR5cGUiIG1p\nbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nIDwveHM6c2VxdWVuY2U\u002BDQogIDwveHM6Y29tcGxleFR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9\nIkxpc3RPZkZldGNoUmVzdWx0RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZGZXRjaFJlc3VsdERh\ndGFUeXBlIiBuaWxsYWJsZT0idHJ1ZSI\u002BPC94czplbGVtZW50Pg0KDQogIDx4czpjb21wbGV4VHlw\nZSBuYW1lPSJUcmFuc2ZlclJlc3VsdEVycm9yRGF0YVR5cGUiPg0KICAgIDx4czpjb21wbGV4Q29u\ndGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ0bnM6RmV0Y2hS\nZXN1bHREYXRhVHlwZSI\u002BDQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgICAgICA8eHM6ZWxl\nbWVudCBuYW1lPSJTdGF0dXMiIHR5cGU9InhzOmludCIgbWluT2NjdXJzPSIwIiAvPg0KICAgICAg\nICAgIDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNzIiB0eXBlPSJ1YTpEaWFnbm9zdGljSW5m\nbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAgICAgPC94czpzZXF1ZW5j\nZT4NCiAgICAgIDwveHM6ZXh0ZW5zaW9uPg0KICAgIDwveHM6Y29tcGxleENvbnRlbnQ\u002BDQogIDwv\neHM6Y29tcGxleFR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9IlRyYW5zZmVyUmVzdWx0RXJyb3JE\nYXRhVHlwZSIgdHlwZT0idG5zOlRyYW5zZmVyUmVzdWx0RXJyb3JEYXRhVHlwZSIgLz4NCg0KICA8\neHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHJhbnNmZXJSZXN1bHRFcnJvckRhdGFUeXBlIj4N\nCiAgICA8eHM6c2VxdWVuY2U\u002BDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUcmFuc2ZlclJlc3Vs\ndEVycm9yRGF0YVR5cGUiIHR5cGU9InRuczpUcmFuc2ZlclJlc3VsdEVycm9yRGF0YVR5cGUiIG1p\nbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nIDwveHM6c2VxdWVuY2U\u002BDQogIDwveHM6Y29tcGxleFR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9\nIkxpc3RPZlRyYW5zZmVyUmVzdWx0RXJyb3JEYXRhVHlwZSIgdHlwZT0idG5zOkxpc3RPZlRyYW5z\nZmVyUmVzdWx0RXJyb3JEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0K\nICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmZXJSZXN1bHREYXRhRGF0YVR5cGUiPg0KICAg\nIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPg0KICAgICAgPHhzOmV4dGVuc2lvbiBi\nYXNlPSJ0bnM6RmV0Y2hSZXN1bHREYXRhVHlwZSI\u002BDQogICAgICAgIDx4czpzZXF1ZW5jZT4NCiAg\nICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXF1ZW5jZU51bWJlciIgdHlwZT0ieHM6aW50IiBt\naW5PY2N1cnM9IjAiIC8\u002BDQogICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5kT2ZSZXN1bHRz\nIiB0eXBlPSJ4czpib29sZWFuIiBtaW5PY2N1cnM9IjAiIC8\u002BDQogICAgICAgICAgPHhzOmVsZW1l\nbnQgbmFtZT0iUGFyYW1ldGVyRGVmcyIgdHlwZT0idG5zOkxpc3RPZlBhcmFtZXRlclJlc3VsdERh\ndGFUeXBlIiBtaW5PY2N1cnM9IjAiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAgICAgICA8L3hzOnNl\ncXVlbmNlPg0KICAgICAgPC94czpleHRlbnNpb24\u002BDQogICAgPC94czpjb21wbGV4Q29udGVudD4N\nCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0iVHJhbnNmZXJSZXN1bHRE\nYXRhRGF0YVR5cGUiIHR5cGU9InRuczpUcmFuc2ZlclJlc3VsdERhdGFEYXRhVHlwZSIgLz4NCg0K\nICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVHJhbnNmZXJSZXN1bHREYXRhRGF0YVR5cGUi\nPg0KICAgIDx4czpzZXF1ZW5jZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlRyYW5zZmVyUmVz\ndWx0RGF0YURhdGFUeXBlIiB0eXBlPSJ0bnM6VHJhbnNmZXJSZXN1bHREYXRhRGF0YVR5cGUiIG1p\nbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5pbGxhYmxlPSJ0cnVlIiAvPg0KICAg\nIDwveHM6c2VxdWVuY2U\u002BDQogIDwveHM6Y29tcGxleFR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9\nIkxpc3RPZlRyYW5zZmVyUmVzdWx0RGF0YURhdGFUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mVHJhbnNm\nZXJSZXN1bHREYXRhRGF0YVR5cGUiIG5pbGxhYmxlPSJ0cnVlIj48L3hzOmVsZW1lbnQ\u002BDQoNCiAg\nPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlBhcmFtZXRlclJlc3VsdERhdGFUeXBlIj4NCiAgICA8eHM6\nc2VxdWVuY2U\u002BDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJOb2RlUGF0aCIgdHlwZT0idWE6TGlz\ndE9mUXVhbGlmaWVkTmFtZSIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICAg\nIDx4czplbGVtZW50IG5hbWU9IlN0YXR1c0NvZGUiIHR5cGU9InVhOlN0YXR1c0NvZGUiIG1pbk9j\nY3Vycz0iMCIgLz4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IkRpYWdub3N0aWNzIiB0eXBlPSJ1\nYTpEaWFnbm9zdGljSW5mbyIgbWluT2NjdXJzPSIwIiBuaWxsYWJsZT0idHJ1ZSIgLz4NCiAgICA8\nL3hzOnNlcXVlbmNlPg0KICA8L3hzOmNvbXBsZXhUeXBlPg0KICA8eHM6ZWxlbWVudCBuYW1lPSJQ\nYXJhbWV0ZXJSZXN1bHREYXRhVHlwZSIgdHlwZT0idG5zOlBhcmFtZXRlclJlc3VsdERhdGFUeXBl\nIiAvPg0KDQogIDx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZQYXJhbWV0ZXJSZXN1bHREYXRh\nVHlwZSI\u002BDQogICAgPHhzOnNlcXVlbmNlPg0KICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUGFyYW1l\ndGVyUmVzdWx0RGF0YVR5cGUiIHR5cGU9InRuczpQYXJhbWV0ZXJSZXN1bHREYXRhVHlwZSIgbWlu\nT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmlsbGFibGU9InRydWUiIC8\u002BDQogICAg\nPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i\nTGlzdE9mUGFyYW1ldGVyUmVzdWx0RGF0YVR5cGUiIHR5cGU9InRuczpMaXN0T2ZQYXJhbWV0ZXJS\nZXN1bHREYXRhVHlwZSIgbmlsbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KICA8eHM6c2lt\ncGxlVHlwZSAgbmFtZT0iU29mdHdhcmVWZXJzaW9uRmlsZVR5cGUiPg0KICAgIDx4czpyZXN0cmlj\ndGlvbiBiYXNlPSJ4czpzdHJpbmciPg0KICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDdXJy\nZW50XzAiIC8\u002BDQogICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBlbmRpbmdfMSIgLz4NCiAg\nICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRmFsbGJhY2tfMiIgLz4NCiAgICA8L3hzOnJlc3Ry\naWN0aW9uPg0KICA8L3hzOnNpbXBsZVR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9IlNvZnR3YXJl\nVmVyc2lvbkZpbGVUeXBlIiB0eXBlPSJ0bnM6U29mdHdhcmVWZXJzaW9uRmlsZVR5cGUiIC8\u002BDQoN\nCiAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlNvZnR3YXJlVmVyc2lvbkZpbGVUeXBlIj4N\nCiAgICA8eHM6c2VxdWVuY2U\u002BDQogICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTb2Z0d2FyZVZlcnNp\nb25GaWxlVHlwZSIgdHlwZT0idG5zOlNvZnR3YXJlVmVyc2lvbkZpbGVUeXBlIiBtaW5PY2N1cnM9\nIjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPg0KICAgIDwveHM6c2VxdWVuY2U\u002BDQogIDwveHM6\nY29tcGxleFR5cGU\u002BDQogIDx4czplbGVtZW50IG5hbWU9Ikxpc3RPZlNvZnR3YXJlVmVyc2lvbkZp\nbGVUeXBlIiB0eXBlPSJ0bnM6TGlzdE9mU29mdHdhcmVWZXJzaW9uRmlsZVR5cGUiIG5pbGxhYmxl\nPSJ0cnVlIj48L3hzOmVsZW1lbnQ\u002BDQoNCiAgPHhzOnNpbXBsZVR5cGUgIG5hbWU9IlVwZGF0ZUJl\naGF2aW9yIj4NCiAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6dW5zaWduZWRJbnQiPg0KICAg\nIDwveHM6cmVzdHJpY3Rpb24\u002BDQogIDwveHM6c2ltcGxlVHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFt\nZT0iVXBkYXRlQmVoYXZpb3IiIHR5cGU9InRuczpVcGRhdGVCZWhhdmlvciIgLz4NCg0KICA8eHM6\nY29tcGxleFR5cGUgbmFtZT0iTGlzdE9mVXBkYXRlQmVoYXZpb3IiPg0KICAgIDx4czpzZXF1ZW5j\nZT4NCiAgICAgIDx4czplbGVtZW50IG5hbWU9IlVwZGF0ZUJlaGF2aW9yIiB0eXBlPSJ0bnM6VXBk\nYXRlQmVoYXZpb3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8\u002BDQogICAg\nPC94czpzZXF1ZW5jZT4NCiAgPC94czpjb21wbGV4VHlwZT4NCiAgPHhzOmVsZW1lbnQgbmFtZT0i\nTGlzdE9mVXBkYXRlQmVoYXZpb3IiIHR5cGU9InRuczpMaXN0T2ZVcGRhdGVCZWhhdmlvciIgbmls\nbGFibGU9InRydWUiPjwveHM6ZWxlbWVudD4NCg0KPC94czpzY2hlbWE\u002B\u003C/ByteString\u003E"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=6425","parentNodeId":"ns=1;i=6423","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6423"}],"releaseStatus":"Deprecated","typeDefinition":"i=68","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/DI/Types.xsd\u003C/String\u003E"},{"browseName":"Deprecated","dataType":"Boolean","displayName":[{"value":"Deprecated"}],"nodeClass":"Variable","nodeId":"ns=1;i=15902","parentNodeId":"ns=1;i=6423","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6423"}],"releaseStatus":"Deprecated","typeDefinition":"i=68","valueXml":"\u003CBoolean xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etrue\u003C/Boolean\u003E"},{"browseName":"1:FetchResultDataType","dataType":"String","displayName":[{"value":"FetchResultDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=6539","parentNodeId":"ns=1;i=6423","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6423"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027FetchResultDataType\u0027]\u003C/String\u003E"},{"browseName":"1:TransferResultErrorDataType","dataType":"String","displayName":[{"value":"TransferResultErrorDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=15903","parentNodeId":"ns=1;i=6423","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6423"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027TransferResultErrorDataType\u0027]\u003C/String\u003E"},{"browseName":"1:TransferResultDataDataType","dataType":"String","displayName":[{"value":"TransferResultDataDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=15906","parentNodeId":"ns=1;i=6423","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6423"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027TransferResultDataDataType\u0027]\u003C/String\u003E"},{"browseName":"1:ParameterResultDataType","dataType":"String","displayName":[{"value":"ParameterResultDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=6548","parentNodeId":"ns=1;i=6423","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6423"}],"releaseStatus":"Deprecated","typeDefinition":"i=69","valueXml":"\u003CString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027ParameterResultDataType\u0027]\u003C/String\u003E"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=15909","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=6522"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=15910","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=15888"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=15911","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=15889"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=15912","references":[{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=6525"},{"referenceType":"HasTypeDefinition","target":"i=76"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"}],"profileVersion":"1.0"}} \ No newline at end of file diff --git a/samples/WotCon/AggregationClient/Documents/Opc.Ua.Machinery.tm.json b/samples/WotCon/AggregationClient/Documents/Opc.Ua.Machinery.tm.json new file mode 100644 index 0000000000..904e99116b --- /dev/null +++ b/samples/WotCon/AggregationClient/Documents/Opc.Ua.Machinery.tm.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/2022/wot/td/v1.1",{"ns1":"http://opcfoundation.org/UA/Machinery/","ns2":"http://opcfoundation.org/UA/DI/","ua":"http://opcfoundation.org/UA/","uav":"http://opcfoundation.org/UA/WoT-Binding/"}],"@type":["tm:ThingModel","uav:objectType"],"description":"Interface containing information of the identification of a machine set by the customer","properties":{"Location":{"@type":"uav:variableType","description":"To be used by end users to store the location of the machine in a scheme specific to the end user Servers shall support at least 60 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 60 Unicode characters into that field.","observable":true,"title":"Location","type":"string","uav:browseName":"ns1:Location","uav:id":"nsu=http://opcfoundation.org/UA/Machinery/;i=6028","uav:modellingRule":"Optional"}},"title":"OPC UA Machinery","uav:browseName":"ns1:IMachineTagNameplateType","uav:id":"nsu=http://opcfoundation.org/UA/Machinery/;i=1011","uav:nodes":{"@type":"uav:NodeModel","aliases":[{"alias":"Boolean","value":"i=1"},{"alias":"Byte","value":"i=3"},{"alias":"UInt16","value":"i=5"},{"alias":"String","value":"i=12"},{"alias":"DateTime","value":"i=13"},{"alias":"QualifiedName","value":"i=20"},{"alias":"LocalizedText","value":"i=21"},{"alias":"Organizes","value":"i=35"},{"alias":"HasModellingRule","value":"i=37"},{"alias":"HasTypeDefinition","value":"i=40"},{"alias":"HasSubtype","value":"i=45"},{"alias":"HasProperty","value":"i=46"},{"alias":"HasComponent","value":"i=47"},{"alias":"IdType","value":"i=256"},{"alias":"NumericRange","value":"i=291"},{"alias":"HasInterface","value":"i=17603"},{"alias":"HasAddIn","value":"i=17604"}],"extensions":["\u003Cua:ModelInfo Tool=\u0022UaModeler\u0022 Hash=\u00221kZ2yQ20PUIIUHL71Tn8vA==\u0022 Version=\u00221.6.5\u0022 xmlns:ua=\u0022http://unifiedautomation.com/Configuration/NodeSet.xsd\u0022 /\u003E"],"models":[{"modelUri":"http://opcfoundation.org/UA/Machinery/","publicationDate":"2021-02-25T00:00:00Z","requiredModels":[{"modelUri":"http://opcfoundation.org/UA/","publicationDate":"2020-07-15T00:00:00Z","version":"1.04.7"},{"modelUri":"http://opcfoundation.org/UA/DI/","publicationDate":"2020-06-02T00:00:00Z","version":"1.02.2"}],"version":"1.01.0"}],"namespaceUris":["http://opcfoundation.org/UA/Machinery/","http://opcfoundation.org/UA/DI/"],"nodes":[{"browseName":"1:IMachineTagNameplateType","description":[{"locale":"en","value":"Interface containing information of the identification of a machine set by the customer"}],"displayName":[{"value":"IMachineTagNameplateType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/8.5","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1011","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=2;i=15048"},{"isForward":false,"referenceType":"HasInterface","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6028"}],"superType":"ns=2;i=15048"},{"accessLevel":3,"browseName":"1:Location","dataType":"String","description":[{"locale":"en","value":"To be used by end users to store the location of the machine in a scheme specific to the end user Servers shall support at least 60 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 60 Unicode characters into that field."}],"displayName":[{"value":"Location"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6028","parentNodeId":"ns=1;i=1011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IMachineryItemVendorNameplateType","description":[{"locale":"en","value":"Interface containing identification and nameplate information for a MachineryItem provided by the vendor"}],"displayName":[{"value":"IMachineryItemVendorNameplateType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/8.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1003","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=2;i=15035"},{"isForward":false,"referenceType":"HasInterface","target":"ns=1;i=1004"},{"referenceType":"HasProperty","target":"ns=1;i=6027"},{"referenceType":"HasProperty","target":"ns=1;i=6022"},{"referenceType":"HasProperty","target":"ns=1;i=6026"},{"referenceType":"HasProperty","target":"ns=1;i=6024"},{"referenceType":"HasProperty","target":"ns=1;i=6025"}],"superType":"ns=2;i=15035"},{"browseName":"1:InitialOperationDate","dataType":"DateTime","description":[{"locale":"en","value":"The date, when the MachineryItem was switched on the first time after it has left the manufacturer plant."}],"displayName":[{"value":"InitialOperationDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6027","parentNodeId":"ns=1;i=1003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:Manufacturer","dataType":"LocalizedText","description":[{"locale":"en","value":"A human-readable, localized name of the manufacturer of the MachineryItem."}],"displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6022","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MonthOfConstruction","dataType":"Byte","description":[{"locale":"en","value":"The month in which the manufacturing process of the MachineryItem has been completed. It shall be a number between 1 and 12, representing the month from January to December."}],"displayName":[{"value":"MonthOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6026","parentNodeId":"ns=1;i=1003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:SerialNumber","dataType":"String","description":[{"locale":"en","value":"A string containing a unique production number of the manufacturer of the MachineryItem. The global uniqueness of the serial number is only given in the context of the manufacturer, and potentially the model. The value shall not change during the life-cycle of the MachineryItem."}],"displayName":[{"value":"SerialNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6024","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68"},{"browseName":"1:YearOfConstruction","dataType":"UInt16","description":[{"locale":"en","value":"The year (Gregorian calendar) in which the manufacturing process of the MachineryItem has been completed. It shall be a four-digit number and never change during the life-cycle of a MachineryItem."}],"displayName":[{"value":"YearOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6025","parentNodeId":"ns=1;i=1003","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1003"}],"typeDefinition":"i=68"},{"browseName":"1:IMachineVendorNameplateType","description":[{"locale":"en","value":"Interface containing identification and nameplate information for a machine provided by the machine vendor"}],"displayName":[{"value":"IMachineVendorNameplateType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/8.4","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1010","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1003"},{"isForward":false,"referenceType":"HasInterface","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6023"}],"superType":"ns=1;i=1003"},{"browseName":"2:ProductInstanceUri","dataType":"String","description":[{"locale":"en","value":"A globally unique resource identifier provided by the manufacturer of the machine"}],"displayName":[{"value":"ProductInstanceUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6023","parentNodeId":"ns=1;i=1010","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1010"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MachineryItemIdentificationType","description":[{"locale":"en","value":"Contains information about the identification and nameplate of a MachineryItem"}],"displayName":[{"value":"MachineryItemIdentificationType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/8.3","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1004","references":[{"referenceType":"HasProperty","target":"ns=1;i=6013"},{"referenceType":"HasProperty","target":"ns=1;i=6014"},{"referenceType":"HasProperty","target":"ns=1;i=6012"},{"referenceType":"HasProperty","target":"ns=1;i=6010"},{"referenceType":"HasInterface","target":"ns=1;i=1003"},{"referenceType":"HasProperty","target":"ns=1;i=6006"},{"referenceType":"HasInterface","target":"ns=2;i=15048"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=2;i=1005"},{"referenceType":"HasProperty","target":"ns=1;i=6002"},{"referenceType":"HasProperty","target":"ns=1;i=6007"},{"referenceType":"HasProperty","target":"ns=1;i=6008"},{"referenceType":"HasProperty","target":"ns=1;i=6005"},{"referenceType":"HasProperty","target":"ns=1;i=6009"},{"referenceType":"HasProperty","target":"ns=1;i=6001"},{"referenceType":"HasProperty","target":"ns=1;i=6003"},{"referenceType":"HasProperty","target":"ns=1;i=6011"},{"referenceType":"HasProperty","target":"ns=1;i=6004"}],"superType":"ns=2;i=1005"},{"accessLevel":3,"browseName":"2:AssetId","dataType":"String","description":[{"locale":"en","value":"To be used by end users to store a unique identification in the context of their overall application. Servers shall support at least 40 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 40 Unicode characters into that field."}],"displayName":[{"value":"AssetId"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6013","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003C/uax:String\u003E"},{"accessLevel":3,"browseName":"2:ComponentName","dataType":"LocalizedText","description":[{"locale":"en","value":"To be used by end users to store a human-readable localized text for the MachineryItem. The minimum number of locales supported for this property shall be two. Servers shall support at least 40 Unicode characters for the clients writing the text part of each locale, this means clients can expect to be able to write texts with a length of 40 Unicode characters into that field."}],"displayName":[{"value":"ComponentName"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6014","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:LocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022 /\u003E"},{"browseName":"2:DeviceClass","dataType":"String","description":[{"locale":"en","value":"Indicates in which domain or for what purpose the MachineryItem is used."}],"displayName":[{"value":"DeviceClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6012","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:HardwareRevision","dataType":"String","description":[{"locale":"en","value":"A string representation of the revision level of the hardware of a MachineryItem. Hardware is physical equipment, as opposed to programs, procedures, rules and associated documentation. Many machines will not provide such information due to the modular and configurable nature of the machine."}],"displayName":[{"value":"HardwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6010","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InitialOperationDate","dataType":"DateTime","description":[{"locale":"en","value":"The date, when the MachineryItem was switched on the first time after it has left the manufacturer plant."}],"displayName":[{"value":"InitialOperationDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6006","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:Manufacturer","dataType":"LocalizedText","description":[{"locale":"en","value":"A human-readable, localized name of the manufacturer of the MachineryItem."}],"displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6002","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:ManufacturerUri","dataType":"String","description":[{"locale":"en","value":"A globally unique identifier of the manufacturer of the MachineryItem."}],"displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6007","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:Model","dataType":"LocalizedText","description":[{"locale":"en","value":"A human-readable, localized name of the model of the MachineryItem."}],"displayName":[{"value":"Model"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6008","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MonthOfConstruction","dataType":"Byte","description":[{"locale":"en","value":"The month in which the manufacturing process of the MachineryItem has been completed. It shall be a number between 1 and 12, representing the month from January to December."}],"displayName":[{"value":"MonthOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6005","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:ProductCode","dataType":"String","description":[{"locale":"en","value":"A machine-readable string of the model of the MachineryItem, that might include options like the hardware configuration of the model. This information might be provided by the ERP system of the vendor. For example, it can be used as order information."}],"displayName":[{"value":"ProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6009","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:ProductInstanceUri","dataType":"String","description":[{"locale":"en","value":"A globally unique resource identifier provided by the manufacturer of the MachineryItem."}],"displayName":[{"value":"ProductInstanceUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6001","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:SerialNumber","dataType":"String","description":[{"locale":"en","value":"A string containing a unique production number of the manufacturer of the MachineryItem. The global uniqueness of the serial number is only given in the context of the manufacturer, and potentially the model. The value shall not change during the life-cycle of the MachineryItem."}],"displayName":[{"value":"SerialNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6003","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"}],"typeDefinition":"i=68"},{"browseName":"2:SoftwareRevision","dataType":"String","description":[{"locale":"en","value":"A string representation of the revision level of a MachineryItem. In most cases, MachineryItems consist of several software components. In that case, information about the software components might be provided as additional information in the address space, including individual revision information. In that case, this property is either not provided or provides an overall software revision level. The value might change during the life-cycle of a MachineryItem."}],"displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6011","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"}],"typeDefinition":"i=68"},{"browseName":"1:YearOfConstruction","dataType":"UInt16","description":[{"locale":"en","value":"The year (Gregorian calendar) in which the manufacturing process of the MachineryItem has been completed. It shall be a four-digit number and never change during the life-cycle of a MachineryItem."}],"displayName":[{"value":"YearOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6004","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"}],"typeDefinition":"i=68"},{"browseName":"1:MachineIdentificationType","description":[{"locale":"en","value":"Contains information about the identification and nameplate of a machine"}],"displayName":[{"value":"MachineIdentificationType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/8.6","nodeClass":"ObjectType","nodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=6030"},{"referenceType":"HasInterface","target":"ns=1;i=1011"},{"referenceType":"HasInterface","target":"ns=1;i=1010"},{"referenceType":"HasProperty","target":"ns=1;i=6029"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1004"},{"referenceType":"HasProperty","target":"ns=1;i=6015"}],"superType":"ns=1;i=1004"},{"browseName":"DefaultInstanceBrowseName","dataType":"QualifiedName","description":[{"locale":"en","value":"The default BrowseName for instances of the type."}],"displayName":[{"value":"DefaultInstanceBrowseName"}],"nodeClass":"Variable","nodeId":"ns=1;i=6030","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1012"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:QualifiedName xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:NamespaceIndex\u003E2\u003C/uax:NamespaceIndex\u003E\n \u003Cuax:Name\u003EIdentification\u003C/uax:Name\u003E\n \u003C/uax:QualifiedName\u003E"},{"accessLevel":3,"browseName":"1:Location","dataType":"String","description":[{"locale":"en","value":"To be used by end users to store the location of the machine in a scheme specific to the end user. Servers shall support at least 60 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 60 Unicode characters into that field."}],"displayName":[{"value":"Location"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6029","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:ProductInstanceUri","dataType":"String","description":[{"locale":"en","value":"A globally unique resource identifier provided by the manufacturer of the machine"}],"displayName":[{"locale":"en","value":"ProductInstanceUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6015","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1012"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MachineryComponentIdentificationType","description":[{"locale":"en","value":"Contains information about the identification and nameplate of a component"}],"displayName":[{"value":"MachineryComponentIdentificationType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/10.2","nodeClass":"ObjectType","nodeId":"ns=1;i=1005","references":[{"referenceType":"HasProperty","target":"ns=1;i=6016"},{"referenceType":"HasProperty","target":"ns=1;i=6017"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1004"}],"superType":"ns=1;i=1004"},{"accessLevel":3,"browseName":"DefaultInstanceBrowseName","dataType":"QualifiedName","description":[{"locale":"en","value":"The default BrowseName for instances of the type."}],"displayName":[{"value":"DefaultInstanceBrowseName"}],"nodeClass":"Variable","nodeId":"ns=1;i=6016","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:QualifiedName xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:NamespaceIndex\u003E2\u003C/uax:NamespaceIndex\u003E\n \u003Cuax:Name\u003EIdentification\u003C/uax:Name\u003E\n \u003C/uax:QualifiedName\u003E"},{"accessLevel":3,"browseName":"2:DeviceRevision","dataType":"String","description":[{"locale":"en","value":"A string representation of the overall revision level of the component. Often, it is increased when either the SoftwareRevision and / or the HardwareRevision of the component is increased. As an example, it can be used in ERP systems together with the ProductCode."}],"displayName":[{"value":"DeviceRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6017","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=68"},{"browseName":"1:MachineComponentsType","description":[{"locale":"en","value":"Contains all identifiable components of a machine"}],"displayName":[{"value":"MachineComponentsType"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/11.2","nodeClass":"ObjectType","nodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=5002"},{"referenceType":"HasProperty","target":"ns=1;i=6018"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"browseName":"1:\u003CComponent\u003E","description":[{"locale":"en","value":"Represents the identifiable components of a machine."}],"displayName":[{"value":"\u003CComponent\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5002","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=58"},{"referenceType":"HasAddIn","target":"ns=1;i=5003"},{"referenceType":"HasModellingRule","target":"i=11508"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"symbolicName":"Component","typeDefinition":"i=58"},{"browseName":"2:Identification","description":[{"locale":"en","value":"Contains information about the identification and nameplate of a MachineryItem"}],"displayName":[{"value":"Identification"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=5003","parentNodeId":"ns=1;i=5002","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasAddIn","target":"ns=1;i=5002"},{"referenceType":"HasProperty","target":"ns=1;i=6019"},{"referenceType":"HasProperty","target":"ns=1;i=6020"}],"typeDefinition":"ns=1;i=1004"},{"browseName":"2:Manufacturer","dataType":"LocalizedText","description":[{"locale":"en","value":"A human-readable, localized name of the manufacturer of the MachineryItem."}],"displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6019","parentNodeId":"ns=1;i=5003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5003"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:SerialNumber","dataType":"String","description":[{"locale":"en","value":"A string containing a unique production number of the manufacturer of the MachineryItem. The global uniqueness of the serial number is only given in the context of the manufacturer, and potentially the model. The value shall not change during the life-cycle of the MachineryItem."}],"displayName":[{"value":"SerialNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6020","parentNodeId":"ns=1;i=5003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5003"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"DefaultInstanceBrowseName","dataType":"QualifiedName","description":[{"locale":"en","value":"The default BrowseName for instances of the type."}],"displayName":[{"value":"DefaultInstanceBrowseName"}],"nodeClass":"Variable","nodeId":"ns=1;i=6018","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:QualifiedName xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:NamespaceIndex\u003E1\u003C/uax:NamespaceIndex\u003E\n \u003Cuax:Name\u003EComponents\u003C/uax:Name\u003E\n \u003C/uax:QualifiedName\u003E"},{"browseName":"1:Machines","description":[{"locale":"en","value":"This object is the entry point to machines managed in the server. All machines are directly referenced by this object."}],"displayName":[{"value":"Machines"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/9.2","eventNotifier":1,"nodeClass":"Object","nodeId":"ns=1;i=1001","references":[{"referenceType":"HasTypeDefinition","target":"i=61"},{"isForward":false,"referenceType":"Organizes","target":"i=85"}],"typeDefinition":"i=61"},{"browseName":"1:http://opcfoundation.org/UA/Machinery/","displayName":[{"value":"http://opcfoundation.org/UA/Machinery/"}],"documentation":"https://reference.opcfoundation.org/v104/Machinery/v101/docs/13.1","nodeClass":"Object","nodeId":"ns=1;i=5001","references":[{"referenceType":"HasProperty","target":"ns=1;i=6031"},{"referenceType":"HasTypeDefinition","target":"i=11616"},{"isForward":false,"referenceType":"HasComponent","target":"i=11715"},{"referenceType":"HasProperty","target":"ns=1;i=6032"},{"referenceType":"HasProperty","target":"ns=1;i=6033"},{"referenceType":"HasProperty","target":"ns=1;i=6034"},{"referenceType":"HasProperty","target":"ns=1;i=6035"},{"referenceType":"HasProperty","target":"ns=1;i=6036"},{"referenceType":"HasProperty","target":"ns=1;i=6037"}],"symbolicName":"http___opcfoundation_org_UA_Machinery_","typeDefinition":"i=11616"},{"browseName":"IsNamespaceSubset","dataType":"Boolean","displayName":[{"value":"IsNamespaceSubset"}],"nodeClass":"Variable","nodeId":"ns=1;i=6031","parentNodeId":"ns=1;i=5001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"NamespacePublicationDate","dataType":"DateTime","displayName":[{"value":"NamespacePublicationDate"}],"nodeClass":"Variable","nodeId":"ns=1;i=6032","parentNodeId":"ns=1;i=5001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:DateTime xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2021-02-25T00:00:00Z\u003C/uax:DateTime\u003E"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=6033","parentNodeId":"ns=1;i=5001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/Machinery/\u003C/uax:String\u003E"},{"browseName":"NamespaceVersion","dataType":"String","displayName":[{"value":"NamespaceVersion"}],"nodeClass":"Variable","nodeId":"ns=1;i=6034","parentNodeId":"ns=1;i=5001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1.01.0\u003C/uax:String\u003E"},{"arrayDimensions":"0","browseName":"StaticNodeIdTypes","dataType":"IdType","displayName":[{"value":"StaticNodeIdTypes"}],"nodeClass":"Variable","nodeId":"ns=1;i=6035","parentNodeId":"ns=1;i=5001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfInt32 xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:Int32\u003E0\u003C/uax:Int32\u003E\n \u003C/uax:ListOfInt32\u003E"},{"arrayDimensions":"0","browseName":"StaticNumericNodeIdRange","dataType":"NumericRange","displayName":[{"value":"StaticNumericNodeIdRange"}],"nodeClass":"Variable","nodeId":"ns=1;i=6036","parentNodeId":"ns=1;i=5001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"}],"typeDefinition":"i=68","valueRank":1},{"browseName":"StaticStringNodeIdPattern","dataType":"String","displayName":[{"value":"StaticStringNodeIdPattern"}],"nodeClass":"Variable","nodeId":"ns=1;i=6037","parentNodeId":"ns=1;i=5001","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5001"}],"typeDefinition":"i=68"}],"profileVersion":"1.0"}} \ No newline at end of file diff --git a/samples/WotCon/AggregationClient/Documents/Opc.Ua.Pumps.tm.json b/samples/WotCon/AggregationClient/Documents/Opc.Ua.Pumps.tm.json new file mode 100644 index 0000000000..194d33e750 --- /dev/null +++ b/samples/WotCon/AggregationClient/Documents/Opc.Ua.Pumps.tm.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/2022/wot/td/v1.1",{"ns1":"http://opcfoundation.org/UA/Pumps/","ns2":"http://opcfoundation.org/UA/Machinery/","ns3":"http://opcfoundation.org/UA/DI/","ua":"http://opcfoundation.org/UA/","uav":"http://opcfoundation.org/UA/WoT-Binding/"}],"@type":["tm:ThingModel","uav:objectType"],"properties":{"ArticleNumber":{"@type":"uav:variableType","description":"Alphanumeric character sequence identifying a manufactured, non-configurable product.","observable":true,"readOnly":true,"title":"ArticleNumber","type":"string","uav:browseName":"ns1:ArticleNumber","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6063","uav:modellingRule":"Optional"},"CountryOfOrigin":{"@type":"uav:variableType","description":"Country in which the product is manufactured.","observable":true,"title":"CountryOfOrigin","type":"string","uav:browseName":"ns1:CountryOfOrigin","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6080","uav:modellingRule":"Optional"},"DayOfConstruction":{"@type":"uav:variableType","description":"The optional DayOfConstrucition provides the day of the month in which the manufacturing process of the machine has been completed. It shall be a number and never change during the life-cycle of a machine.","observable":true,"readOnly":true,"title":"DayOfConstruction","type":"integer","uav:browseName":"ns1:DayOfConstruction","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6064","uav:modellingRule":"Optional"},"FabricationNumber":{"@type":"uav:variableType","description":"Alphanumeric character sequence assigned to a fabricated product, which allows the date, time and circumstances of fabrication to be traced.","observable":true,"readOnly":true,"title":"FabricationNumber","type":"string","uav:browseName":"ns1:FabricationNumber","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6065","uav:modellingRule":"Optional"},"GTINCode":{"@type":"uav:variableType","description":"Bar code number that identifies the device based on the Global Trade Item Number system.","observable":true,"readOnly":true,"title":"GTINCode","type":"string","uav:browseName":"ns1:GTINCode","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6066","uav:modellingRule":"Optional"},"NationalStockNumber":{"@type":"uav:variableType","description":"13-digit numeric code, identifying all \u0027standardized material items of supply\u0027 as recognized by the United States Department of Defense.","observable":true,"readOnly":true,"title":"NationalStockNumber","type":"string","uav:browseName":"ns1:NationalStockNumber","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6067","uav:modellingRule":"Optional"},"OrderProductCode":{"@type":"uav:variableType","description":"Unique combination of numbers and letters used to order the device.","observable":true,"readOnly":true,"title":"OrderProductCode","type":"string","uav:browseName":"ns1:OrderProductCode","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6068","uav:modellingRule":"Optional"},"PhysicalAddress":{"@type":"uav:variableType","description":"Physical address of the manufacturer.","observable":true,"title":"PhysicalAddress","uav:browseName":"ns1:PhysicalAddress","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=9940","uav:modellingRule":"Optional"},"Supplier":{"@type":"uav:variableType","description":"Name of the supplier or vendor of a device.","observable":true,"readOnly":true,"title":"Supplier","type":"string","uav:browseName":"ns1:Supplier","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6069","uav:modellingRule":"Optional"},"TypeOfProduct":{"@type":"uav:variableType","description":"Characterization of the device based on its usage, operation principle, and its fabricated form.","observable":true,"readOnly":true,"title":"TypeOfProduct","type":"string","uav:browseName":"ns1:TypeOfProduct","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=6070","uav:modellingRule":"Optional"}},"title":"OPC UA Pumps","uav:browseName":"ns1:IPumpVendorNameplateType","uav:id":"nsu=http://opcfoundation.org/UA/Pumps/;i=1004","uav:nodes":{"@type":"uav:NodeModel","aliases":[{"alias":"Boolean","value":"i=1"},{"alias":"Byte","value":"i=3"},{"alias":"UInt16","value":"i=5"},{"alias":"Int32","value":"i=6"},{"alias":"UInt32","value":"i=7"},{"alias":"UInt64","value":"i=9"},{"alias":"Double","value":"i=11"},{"alias":"String","value":"i=12"},{"alias":"DateTime","value":"i=13"},{"alias":"ByteString","value":"i=15"},{"alias":"LocalizedText","value":"i=21"},{"alias":"HasModellingRule","value":"i=37"},{"alias":"HasEncoding","value":"i=38"},{"alias":"HasDescription","value":"i=39"},{"alias":"HasTypeDefinition","value":"i=40"},{"alias":"GeneratesEvent","value":"i=41"},{"alias":"HasSubtype","value":"i=45"},{"alias":"HasProperty","value":"i=46"},{"alias":"HasComponent","value":"i=47"},{"alias":"IdType","value":"i=256"},{"alias":"NumericRange","value":"i=291"},{"alias":"Argument","value":"i=296"},{"alias":"Range","value":"i=884"},{"alias":"EUInformation","value":"i=887"},{"alias":"EnumValueType","value":"i=7594"},{"alias":"HasInterface","value":"i=17603"},{"alias":"StateOfTheItemEnum","value":"ns=1;i=3003"},{"alias":"MaintenanceLevelEnum","value":"ns=1;i=3004"},{"alias":"FieldbusEnum","value":"ns=1;i=3005"},{"alias":"OperatingModeEnum","value":"ns=1;i=3006"},{"alias":"OperationModeEnum","value":"ns=1;i=3007"},{"alias":"ControlModeEnum","value":"ns=1;i=3008"},{"alias":"PumpKickModeEnum","value":"ns=1;i=3009"},{"alias":"PumpRoleEnum","value":"ns=1;i=3010"},{"alias":"MultiPumpOperationModeEnum","value":"ns=1;i=3011"},{"alias":"ExchangeModeEnum","value":"ns=1;i=3012"},{"alias":"DistributionTypeEnum","value":"ns=1;i=3013"},{"alias":"PortDirectionEnum","value":"ns=1;i=3014"},{"alias":"ExplosionZoneOptionSet","value":"ns=1;i=3015"},{"alias":"ExplosionProtectionOptionSet","value":"ns=1;i=3016"},{"alias":"OfferedControlModesOptionSet","value":"ns=1;i=3017"},{"alias":"OfferedFieldbusesOptionSet","value":"ns=1;i=3018"},{"alias":"DeclarationOfConformityOptionSet","value":"ns=1;i=3019"},{"alias":"PhysicalAddressDataType","value":"ns=1;i=3020"},{"alias":"PumpClassEnum","value":"ns=1;i=3021"}],"extensions":["\u003Cua:ModelInfo Tool=\u0022UaModeler\u0022 Hash=\u00220wrdikaktwTGvccNw\u002Bo4Cw==\u0022 Version=\u00221.6.5\u0022 xmlns:ua=\u0022http://unifiedautomation.com/Configuration/NodeSet.xsd\u0022 /\u003E"],"models":[{"modelUri":"http://opcfoundation.org/UA/Pumps/","publicationDate":"2021-04-19T00:00:00Z","requiredModels":[{"modelUri":"http://opcfoundation.org/UA/","publicationDate":"2020-07-15T00:00:00Z","version":"1.04.7"},{"modelUri":"http://opcfoundation.org/UA/DI/","publicationDate":"2020-06-02T00:00:00Z","version":"1.02.2"},{"modelUri":"http://opcfoundation.org/UA/Machinery/","publicationDate":"2020-09-25T00:00:00Z","version":"1.0.0"}],"version":"1.0.0"}],"namespaceUris":["http://opcfoundation.org/UA/Pumps/","http://opcfoundation.org/UA/Machinery/","http://opcfoundation.org/UA/DI/"],"nodes":[{"browseName":"1:ControlModeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Constant pressure control mode"}],"name":"ConstantPressureControl","value":0},{"dataType":"i=24","description":[{"value":"Constant temperature control mode"}],"name":"ConstantTemperatureControl","value":1},{"dataType":"i=24","description":[{"value":"Differential pressure control mode"}],"name":"DifferentialPressureControl","value":2},{"dataType":"i=24","description":[{"value":"Constant differential pressure control mode"}],"name":"ConstantDifferentialPressureControl","value":3},{"dataType":"i=24","description":[{"value":"Variable differential pressure control mode"}],"name":"VariableDifferentialPressureControl","value":4},{"dataType":"i=24","description":[{"value":"Flow-dependent differential pressure control mode"}],"name":"FlowDependentDifferentialPressureControl","value":5},{"dataType":"i=24","description":[{"value":"Return flow temperature control mode"}],"name":"ReturnFlowTemperatureControl","value":6},{"dataType":"i=24","description":[{"value":"Flow temperature control mode"}],"name":"FlowTemperatureControl","value":7},{"dataType":"i=24","description":[{"value":"Flow rate control mode"}],"name":"FlowRateControl","value":8},{"dataType":"i=24","description":[{"value":"Speed control mode"}],"name":"SpeedControl","value":9},{"dataType":"i=24","description":[{"value":"Automatic control mode"}],"name":"Automatic","value":10},{"dataType":"i=24","description":[{"value":"None / uncontrolled mode"}],"name":"Uncontrolled","value":11}],"name":"1:ControlModeEnum"},"description":[{"value":"describes the possible control modes of the pump"}],"displayName":[{"value":"ControlModeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.7","nodeClass":"DataType","nodeId":"ns=1;i=3008","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=29"},{"referenceType":"HasProperty","target":"ns=1;i=6011"}],"superType":"i=29"},{"arrayDimensions":"12","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6011","parentNodeId":"ns=1;i=3008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3008"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EConstantPressureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EConstant pressure control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EConstantTemperatureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EConstant temperature control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDifferentialPressureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EDifferential pressure control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EConstantDifferentialPressureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EConstant differential pressure control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E4\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EVariableDifferentialPressureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EVariable differential pressure control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E5\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EFlowDependentDifferentialPressureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EFlow-dependent differential pressure control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E6\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EReturnFlowTemperatureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EReturn flow temperature control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E7\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EFlowTemperatureControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EFlow temperature control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E8\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EFlowRateControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EFlow rate control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E9\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESpeedControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESpeed control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E10\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EAutomatic\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EAutomatic control mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E11\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EUncontrolled\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ENone / uncontrolled mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:DistributionTypeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Manufacturer specific distribution of operation time"}],"name":"ManufacturerSpecific","value":0},{"dataType":"i=24","description":[{"value":"Operator specific distribution of operation time"}],"name":"OperatorSpecific","value":1},{"dataType":"i=24","description":[{"value":"Equivalent distribution of operation time, concerning time distribution"}],"name":"ConcerningTimeDistribution","value":2},{"dataType":"i=24","description":[{"value":"Equivalent distribution of operation time, concerning load distribution"}],"name":"ConcerningLoadDistribution","value":3}],"name":"1:DistributionTypeEnum"},"description":[{"value":"describes the share of operation time of different pumps of the pump system in addition operation mode"}],"displayName":[{"value":"DistributionTypeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.9","nodeClass":"DataType","nodeId":"ns=1;i=3013","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=29"},{"referenceType":"HasProperty","target":"ns=1;i=6016"}],"superType":"i=29"},{"arrayDimensions":"4","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6016","parentNodeId":"ns=1;i=3013","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3013"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EManufacturerSpecific\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EManufacturer specific distribution of operation time\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOperatorSpecific\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EOperator specific distribution of operation time\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EConcerningTimeDistribution\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EEquivalent distribution of operation time, concerning time distribution\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EConcerningLoadDistribution\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EEquivalent distribution of operation time, concerning load distribution\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ExchangeModeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Manufacturer specific pump exchange mode"}],"name":"ManufacturerSpecific","value":0},{"dataType":"i=24","description":[{"value":"Pump exchange disabled"}],"name":"ExchangeDisabled","value":1},{"dataType":"i=24","description":[{"value":"Operator specific pump exchange mode"}],"name":"OperatorSpecific","value":2}],"name":"1:ExchangeModeEnum"},"description":[{"value":"specifies the exchange mode of the pump"}],"displayName":[{"value":"ExchangeModeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.10","nodeClass":"DataType","nodeId":"ns=1;i=3012","references":[{"referenceType":"HasProperty","target":"ns=1;i=6015"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"3","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6015","parentNodeId":"ns=1;i=3012","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3012"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EManufacturerSpecific\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EManufacturer specific pump exchange mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EExchangeDisabled\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPump exchange disabled\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOperatorSpecific\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EOperator specific pump exchange mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:FieldbusEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Fieldbus is not specified in this enumeration"}],"name":"Other","value":0},{"dataType":"i=24","description":[{"value":"ARCNET"}],"name":"ARCNET","value":1},{"dataType":"i=24","description":[{"value":"AS-Interface"}],"name":"AS-Interface","symbolicName":"AS_Interface","value":2},{"dataType":"i=24","description":[{"value":"BACnet/IP"}],"name":"BACnet/IP","symbolicName":"BACnet_IP","value":3},{"dataType":"i=24","description":[{"value":"BACnet/MSTP"}],"name":"BACnet/MSTP","symbolicName":"BACnet_MSTP","value":4},{"dataType":"i=24","description":[{"value":"Bluetooth"}],"name":"Bluetooth","value":5},{"dataType":"i=24","description":[{"value":"Bluetooth Low Energy"}],"name":"BluetoothLowEnergy","value":6},{"dataType":"i=24","description":[{"value":"CAN"}],"name":"CAN","value":7},{"dataType":"i=24","description":[{"value":"CANopen"}],"name":"CANopen","value":8},{"dataType":"i=24","description":[{"value":"CC-Link"}],"name":"CC-Link","symbolicName":"CC_Link","value":9},{"dataType":"i=24","description":[{"value":"ControlNet"}],"name":"ControlNet","value":10},{"dataType":"i=24","description":[{"value":"DALI"}],"name":"DALI","value":11},{"dataType":"i=24","description":[{"value":"DECT ULE"}],"name":"DECTULE","value":12},{"dataType":"i=24","description":[{"value":"DeviceNet"}],"name":"DeviceNet","value":13},{"dataType":"i=24","description":[{"value":"DMX"}],"name":"DMX","value":14},{"dataType":"i=24","description":[{"value":"KNX"}],"name":"KNX","value":15},{"dataType":"i=24","description":[{"value":"EnOcean"}],"name":"EnOcean","value":16},{"dataType":"i=24","description":[{"value":"EtherCAT"}],"name":"EtherCAT","value":17},{"dataType":"i=24","description":[{"value":"Ethernet/IP"}],"name":"Ethernet/IP","symbolicName":"Ethernet_IP","value":18},{"dataType":"i=24","description":[{"value":"Ethernet TCP/IP"}],"name":"EthernetTCP/IP","symbolicName":"EthernetTCP_IP","value":19},{"dataType":"i=24","description":[{"value":"IEEE1588"}],"name":"IEEE1588","value":20},{"dataType":"i=24","description":[{"value":"GSM"}],"name":"GSM","value":21},{"dataType":"i=24","description":[{"value":"Interbus"}],"name":"Interbus","value":22},{"dataType":"i=24","description":[{"value":"IO-Link"}],"name":"IO-Link","symbolicName":"IO_Link","value":23},{"dataType":"i=24","description":[{"value":"HART"}],"name":"HART","value":24},{"dataType":"i=24","description":[{"value":"LON"}],"name":"LON","value":25},{"dataType":"i=24","description":[{"value":"LoRaWAN"}],"name":"LoRaWAN","value":26},{"dataType":"i=24","description":[{"value":"LIN-Bus"}],"name":"LIN-Bus","symbolicName":"LIN_Bus","value":27},{"dataType":"i=24","description":[{"value":"LTE"}],"name":"LTE","value":28},{"dataType":"i=24","description":[{"value":"LTE-M"}],"name":"LTE-M","symbolicName":"LTE_M","value":29},{"dataType":"i=24","description":[{"value":"M-Bus"}],"name":"M-Bus","symbolicName":"M_Bus","value":30},{"dataType":"i=24","description":[{"value":"Modbus TCP"}],"name":"ModbusTCP","value":31},{"dataType":"i=24","description":[{"value":"Modbus RTU"}],"name":"ModbusRTU","value":32},{"dataType":"i=24","description":[{"value":"MP-Bus"}],"name":"MP-Bus","symbolicName":"MP_Bus","value":33},{"dataType":"i=24","description":[{"value":"NB-IOT"}],"name":"NB-IOT","symbolicName":"NB_IOT","value":34},{"dataType":"i=24","description":[{"value":"NFC"}],"name":"NFC","value":35},{"dataType":"i=24","description":[{"value":"OPC UA"}],"name":"OPCUA","value":36},{"dataType":"i=24","description":[{"value":"OPC DA"}],"name":"OPCDA","value":37},{"dataType":"i=24","description":[{"value":"PROFIBUS DP"}],"name":"PROFIBUSDP","value":38},{"dataType":"i=24","description":[{"value":"PROFINET RT"}],"name":"PROFINETRT","value":39},{"dataType":"i=24","description":[{"value":"Powerlink"}],"name":"Powerlink","value":40},{"dataType":"i=24","description":[{"value":"SERCOS"}],"name":"SERCOS","value":41},{"dataType":"i=24","description":[{"value":"SMI"}],"name":"SMI","value":42},{"dataType":"i=24","description":[{"value":"Thread"}],"name":"Thread","value":43},{"dataType":"i=24","description":[{"value":"UMTS"}],"name":"UMTS","value":44},{"dataType":"i=24","description":[{"value":"WIFI"}],"name":"WIFI","value":45},{"dataType":"i=24","description":[{"value":"X2X-Link"}],"name":"X2X-Link","symbolicName":"X2X_Link","value":46},{"dataType":"i=24","description":[{"value":"VARAN"}],"name":"VARAN","value":47},{"dataType":"i=24","description":[{"value":"ZigBee"}],"name":"ZigBee","value":48},{"dataType":"i=24","description":[{"value":"Z-Wave"}],"name":"Z-Wave","symbolicName":"Z_Wave","value":49}],"name":"1:FieldbusEnum"},"description":[{"value":"defines possible field buses"}],"displayName":[{"value":"FieldbusEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.11","nodeClass":"DataType","nodeId":"ns=1;i=3005","references":[{"referenceType":"HasProperty","target":"ns=1;i=6008"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"50","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6008","parentNodeId":"ns=1;i=3005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3005"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOther\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EFieldbus is not specified in this enumeration\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EARCNET\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EARCNET\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EAS-Interface\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EAS-Interface\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EBACnet/IP\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EBACnet/IP\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E4\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EBACnet/MSTP\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EBACnet/MSTP\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E5\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EBluetooth\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EBluetooth\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E6\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EBluetoothLowEnergy\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EBluetooth Low Energy\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E7\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ECAN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ECAN\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E8\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ECANopen\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ECANopen\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E9\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ECC-Link\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ECC-Link\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E10\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EControlNet\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EControlNet\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E11\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDALI\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EDALI\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E12\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDECTULE\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EDECT ULE\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E13\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDeviceNet\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EDeviceNet\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E14\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDMX\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EDMX\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E15\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EKNX\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EKNX\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E16\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EEnOcean\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EEnOcean\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E17\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EEtherCAT\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EEtherCAT\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E18\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EEthernet/IP\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EEthernet/IP\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E19\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EEthernetTCP/IP\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EEthernet TCP/IP\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E20\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EIEEE1588\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EIEEE1588\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E21\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EGSM\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EGSM\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E22\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EInterbus\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EInterbus\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E23\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EIO-Link\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EIO-Link\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E24\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHART\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EHART\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E25\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELON\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELON\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E26\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELoRaWAN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELoRaWAN\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E27\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELIN-Bus\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELIN-Bus\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E28\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELTE\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELTE\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E29\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELTE-M\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELTE-M\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E30\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EM-Bus\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EM-Bus\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E31\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EModbusTCP\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EModbus TCP\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E32\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EModbusRTU\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EModbus RTU\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E33\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EMP-Bus\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EMP-Bus\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E34\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ENB-IOT\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ENB-IOT\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E35\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ENFC\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ENFC\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E36\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOPCUA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EOPC UA\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E37\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOPCDA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EOPC DA\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E38\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPROFIBUSDP\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPROFIBUS DP\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E39\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPROFINETRT\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPROFINET RT\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E40\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPowerlink\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPowerlink\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E41\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESERCOS\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESERCOS\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E42\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESMI\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESMI\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E43\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EThread\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EThread\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E44\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EUMTS\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EUMTS\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E45\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EWIFI\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EWIFI\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E46\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EX2X-Link\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EX2X-Link\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E47\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EVARAN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EVARAN\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E48\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EZigBee\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EZigBee\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E49\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EZ-Wave\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EZ-Wave\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:MaintenanceLevelEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Level 1 is characterized by simple actions carried out with minimal training"}],"name":"Level1","value":0},{"dataType":"i=24","description":[{"value":"Level 2 is characterized by basic actions which have to be carried out by qualified personnel using detailed procedures "}],"name":"Level2","value":1},{"dataType":"i=24","description":[{"value":"Level 3 is characterized by complex actions carried out by qualified technical personnel using detailed procedures"}],"name":"Level3","value":2},{"dataType":"i=24","description":[{"value":"Level 4 is characterized by actions which imply the know-how of a technique or a technology and carried out by specialized technical personnel"}],"name":"Level4","value":3},{"dataType":"i=24","description":[{"value":"Level 5 is characterized by actions which imply a knowledge held by the manufacturer or a specialized company with industrial logistic support equipment"}],"name":"Level5","value":4}],"name":"1:MaintenanceLevelEnum"},"description":[{"value":"defines maintenance levels for the pump"}],"displayName":[{"value":"MaintenanceLevelEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.12","nodeClass":"DataType","nodeId":"ns=1;i=3004","references":[{"referenceType":"HasProperty","target":"ns=1;i=6001"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"5","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6001","parentNodeId":"ns=1;i=3004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3004"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELevel1\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELevel 1 is characterized by simple actions carried out with minimal training\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELevel2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELevel 2 is characterized by basic actions which have to be carried out by qualified personnel using detailed procedures \u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELevel3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELevel 3 is characterized by complex actions carried out by qualified technical personnel using detailed procedures\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELevel4\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELevel 4 is characterized by actions which imply the know-how of a technique or a technology and carried out by specialized technical personnel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E4\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELevel5\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELevel 5 is characterized by actions which imply a knowledge held by the manufacturer or a specialized company with industrial logistic support equipment\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:MultiPumpOperationModeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Standalone mode"}],"name":"Standalone","value":0},{"dataType":"i=24","description":[{"value":"pump fulfils the process function of another pump"}],"name":"RedundancyOperation","value":1},{"dataType":"i=24","description":[{"value":"supplementary fulfilling of the process function"}],"name":"AdditionOperation","value":2},{"dataType":"i=24","description":[{"value":"Redundancy and addition operation mixed"}],"name":"MixedRedundancy","value":3}],"name":"1:MultiPumpOperationModeEnum"},"description":[{"value":"specifies the actual multi pump operation mode"}],"displayName":[{"value":"MultiPumpOperationModeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.13","nodeClass":"DataType","nodeId":"ns=1;i=3011","references":[{"referenceType":"HasProperty","target":"ns=1;i=6014"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"4","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6014","parentNodeId":"ns=1;i=3011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3011"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EStandalone\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EStandalone mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ERedundancyOperation\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epump fulfils the process function of another pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EAdditionOperation\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esupplementary fulfilling of the process function\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EMixedRedundancy\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ERedundancy and addition operation mixed\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:OperatingModeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Single operating mode"}],"name":"SingleOperation","value":0},{"dataType":"i=24","description":[{"value":"Series operating mode"}],"name":"SeriesOperation","value":1},{"dataType":"i=24","description":[{"value":"Parallel operating mode"}],"name":"ParallelOperation","value":2}],"name":"1:OperatingModeEnum"},"description":[{"value":"specifies whether the pump is to be operated in single, parallel or series connection"}],"displayName":[{"value":"OperatingModeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.14","nodeClass":"DataType","nodeId":"ns=1;i=3006","references":[{"referenceType":"HasProperty","target":"ns=1;i=6009"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"3","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6009","parentNodeId":"ns=1;i=3006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3006"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESingleOperation\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESingle operating mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESeriesOperation\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESeries operating mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EParallelOperation\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EParallel operating mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:OperationModeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"standard control algorithm, not configurable"}],"name":"AutoControl","value":0},{"dataType":"i=24","description":[{"value":"pid algorithm, control parameters configurable in functional element ControlPID"}],"name":"ClosedLoopStandardPID","value":1},{"dataType":"i=24","description":[{"value":"manufacturer specific control algorithm, control parameters configurable"}],"name":"Advanced","value":2},{"dataType":"i=24","description":[{"value":"ready for operation "}],"name":"StandBy","value":3},{"dataType":"i=24","description":[{"value":"open loop operation at minimum characteristic"}],"name":"OpenLoopMin","value":4},{"dataType":"i=24","description":[{"value":"open loop operation at set point value"}],"name":"OpenLoopValue","value":5},{"dataType":"i=24","description":[{"value":"open loop operation at maximum characteristic"}],"name":"OpenLoopMax","value":6},{"dataType":"i=24","description":[{"value":"closed loop operation at minimum characteristic"}],"name":"ClosedLoopMin","value":7},{"dataType":"i=24","description":[{"value":"closed loop operation at maximum characteristic"}],"name":"ClosedLoopMax","value":8},{"dataType":"i=24","description":[{"value":"Test operation"}],"name":"Test","value":9},{"dataType":"i=24","description":[{"value":"Calibration mode"}],"name":"Calibration","value":10}],"name":"1:OperationModeEnum"},"description":[{"value":"describes the possible operation modes of the pump"}],"displayName":[{"value":"OperationModeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.15","nodeClass":"DataType","nodeId":"ns=1;i=3007","references":[{"referenceType":"HasProperty","target":"ns=1;i=6010"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"11","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6010","parentNodeId":"ns=1;i=3007","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3007"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EAutoControl\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Estandard control algorithm, not configurable\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EClosedLoopStandardPID\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epid algorithm, control parameters configurable in functional element ControlPID\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EAdvanced\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emanufacturer specific control algorithm, control parameters configurable\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EStandBy\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eready for operation \u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E4\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOpenLoopMin\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eopen loop operation at minimum characteristic\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E5\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOpenLoopValue\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eopen loop operation at set point value\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E6\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOpenLoopMax\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eopen loop operation at maximum characteristic\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E7\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EClosedLoopMin\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eclosed loop operation at minimum characteristic\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E8\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EClosedLoopMax\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eclosed loop operation at maximum characteristic\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E9\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ETest\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ETest operation\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E10\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ECalibration\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ECalibration mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PortDirectionEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D."}],"name":"In","value":0},{"dataType":"i=24","description":[{"value":"Ports with the direction \u201COut\u201D can only be connected to ports with the direction \u201CIn\u201D or \u201CInOut\u201D."}],"name":"Out","value":1},{"dataType":"i=24","description":[{"value":"Ports with the direction \u201CInOut\u201D can be connected to ports with arbitrary directions."}],"name":"InOut","value":2}],"name":"1:PortDirectionEnum"},"description":[{"value":"determines whether the port is an inlet and outlet or both"}],"displayName":[{"value":"PortDirectionEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.16","nodeClass":"DataType","nodeId":"ns=1;i=3014","references":[{"referenceType":"HasProperty","target":"ns=1;i=6017"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"3","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6017","parentNodeId":"ns=1;i=3014","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3014"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EIn\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPorts with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D.\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOut\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPorts with the direction \u201COut\u201D can only be connected to ports with the direction \u201CIn\u201D or \u201CInOut\u201D.\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EInOut\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPorts with the direction \u201CInOut\u201D can be connected to ports with arbitrary directions.\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpClassEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Rotodynamic pump"}],"name":"RotodynamicPump","value":0},{"dataType":"i=24","description":[{"value":"Positive displacement pump"}],"name":"PositiveDisplacementPump","value":1},{"dataType":"i=24","description":[{"value":"Process vacuum pump"}],"name":"ProcessVacuumPump","value":2},{"dataType":"i=24","description":[{"value":"Turbo vacuum pump"}],"name":"TurboVacuumPump","value":3},{"dataType":"i=24","description":[{"value":"Vacuum pump"}],"name":"VacuumPump","value":4},{"dataType":"i=24","description":[{"value":"Liquid pump"}],"name":"LiquidPump","value":5},{"dataType":"i=24","description":[{"value":"Pump"}],"name":"Pump","value":6}],"name":"1:PumpClassEnum","symbolicName":"DeviceTypeEnum"},"description":[{"value":"defines possible pump types"}],"displayName":[{"value":"PumpClassEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.8","nodeClass":"DataType","nodeId":"ns=1;i=3021","references":[{"referenceType":"HasProperty","target":"ns=1;i=12083"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29","symbolicName":"DeviceTypeEnum"},{"arrayDimensions":"7","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12083","parentNodeId":"ns=1;i=3021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3021"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ERotodynamicPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ERotodynamic pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPositiveDisplacementPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPositive displacement pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EProcessVacuumPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EProcess vacuum pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ETurboVacuumPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ETurbo vacuum pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E4\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EVacuumPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EVacuum pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E5\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ELiquidPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ELiquid pump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E6\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPump\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPump\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpKickModeEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Manufacturer specific pump kick mode"}],"name":"ManufacturerSpecific","value":0},{"dataType":"i=24","description":[{"value":"Pump kick mode disabled"}],"name":"Disabled","value":1},{"dataType":"i=24","description":[{"value":"Operator specific pump kick mode"}],"name":"OperatorSpecific","value":2}],"name":"1:PumpKickModeEnum"},"description":[{"value":"describes the pump kick mode of the pump"}],"displayName":[{"value":"PumpKickModeEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.17","nodeClass":"DataType","nodeId":"ns=1;i=3009","references":[{"referenceType":"HasProperty","target":"ns=1;i=6012"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"3","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6012","parentNodeId":"ns=1;i=3009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3009"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EManufacturerSpecific\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EManufacturer specific pump kick mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDisabled\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EPump kick mode disabled\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOperatorSpecific\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EOperator specific pump kick mode\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpRoleEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Slave"}],"name":"Slave","value":0},{"dataType":"i=24","description":[{"value":"Master"}],"name":"Master","value":1},{"dataType":"i=24","description":[{"value":"Slave and auxiliary master"}],"name":"SlaveAndAuxiliaryMaster","value":2}],"name":"1:PumpRoleEnum"},"description":[{"value":"identifies the role rsp. task of the pump within the multi pump management"}],"displayName":[{"value":"PumpRoleEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.18","nodeClass":"DataType","nodeId":"ns=1;i=3010","references":[{"referenceType":"HasProperty","target":"ns=1;i=6013"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"3","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6013","parentNodeId":"ns=1;i=3010","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3010"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESlave\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESlave\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EMaster\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EMaster\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003ESlaveAndAuxiliaryMaster\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003ESlave and auxiliary master\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:StateOfTheItemEnum","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Item is in up state and non-operating outside required time"}],"name":"IdleState","value":0},{"dataType":"i=24","description":[{"value":"Item is in up state and non-operating during required time"}],"name":"StandByState","value":1},{"dataType":"i=24","description":[{"value":"Item is in up state and operating as required"}],"name":"OperatingState","value":2},{"dataType":"i=24","description":[{"value":"Item is in up state, but lacks required external resources or is disabled due to planned actions other than maintenance"}],"name":"ExternalDisabledState","value":3},{"dataType":"i=24","description":[{"value":"Item is unable to perform a required function due to preventive maintenance or a fault"}],"name":"DownState","value":4}],"name":"1:StateOfTheItemEnum"},"description":[{"value":"describes the state of the pump"}],"displayName":[{"value":"StateOfTheItemEnum"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.19","nodeClass":"DataType","nodeId":"ns=1;i=3003","references":[{"referenceType":"HasProperty","target":"ns=1;i=6006"},{"isForward":false,"referenceType":"HasSubtype","target":"i=29"}],"superType":"i=29"},{"arrayDimensions":"5","browseName":"EnumValues","dataType":"EnumValueType","displayName":[{"value":"EnumValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6006","parentNodeId":"ns=1;i=3003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3003"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E0\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EIdleState\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EItem is in up state and non-operating outside required time\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E1\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EStandByState\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EItem is in up state and non-operating during required time\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E2\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EOperatingState\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EItem is in up state and operating as required\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E3\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EExternalDisabledState\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EItem is in up state, but lacks required external resources or is disabled due to planned actions other than maintenance\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=7616\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EnumValueType\u003E\n \u003Cuax:Value\u003E4\u003C/uax:Value\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EDownState\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003EItem is unable to perform a required function due to preventive maintenance or a fault\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EnumValueType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:DeclarationOfConformityOptionSet","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2006/ 42/ EG, concerning machinery and amending Directive 95/16/EG"}],"name":"2006_42_EC","symbolicName":"S2006_42_EC","value":0},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2009/ 125/ EC, establishing a framework for the setting of ecodesign requirements for energy-related products"}],"name":"2009_125_EC","symbolicName":"S2009_125_EC","value":1},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2011/ 65/ EU, restriction of the use of certain hazardous substances in electrical and electronic equipment"}],"name":"2011_65_EU","symbolicName":"S2011_65_EU","value":2},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2014/ 35/ EU, harmonisation of the laws of the Member States on the provision of electrical equipment for use within certain voltage limits on the market"}],"name":"2014_35_EU","symbolicName":"S2014_35_EU","value":3},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2014/ 34/ EU, harmonisation of the laws of the Member States concerning equipment and protective systems intended for use in potentially explosive atmospheres"}],"name":"2014_34_EU","symbolicName":"S2014_34_EU","value":4},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2014/ 30/ EU, harmonisation of the laws of the Member States on electromagnetic compatibility"}],"name":"2014_30_EU","symbolicName":"S2014_30_EU","value":5},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2014/ 68/ EU, harmonisation of Member States\u0027 legislation on the provision of pressure equipment on the market"}],"name":"2014_68_EU","symbolicName":"S2014_68_EU","value":6},{"dataType":"i=24","description":[{"value":"Directives of the EU Declaration of Conformity - 2014/ 29/ EU, harmonisation of the laws of the Member States relating to the making available on the market of simple pressure vessels"}],"name":"2014_29_EU","symbolicName":"S2014_29_EU","value":7}],"isOptionSet":true,"name":"1:DeclarationOfConformityOptionSet"},"description":[{"value":"defines flags for directives on the basis of which conformity was determined"}],"displayName":[{"value":"DeclarationOfConformityOptionSet"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.2","nodeClass":"DataType","nodeId":"ns=1;i=3019","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=12755"},{"referenceType":"HasEncoding","target":"ns=1;i=5013"},{"referenceType":"HasEncoding","target":"ns=1;i=5015"},{"referenceType":"HasEncoding","target":"ns=1;i=5014"},{"referenceType":"HasProperty","target":"ns=1;i=14976"}],"superType":"i=12755"},{"arrayDimensions":"8","browseName":"OptionSetValues","dataType":"LocalizedText","displayName":[{"value":"OptionSetValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14976","parentNodeId":"ns=1;i=3019","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3019"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfLocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2006_42_EC\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2009_125_EC\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2011_65_EU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2014_35_EU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2014_34_EU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2014_30_EU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2014_68_EU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2014_29_EU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003C/uax:ListOfLocalizedText\u003E"},{"browseName":"1:ExplosionProtectionOptionSet","definition":{"fields":[{"dataType":"i=24","description":[{"value":"This category is intended for use in underground mines and their surface installations which may be endangered by firedamp and/or combustible dust. Category 1 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a very high level of safety. (2014/34/EU)"}],"name":"M1","value":0},{"dataType":"i=24","description":[{"value":"This category is intended for use in underground mines and their surface installations which may be endangered by firedamp and/or combustible dust. Category 2 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a high level of safety. (2014/34/EU)"}],"name":"M2","value":1},{"dataType":"i=24","description":[{"value":"Devices in this category are intended for use in areas in which an explosive atmosphere consisting of a mixture of air and gases, vapours or mists is present. Category 1 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a very high level of safety. (2014/34/EU)"}],"name":"1G","symbolicName":"S1G","value":2},{"dataType":"i=24","description":[{"value":"Devices in this category are intended for use in areas in which an explosive atmosphere consisting of a mixture of air and gases, vapours or mists is present. Category 2 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a high level of safety. (2014/34/EU)"}],"name":"2G","symbolicName":"S2G","value":3},{"dataType":"i=24","description":[{"value":"Devices in this category are intended for use in areas in which an explosive atmosphere consisting of a mixture of air and gases, vapours or mists is present. Category 3 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a normal level of safety. (2014/34/EU)"}],"name":"3G","symbolicName":"S3G","value":4},{"dataType":"i=24","description":[{"value":"Devices in this category are intended for use in areas in which an explosive atmosphere consisting of a mixture of air and dust is present. Category 1 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a very high level of safety. (2014/34/EU)"}],"name":"1D","symbolicName":"S1D","value":5},{"dataType":"i=24","description":[{"value":"Devices in this category are intended for use in areas in which an explosive atmosphere consisting of a mixture of air and dust is present. Category 2 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a high level of safety. (2014/34/EU)"}],"name":"2D","symbolicName":"S2D","value":6},{"dataType":"i=24","description":[{"value":"Devices in this category are intended for use in areas in which an explosive atmosphere consisting of a mixture of air and dust is present. Category 3 comprises devices designed to be capable of functioning in conformity with the parameters specified by the manufacturer and ensuring a normal level of safety. (2014/34/EU)"}],"name":"3D","symbolicName":"S3D","value":7}],"isOptionSet":true,"name":"1:ExplosionProtectionOptionSet"},"description":[{"value":"defines flags for the category of explosion protection for devices according to EU Directive 2014/34/EU (ATEX)"}],"displayName":[{"value":"ExplosionProtectionOptionSet"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.3","nodeClass":"DataType","nodeId":"ns=1;i=3016","references":[{"referenceType":"HasEncoding","target":"ns=1;i=5004"},{"referenceType":"HasEncoding","target":"ns=1;i=5006"},{"referenceType":"HasEncoding","target":"ns=1;i=5005"},{"isForward":false,"referenceType":"HasSubtype","target":"i=12755"},{"referenceType":"HasProperty","target":"ns=1;i=14982"}],"superType":"i=12755"},{"arrayDimensions":"8","browseName":"OptionSetValues","dataType":"LocalizedText","displayName":[{"value":"OptionSetValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14982","parentNodeId":"ns=1;i=3016","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3016"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfLocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EM1\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EM2\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E1G\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2G\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E3G\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E1D\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E2D\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003E3D\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003C/uax:ListOfLocalizedText\u003E"},{"browseName":"1:ExplosionZoneOptionSet","definition":{"fields":[{"dataType":"i=24","description":[{"value":"A zone in which an explosive atmosphere consisting of a mixture with air of flammable substances in the form of gas, vapour or mist is present continuously or for long periods or frequently."}],"name":"Zone 0","symbolicName":"Zone_0","value":0},{"dataType":"i=24","description":[{"value":"A zone in which an explosive atmosphere consisting of a mixture with air of flammable substances in the form of gas, vapour or mist is likely to occur in normal operation occasionally."}],"name":"Zone 1","symbolicName":"Zone_1","value":1},{"dataType":"i=24","description":[{"value":"A zone in which an explosive atmosphere consisting of a mixture with air of flammable substances in the form of gas, vapour or mist is not likely to occur in normal operation but, if it does occur, will persist for a short period only."}],"name":"Zone 2","symbolicName":"Zone_2","value":2},{"dataType":"i=24","description":[{"value":"A zone in which an explosive atmosphere in the form of a cloud of combustible dust in air is present continuously, for long periods or frequently."}],"name":"Zone 20","symbolicName":"Zone_20","value":3},{"dataType":"i=24","description":[{"value":"A zone in which an explosive atmosphere in the form of a cloud of combustible dust in air is likely to occur in normal operation occasionally."}],"name":"Zone 21","symbolicName":"Zone_21","value":4},{"dataType":"i=24","description":[{"value":"A zone in which an explosive atmosphere in the form of a cloud of combustible dust in air is not likely to occur in normal operation but, if it does occur, will persist for a short period only."}],"name":"Zone 22","symbolicName":"Zone_22","value":5}],"isOptionSet":true,"name":"1:ExplosionZoneOptionSet"},"description":[{"value":"defines flags for the category of explosion zones for devices"}],"displayName":[{"value":"ExplosionZoneOptionSet"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.4","nodeClass":"DataType","nodeId":"ns=1;i=3015","references":[{"referenceType":"HasEncoding","target":"ns=1;i=5001"},{"referenceType":"HasEncoding","target":"ns=1;i=5003"},{"referenceType":"HasEncoding","target":"ns=1;i=5002"},{"isForward":false,"referenceType":"HasSubtype","target":"i=12755"},{"referenceType":"HasProperty","target":"ns=1;i=14988"}],"superType":"i=12755"},{"arrayDimensions":"6","browseName":"OptionSetValues","dataType":"LocalizedText","displayName":[{"value":"OptionSetValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14988","parentNodeId":"ns=1;i=3015","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3015"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfLocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZone 0\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZone 1\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZone 2\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZone 20\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZone 21\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZone 22\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003C/uax:ListOfLocalizedText\u003E"},{"browseName":"1:OfferedControlModesOptionSet","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Constant pressure control mode"}],"name":"Constant pressure control","symbolicName":"Constant_pressure_control","value":0},{"dataType":"i=24","description":[{"value":"Constant temperature control mode"}],"name":"Constant temperature control","symbolicName":"Constant_temperature_control","value":1},{"dataType":"i=24","description":[{"value":"Differential pressure control mode"}],"name":"Differential pressure control","symbolicName":"Differential_pressure_control","value":2},{"dataType":"i=24","description":[{"value":"Constant differential pressure control mode"}],"name":"Constant differential pressure control","symbolicName":"Constant_differential_pressure_control","value":3},{"dataType":"i=24","description":[{"value":"Variable differential pressure control mode"}],"name":"Variable differential pressure control","symbolicName":"Variable_differential_pressure_control","value":4},{"dataType":"i=24","description":[{"value":"Flow-dependent differential pressure control mode"}],"name":"Flow_dependent differential pressure control","symbolicName":"Flow_dependent_differential_pressure_control","value":5},{"dataType":"i=24","description":[{"value":"Return flow temperature control mode"}],"name":"Return flow temperature control","symbolicName":"Return_flow_temperature_control","value":6},{"dataType":"i=24","description":[{"value":"Flow temperature control mode"}],"name":"Flow temperature control","symbolicName":"Flow_temperature_control","value":7},{"dataType":"i=24","description":[{"value":"Flow rate control mode"}],"name":"Flow rate control","symbolicName":"Flow_rate_control","value":8},{"dataType":"i=24","description":[{"value":"Automatic control mode"}],"name":"Automatic","value":9},{"dataType":"i=24","description":[{"value":"None / uncontrolled mode"}],"name":"Uncontrolled","value":10},{"dataType":"i=24","description":[{"value":"Speed control mode"}],"name":"Speed control","symbolicName":"Speed_control","value":11}],"isOptionSet":true,"name":"1:OfferedControlModesOptionSet"},"description":[{"value":"defines flags for offerd control modes supported by the manufacturer for the product"}],"displayName":[{"value":"OfferedControlModesOptionSet"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.5","nodeClass":"DataType","nodeId":"ns=1;i=3017","references":[{"referenceType":"HasEncoding","target":"ns=1;i=5007"},{"referenceType":"HasEncoding","target":"ns=1;i=5009"},{"referenceType":"HasEncoding","target":"ns=1;i=5008"},{"isForward":false,"referenceType":"HasSubtype","target":"i=12755"},{"referenceType":"HasProperty","target":"ns=1;i=14994"}],"superType":"i=12755"},{"arrayDimensions":"12","browseName":"OptionSetValues","dataType":"LocalizedText","displayName":[{"value":"OptionSetValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14994","parentNodeId":"ns=1;i=3017","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3017"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfLocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EConstant pressure control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EConstant temperature control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EDifferential pressure control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EConstant differential pressure control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EVariable differential pressure control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EFlow_dependent differential pressure control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EReturn flow temperature control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EFlow temperature control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EFlow rate control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EAutomatic\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EUncontrolled\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ESpeed control\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003C/uax:ListOfLocalizedText\u003E"},{"browseName":"1:OfferedFieldbusesOptionSet","definition":{"fields":[{"dataType":"i=24","description":[{"value":"Additional fieldbuses listed in the AdditionalFieldbuses variable"}],"name":"Other","value":0},{"dataType":"i=24","description":[{"value":"ARCNET"}],"name":"ARCNET","value":1},{"dataType":"i=24","description":[{"value":"AS-Interface"}],"name":"AS_Interface","value":2},{"dataType":"i=24","description":[{"value":"BACnet/IP"}],"name":"BACnet_IP","value":3},{"dataType":"i=24","description":[{"value":"BACnet/MSTP"}],"name":"BACnet_MSTP","value":4},{"dataType":"i=24","description":[{"value":"Bluetooth"}],"name":"Bluetooth","value":5},{"dataType":"i=24","description":[{"value":"Bluetooth Low Energy"}],"name":"Bluetooth Low Energy","symbolicName":"Bluetooth_Low_Energy","value":6},{"dataType":"i=24","description":[{"value":"CAN"}],"name":"CAN","value":7},{"dataType":"i=24","description":[{"value":"CANopen"}],"name":"CANopen","value":8},{"dataType":"i=24","description":[{"value":"CC-Link"}],"name":"CC_Link","value":9},{"dataType":"i=24","description":[{"value":"ControlNet"}],"name":"ControlNet","value":10},{"dataType":"i=24","description":[{"value":"DALI"}],"name":"DALI","value":11},{"dataType":"i=24","description":[{"value":"DECT ULE"}],"name":"DECT ULE","symbolicName":"DECT_ULE","value":12},{"dataType":"i=24","description":[{"value":"DeviceNet"}],"name":"DeviceNet","value":13},{"dataType":"i=24","description":[{"value":"DMX"}],"name":"DMX","value":14},{"dataType":"i=24","description":[{"value":"KNX"}],"name":"KNX","value":15},{"dataType":"i=24","description":[{"value":"EnOcean"}],"name":"EnOcean","value":16},{"dataType":"i=24","description":[{"value":"EtherCAT"}],"name":"EtherCAT","value":17},{"dataType":"i=24","description":[{"value":"Ethernet/IP"}],"name":"Ethernet_IP","value":18},{"dataType":"i=24","description":[{"value":"Ethernet TCP/IP"}],"name":"Ethernet TCP_IP","symbolicName":"Ethernet_TCP_IP","value":19},{"dataType":"i=24","description":[{"value":"IEEE1588"}],"name":"IEEE1588","value":20},{"dataType":"i=24","description":[{"value":"GSM"}],"name":"GSM","value":21},{"dataType":"i=24","description":[{"value":"Interbus"}],"name":"Interbus","value":22},{"dataType":"i=24","description":[{"value":"IO-Link"}],"name":"IO_Link","value":23},{"dataType":"i=24","description":[{"value":"HART"}],"name":"HART","value":24},{"dataType":"i=24","description":[{"value":"LON"}],"name":"LON","value":25},{"dataType":"i=24","description":[{"value":"LoRaWAN"}],"name":"LoRaWAN","value":26},{"dataType":"i=24","description":[{"value":"LIN-Bus"}],"name":"LIN_Bus","value":27},{"dataType":"i=24","description":[{"value":"LTE"}],"name":"LTE","value":28},{"dataType":"i=24","description":[{"value":"LTE-M"}],"name":"LTE_M","value":29},{"dataType":"i=24","description":[{"value":"M-Bus"}],"name":"M_Bus","value":30},{"dataType":"i=24","description":[{"value":"Modbus TCP"}],"name":"Modbus TCP","symbolicName":"Modbus_TCP","value":31},{"dataType":"i=24","description":[{"value":"Modbus RTU"}],"name":"Modbus RTU","symbolicName":"Modbus_RTU","value":32},{"dataType":"i=24","description":[{"value":"MP-Bus"}],"name":"MP_Bus","value":33},{"dataType":"i=24","description":[{"value":"NB-IOT"}],"name":"NB_IOT","value":34},{"dataType":"i=24","description":[{"value":"NFC"}],"name":"NFC","value":35},{"dataType":"i=24","description":[{"value":"OPC UA"}],"name":"OPC UA","symbolicName":"OPC_UA","value":36},{"dataType":"i=24","description":[{"value":"OPC DA"}],"name":"OPC DA","symbolicName":"OPC_DA","value":37},{"dataType":"i=24","description":[{"value":"PROFIBUS DP"}],"name":"PROFIBUS DP","symbolicName":"PROFIBUS_DP","value":38},{"dataType":"i=24","description":[{"value":"PROFINET RT"}],"name":"PROFINET RT","symbolicName":"PROFINET_RT","value":39},{"dataType":"i=24","description":[{"value":"Powerlink"}],"name":"Powerlink","value":40},{"dataType":"i=24","description":[{"value":"SERCOS"}],"name":"SERCOS","value":41},{"dataType":"i=24","description":[{"value":"SMI"}],"name":"SMI","value":42},{"dataType":"i=24","description":[{"value":"Thread"}],"name":"Thread","value":43},{"dataType":"i=24","description":[{"value":"UMTS"}],"name":"UMTS","value":44},{"dataType":"i=24","description":[{"value":"WIFI"}],"name":"WIFI","value":45},{"dataType":"i=24","description":[{"value":"X2X_Link"}],"name":"X2X_Link","value":46},{"dataType":"i=24","description":[{"value":"VARAN"}],"name":"VARAN","value":47},{"dataType":"i=24","description":[{"value":"ZigBee"}],"name":"ZigBee","value":48},{"dataType":"i=24","description":[{"value":"Z-Wave"}],"name":"Z_Wave","value":49}],"isOptionSet":true,"name":"1:OfferedFieldbusesOptionSet"},"description":[{"value":"defines flags for fieldbuses supported by the manufacturer for the product"}],"displayName":[{"value":"OfferedFieldbusesOptionSet"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.6","nodeClass":"DataType","nodeId":"ns=1;i=3018","references":[{"referenceType":"HasEncoding","target":"ns=1;i=5010"},{"referenceType":"HasEncoding","target":"ns=1;i=5012"},{"referenceType":"HasEncoding","target":"ns=1;i=5011"},{"isForward":false,"referenceType":"HasSubtype","target":"i=12755"},{"referenceType":"HasProperty","target":"ns=1;i=15000"}],"superType":"i=12755"},{"arrayDimensions":"50","browseName":"OptionSetValues","dataType":"LocalizedText","displayName":[{"value":"OptionSetValues"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=15000","parentNodeId":"ns=1;i=3018","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=3018"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfLocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EOther\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EARCNET\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EAS_Interface\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EBACnet_IP\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EBACnet_MSTP\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EBluetooth\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EBluetooth Low Energy\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ECAN\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ECANopen\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ECC_Link\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EControlNet\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EDALI\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EDECT ULE\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EDeviceNet\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EDMX\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EKNX\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EEnOcean\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EEtherCAT\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EEthernet_IP\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EEthernet TCP_IP\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EIEEE1588\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EGSM\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EInterbus\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EIO_Link\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EHART\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ELON\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ELoRaWAN\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ELIN_Bus\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ELTE\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ELTE_M\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EM_Bus\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EModbus TCP\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EModbus RTU\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EMP_Bus\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ENB_IOT\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ENFC\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EOPC UA\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EOPC DA\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EPROFIBUS DP\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EPROFINET RT\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EPowerlink\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ESERCOS\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003ESMI\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EThread\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EUMTS\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EWIFI\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EX2X_Link\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EVARAN\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZigBee\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003Cuax:LocalizedText\u003E\n \u003Cuax:Text\u003EZ_Wave\u003C/uax:Text\u003E\n \u003C/uax:LocalizedText\u003E\n \u003C/uax:ListOfLocalizedText\u003E"},{"browseName":"1:PhysicalAddressDataType","definition":{"fields":[{"dataType":"LocalizedText","description":[{"value":"Street name where the manufacturer is located."}],"isOptional":true,"name":"Street"},{"dataType":"LocalizedText","description":[{"value":"Street number where the manufacturer is located."}],"isOptional":true,"name":"Number"},{"dataType":"LocalizedText","description":[{"value":"City where the manufacturer is located."}],"isOptional":true,"name":"City"},{"dataType":"LocalizedText","description":[{"value":"Postal code where the manufacturer is located."}],"isOptional":true,"name":"PostalCode"},{"dataType":"LocalizedText","description":[{"value":"State where the manufacturer is located."}],"isOptional":true,"name":"State"},{"dataType":"LocalizedText","description":[{"value":"Country where the manufacturer is located."}],"isOptional":true,"name":"Country"}],"name":"1:PhysicalAddressDataType"},"description":[{"value":"Physical address of the manufacturer."}],"displayName":[{"value":"PhysicalAddressDataType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/8.1","nodeClass":"DataType","nodeId":"ns=1;i=3020","references":[{"referenceType":"HasEncoding","target":"ns=1;i=5016"},{"referenceType":"HasEncoding","target":"ns=1;i=5018"},{"referenceType":"HasEncoding","target":"ns=1;i=5017"},{"isForward":false,"referenceType":"HasSubtype","target":"i=22"}],"superType":"i=22"},{"browseName":"1:PhysicalAddressDataType","dataType":"String","displayName":[{"value":"PhysicalAddressDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=6028","parentNodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5016"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6002"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPhysicalAddressDataType\u003C/uax:String\u003E"},{"browseName":"1:PhysicalAddressDataType","dataType":"String","displayName":[{"value":"PhysicalAddressDataType"}],"nodeClass":"Variable","nodeId":"ns=1;i=6029","parentNodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5017"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6004"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027PhysicalAddressDataType\u0027]\u003C/uax:String\u003E"},{"browseName":"1:TypeDictionary","dataType":"ByteString","description":[{"value":"Collects the data type descriptions of http://opcfoundation.org/UA/Pumps/"}],"displayName":[{"value":"TypeDictionary"}],"nodeClass":"Variable","nodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=72"},{"referenceType":"HasComponent","target":"ns=1;i=6026"},{"referenceType":"HasComponent","target":"ns=1;i=6020"},{"referenceType":"HasComponent","target":"ns=1;i=6018"},{"referenceType":"HasProperty","target":"ns=1;i=6003"},{"referenceType":"HasComponent","target":"ns=1;i=6022"},{"referenceType":"HasComponent","target":"ns=1;i=6024"},{"referenceType":"HasComponent","target":"ns=1;i=6028"},{"isForward":false,"referenceType":"HasComponent","target":"i=93"}],"symbolicName":"TypeDictionary_BinarySchema","typeDefinition":"i=72","valueXml":"\u003Cuax:ByteString xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPG9wYzpUeXBlRGljdGlvbmFyeSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZ\n W1hLWluc3RhbmNlIiB4bWxuczp0bnM9Imh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9Qd\n W1wcy8iIERlZmF1bHRCeXRlT3JkZXI9IkxpdHRsZUVuZGlhbiIgeG1sbnM6b3BjPSJodHRwO\n i8vb3BjZm91bmRhdGlvbi5vcmcvQmluYXJ5U2NoZW1hLyIgeG1sbnM6dWE9Imh0dHA6Ly9vc\n GNmb3VuZGF0aW9uLm9yZy9VQS8iIFRhcmdldE5hbWVzcGFjZT0iaHR0cDovL29wY2ZvdW5kY\n XRpb24ub3JnL1VBL1B1bXBzLyI\u002BCiA8b3BjOkltcG9ydCBOYW1lc3BhY2U9Imh0dHA6Ly9vc\n GNmb3VuZGF0aW9uLm9yZy9VQS8iLz4KIDxvcGM6U3RydWN0dXJlZFR5cGUgQmFzZVR5cGU9I\n nVhOk9wdGlvblNldCIgTmFtZT0iRGVjbGFyYXRpb25PZkNvbmZvcm1pdHlPcHRpb25TZXQiP\n gogIDxvcGM6RG9jdW1lbnRhdGlvbj5kZWZpbmVzIGZsYWdzIGZvciBkaXJlY3RpdmVzIG9uI\n HRoZSBiYXNpcyBvZiB3aGljaCBjb25mb3JtaXR5IHdhcyBkZXRlcm1pbmVkPC9vcGM6RG9jd\n W1lbnRhdGlvbj4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTmFtZ\n T0iVmFsdWUiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTmFtZ\n T0iVmFsaWRCaXRzIi8\u002BCiA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4KIDxvcGM6U3RydWN0dXJlZ\n FR5cGUgQmFzZVR5cGU9InVhOk9wdGlvblNldCIgTmFtZT0iRXhwbG9zaW9uUHJvdGVjdGlvb\n k9wdGlvblNldCI\u002BCiAgPG9wYzpEb2N1bWVudGF0aW9uPmRlZmluZXMgZmxhZ3MgZm9yIHRoZ\n SBjYXRlZ29yeSBvZiBleHBsb3Npb24gcHJvdGVjdGlvbiBmb3IgZGV2aWNlcyBhY2NvcmRpb\n mcgdG8gRVUgRGlyZWN0aXZlIDIwMTQvMzQvRVUgKEFURVgpPC9vcGM6RG9jdW1lbnRhdGlvb\n j4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTmFtZT0iVmFsdWUiL\n z4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTmFtZT0iVmFsaWRCa\n XRzIi8\u002BCiA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4KIDxvcGM6U3RydWN0dXJlZFR5cGUgQmFzZ\n VR5cGU9InVhOk9wdGlvblNldCIgTmFtZT0iRXhwbG9zaW9uWm9uZU9wdGlvblNldCI\u002BCiAgP\n G9wYzpEb2N1bWVudGF0aW9uPmRlZmluZXMgZmxhZ3MgZm9yIHRoZSBjYXRlZ29yeSBvZiBle\n HBsb3Npb24gem9uZXMgZm9yIGRldmljZXM8L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6R\n mllbGQgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiBOYW1lPSJWYWx1ZSIvPgogIDxvcGM6R\n mllbGQgVHlwZU5hbWU9Im9wYzpCeXRlU3RyaW5nIiBOYW1lPSJWYWxpZEJpdHMiLz4KIDwvb\n 3BjOlN0cnVjdHVyZWRUeXBlPgogPG9wYzpTdHJ1Y3R1cmVkVHlwZSBCYXNlVHlwZT0idWE6T\n 3B0aW9uU2V0IiBOYW1lPSJPZmZlcmVkQ29udHJvbE1vZGVzT3B0aW9uU2V0Ij4KICA8b3BjO\n kRvY3VtZW50YXRpb24\u002BZGVmaW5lcyBmbGFncyBmb3Igb2ZmZXJkIGNvbnRyb2wgbW9kZXMgc\n 3VwcG9ydGVkIGJ5IHRoZSBtYW51ZmFjdHVyZXIgZm9yIHRoZSBwcm9kdWN0PC9vcGM6RG9jd\n W1lbnRhdGlvbj4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTmFtZ\n T0iVmFsdWUiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qnl0ZVN0cmluZyIgTmFtZ\n T0iVmFsaWRCaXRzIi8\u002BCiA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4KIDxvcGM6U3RydWN0dXJlZ\n FR5cGUgQmFzZVR5cGU9InVhOk9wdGlvblNldCIgTmFtZT0iT2ZmZXJlZEZpZWxkYnVzZXNPc\n HRpb25TZXQiPgogIDxvcGM6RG9jdW1lbnRhdGlvbj5kZWZpbmVzIGZsYWdzIGZvciBmaWVsZ\n GJ1c2VzIHN1cHBvcnRlZCBieSB0aGUgbWFudWZhY3R1cmVyIGZvciB0aGUgcHJvZHVjdDwvb\n 3BjOkRvY3VtZW50YXRpb24\u002BCiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpb\n mciIE5hbWU9IlZhbHVlIi8\u002BCiAgPG9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJ5dGVTdHJpb\n mciIE5hbWU9IlZhbGlkQml0cyIvPgogPC9vcGM6U3RydWN0dXJlZFR5cGU\u002BCiA8b3BjOlN0c\n nVjdHVyZWRUeXBlIEJhc2VUeXBlPSJ1YTpFeHRlbnNpb25PYmplY3QiIE5hbWU9IlBoeXNpY\n 2FsQWRkcmVzc0RhdGFUeXBlIj4KICA8b3BjOkRvY3VtZW50YXRpb24\u002BUGh5c2ljYWwgYWRkc\n mVzcyBvZiB0aGUgbWFudWZhY3R1cmVyLjwvb3BjOkRvY3VtZW50YXRpb24\u002BCiAgPG9wYzpGa\n WVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iU3RyZWV0U3BlY2lmaWVkIi8\u002BCiAgPG9wY\n zpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iTnVtYmVyU3BlY2lmaWVkIi8\u002BCiAgP\n G9wYzpGaWVsZCBUeXBlTmFtZT0ib3BjOkJpdCIgTmFtZT0iQ2l0eVNwZWNpZmllZCIvPgogI\n DxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IlBvc3RhbENvZGVTcGVjaWZpZ\n WQiLz4KICA8b3BjOkZpZWxkIFR5cGVOYW1lPSJvcGM6Qml0IiBOYW1lPSJTdGF0ZVNwZWNpZ\n mllZCIvPgogIDxvcGM6RmllbGQgVHlwZU5hbWU9Im9wYzpCaXQiIE5hbWU9IkNvdW50cnlTc\n GVjaWZpZWQiLz4KICA8b3BjOkZpZWxkIExlbmd0aD0iMjYiIFR5cGVOYW1lPSJvcGM6Qml0I\n iBOYW1lPSJSZXNlcnZlZDEiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJTdHJlZXRTc\n GVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBOYW1lPSJTdHJlZXQiLz4KI\n CA8b3BjOkZpZWxkIFN3aXRjaEZpZWxkPSJOdW1iZXJTcGVjaWZpZWQiIFR5cGVOYW1lPSJ1Y\n TpMb2NhbGl6ZWRUZXh0IiBOYW1lPSJOdW1iZXIiLz4KICA8b3BjOkZpZWxkIFN3aXRjaEZpZ\n WxkPSJDaXR5U3BlY2lmaWVkIiBUeXBlTmFtZT0idWE6TG9jYWxpemVkVGV4dCIgTmFtZT0iQ\n 2l0eSIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IlBvc3RhbENvZGVTcGVjaWZpZWQiI\n FR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBOYW1lPSJQb3N0YWxDb2RlIi8\u002BCiAgPG9wY\n zpGaWVsZCBTd2l0Y2hGaWVsZD0iU3RhdGVTcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpMb2Nhb\n Gl6ZWRUZXh0IiBOYW1lPSJTdGF0ZSIvPgogIDxvcGM6RmllbGQgU3dpdGNoRmllbGQ9IkNvd\n W50cnlTcGVjaWZpZWQiIFR5cGVOYW1lPSJ1YTpMb2NhbGl6ZWRUZXh0IiBOYW1lPSJDb3Vud\n HJ5Ii8\u002BCiA8L29wYzpTdHJ1Y3R1cmVkVHlwZT4KIDxvcGM6RW51bWVyYXRlZFR5cGUgTGVuZ\n 3RoSW5CaXRzPSIzMiIgTmFtZT0iQ29udHJvbE1vZGVFbnVtIj4KICA8b3BjOkRvY3VtZW50Y\n XRpb24\u002BZGVzY3JpYmVzIHRoZSBwb3NzaWJsZSBjb250cm9sIG1vZGVzIG9mIHRoZSBwdW1wP\n C9vcGM6RG9jdW1lbnRhdGlvbj4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJDb25zd\n GFudFByZXNzdXJlQ29udHJvbCIgVmFsdWU9IjAiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1Z\n SBOYW1lPSJDb25zdGFudFRlbXBlcmF0dXJlQ29udHJvbCIgVmFsdWU9IjEiLz4KICA8b3BjO\n kVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEaWZmZXJlbnRpYWxQcmVzc3VyZUNvbnRyb2wiIFZhb\n HVlPSIyIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQ29uc3RhbnREaWZmZXJlb\n nRpYWxQcmVzc3VyZUNvbnRyb2wiIFZhbHVlPSIzIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsd\n WUgTmFtZT0iVmFyaWFibGVEaWZmZXJlbnRpYWxQcmVzc3VyZUNvbnRyb2wiIFZhbHVlPSI0I\n i8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRmxvd0RlcGVuZGVudERpZmZlcmVud\n GlhbFByZXNzdXJlQ29udHJvbCIgVmFsdWU9IjUiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1Z\n SBOYW1lPSJSZXR1cm5GbG93VGVtcGVyYXR1cmVDb250cm9sIiBWYWx1ZT0iNiIvPgogIDxvc\n GM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkZsb3dUZW1wZXJhdHVyZUNvbnRyb2wiIFZhbHVlP\n SI3Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRmxvd1JhdGVDb250cm9sIiBWY\n Wx1ZT0iOCIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlNwZWVkQ29udHJvbCIgV\n mFsdWU9IjkiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBdXRvbWF0aWMiIFZhb\n HVlPSIxMCIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlVuY29udHJvbGxlZCIgV\n mFsdWU9IjExIi8\u002BCiA8L29wYzpFbnVtZXJhdGVkVHlwZT4KIDxvcGM6RW51bWVyYXRlZFR5c\n GUgTGVuZ3RoSW5CaXRzPSIzMiIgTmFtZT0iRGlzdHJpYnV0aW9uVHlwZUVudW0iPgogIDxvc\n GM6RG9jdW1lbnRhdGlvbj5kZXNjcmliZXMgdGhlIHNoYXJlIG9mIG9wZXJhdGlvbiB0aW1lI\n G9mIGRpZmZlcmVudCBwdW1wcyBvZiB0aGUgcHVtcCBzeXN0ZW0gaW4gYWRkaXRpb24gb3Blc\n mF0aW9uIG1vZGU8L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlI\n E5hbWU9Ik1hbnVmYWN0dXJlclNwZWNpZmljIiBWYWx1ZT0iMCIvPgogIDxvcGM6RW51bWVyY\n XRlZFZhbHVlIE5hbWU9Ik9wZXJhdG9yU3BlY2lmaWMiIFZhbHVlPSIxIi8\u002BCiAgPG9wYzpFb\n nVtZXJhdGVkVmFsdWUgTmFtZT0iQ29uY2VybmluZ1RpbWVEaXN0cmlidXRpb24iIFZhbHVlP\n SIyIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQ29uY2VybmluZ0xvYWREaXN0c\n mlidXRpb24iIFZhbHVlPSIzIi8\u002BCiA8L29wYzpFbnVtZXJhdGVkVHlwZT4KIDxvcGM6RW51b\n WVyYXRlZFR5cGUgTGVuZ3RoSW5CaXRzPSIzMiIgTmFtZT0iRXhjaGFuZ2VNb2RlRW51bSI\u002BC\n iAgPG9wYzpEb2N1bWVudGF0aW9uPnNwZWNpZmllcyB0aGUgZXhjaGFuZ2UgbW9kZSBvZiB0a\n GUgcHVtcDwvb3BjOkRvY3VtZW50YXRpb24\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZ\n T0iTWFudWZhY3R1cmVyU3BlY2lmaWMiIFZhbHVlPSIwIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkV\n mFsdWUgTmFtZT0iRXhjaGFuZ2VEaXNhYmxlZCIgVmFsdWU9IjEiLz4KICA8b3BjOkVudW1lc\n mF0ZWRWYWx1ZSBOYW1lPSJPcGVyYXRvclNwZWNpZmljIiBWYWx1ZT0iMiIvPgogPC9vcGM6R\n W51bWVyYXRlZFR5cGU\u002BCiA8b3BjOkVudW1lcmF0ZWRUeXBlIExlbmd0aEluQml0cz0iMzIiI\n E5hbWU9IkZpZWxkYnVzRW51bSI\u002BCiAgPG9wYzpEb2N1bWVudGF0aW9uPmRlZmluZXMgcG9zc\n 2libGUgZmllbGQgYnVzZXM8L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RW51bWVyYXRlZ\n FZhbHVlIE5hbWU9Ik90aGVyIiBWYWx1ZT0iMCIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlI\n E5hbWU9IkFSQ05FVCIgVmFsdWU9IjEiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lP\n SJBUy1JbnRlcmZhY2UiIFZhbHVlPSIyIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZ\n T0iQkFDbmV0L0lQIiBWYWx1ZT0iMyIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9I\n kJBQ25ldC9NU1RQIiBWYWx1ZT0iNCIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9I\n kJsdWV0b290aCIgVmFsdWU9IjUiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJCb\n HVldG9vdGhMb3dFbmVyZ3kiIFZhbHVlPSI2Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgT\n mFtZT0iQ0FOIiBWYWx1ZT0iNyIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkNBT\n m9wZW4iIFZhbHVlPSI4Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iQ0MtTGlua\n yIgVmFsdWU9IjkiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJDb250cm9sTmV0I\n iBWYWx1ZT0iMTAiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEQUxJIiBWYWx1Z\n T0iMTEiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJERUNUVUxFIiBWYWx1ZT0iM\n TIiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEZXZpY2VOZXQiIFZhbHVlPSIxM\n yIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkRNWCIgVmFsdWU9IjE0Ii8\u002BCiAgP\n G9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iS05YIiBWYWx1ZT0iMTUiLz4KICA8b3BjOkVud\n W1lcmF0ZWRWYWx1ZSBOYW1lPSJFbk9jZWFuIiBWYWx1ZT0iMTYiLz4KICA8b3BjOkVudW1lc\n mF0ZWRWYWx1ZSBOYW1lPSJFdGhlckNBVCIgVmFsdWU9IjE3Ii8\u002BCiAgPG9wYzpFbnVtZXJhd\n GVkVmFsdWUgTmFtZT0iRXRoZXJuZXQvSVAiIFZhbHVlPSIxOCIvPgogIDxvcGM6RW51bWVyY\n XRlZFZhbHVlIE5hbWU9IkV0aGVybmV0VENQL0lQIiBWYWx1ZT0iMTkiLz4KICA8b3BjOkVud\n W1lcmF0ZWRWYWx1ZSBOYW1lPSJJRUVFMTU4OCIgVmFsdWU9IjIwIi8\u002BCiAgPG9wYzpFbnVtZ\n XJhdGVkVmFsdWUgTmFtZT0iR1NNIiBWYWx1ZT0iMjEiLz4KICA8b3BjOkVudW1lcmF0ZWRWY\n Wx1ZSBOYW1lPSJJbnRlcmJ1cyIgVmFsdWU9IjIyIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsd\n WUgTmFtZT0iSU8tTGluayIgVmFsdWU9IjIzIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgT\n mFtZT0iSEFSVCIgVmFsdWU9IjI0Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iT\n E9OIiBWYWx1ZT0iMjUiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJMb1JhV0FOI\n iBWYWx1ZT0iMjYiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJMSU4tQnVzIiBWY\n Wx1ZT0iMjciLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJMVEUiIFZhbHVlPSIyO\n CIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IkxURS1NIiBWYWx1ZT0iMjkiLz4KI\n CA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJNLUJ1cyIgVmFsdWU9IjMwIi8\u002BCiAgPG9wY\n zpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTW9kYnVzVENQIiBWYWx1ZT0iMzEiLz4KICA8b3BjO\n kVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJNb2RidXNSVFUiIFZhbHVlPSIzMiIvPgogIDxvcGM6R\n W51bWVyYXRlZFZhbHVlIE5hbWU9Ik1QLUJ1cyIgVmFsdWU9IjMzIi8\u002BCiAgPG9wYzpFbnVtZ\n XJhdGVkVmFsdWUgTmFtZT0iTkItSU9UIiBWYWx1ZT0iMzQiLz4KICA8b3BjOkVudW1lcmF0Z\n WRWYWx1ZSBOYW1lPSJORkMiIFZhbHVlPSIzNSIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlI\n E5hbWU9Ik9QQ1VBIiBWYWx1ZT0iMzYiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lP\n SJPUENEQSIgVmFsdWU9IjM3Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUFJPR\n klCVVNEUCIgVmFsdWU9IjM4Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUFJPR\n klORVRSVCIgVmFsdWU9IjM5Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUG93Z\n XJsaW5rIiBWYWx1ZT0iNDAiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTRVJDT\n 1MiIFZhbHVlPSI0MSIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlNNSSIgVmFsd\n WU9IjQyIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVGhyZWFkIiBWYWx1ZT0iN\n DMiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJVTVRTIiBWYWx1ZT0iNDQiLz4KI\n CA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJXSUZJIiBWYWx1ZT0iNDUiLz4KICA8b3BjO\n kVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJYMlgtTGluayIgVmFsdWU9IjQ2Ii8\u002BCiAgPG9wYzpFb\n nVtZXJhdGVkVmFsdWUgTmFtZT0iVkFSQU4iIFZhbHVlPSI0NyIvPgogIDxvcGM6RW51bWVyY\n XRlZFZhbHVlIE5hbWU9IlppZ0JlZSIgVmFsdWU9IjQ4Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkV\n mFsdWUgTmFtZT0iWi1XYXZlIiBWYWx1ZT0iNDkiLz4KIDwvb3BjOkVudW1lcmF0ZWRUeXBlP\n gogPG9wYzpFbnVtZXJhdGVkVHlwZSBMZW5ndGhJbkJpdHM9IjMyIiBOYW1lPSJNYWludGVuY\n W5jZUxldmVsRW51bSI\u002BCiAgPG9wYzpEb2N1bWVudGF0aW9uPmRlZmluZXMgbWFpbnRlbmFuY\n 2UgbGV2ZWxzIGZvciB0aGUgcHVtcDwvb3BjOkRvY3VtZW50YXRpb24\u002BCiAgPG9wYzpFbnVtZ\n XJhdGVkVmFsdWUgTmFtZT0iTGV2ZWwxIiBWYWx1ZT0iMCIvPgogIDxvcGM6RW51bWVyYXRlZ\n FZhbHVlIE5hbWU9IkxldmVsMiIgVmFsdWU9IjEiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1Z\n SBOYW1lPSJMZXZlbDMiIFZhbHVlPSIyIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZ\n T0iTGV2ZWw0IiBWYWx1ZT0iMyIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9Ikxld\n mVsNSIgVmFsdWU9IjQiLz4KIDwvb3BjOkVudW1lcmF0ZWRUeXBlPgogPG9wYzpFbnVtZXJhd\n GVkVHlwZSBMZW5ndGhJbkJpdHM9IjMyIiBOYW1lPSJNdWx0aVB1bXBPcGVyYXRpb25Nb2RlR\n W51bSI\u002BCiAgPG9wYzpEb2N1bWVudGF0aW9uPnNwZWNpZmllcyB0aGUgYWN0dWFsIG11bHRpI\n HB1bXAgb3BlcmF0aW9uIG1vZGU8L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RW51bWVyY\n XRlZFZhbHVlIE5hbWU9IlN0YW5kYWxvbmUiIFZhbHVlPSIwIi8\u002BCiAgPG9wYzpFbnVtZXJhd\n GVkVmFsdWUgTmFtZT0iUmVkdW5kYW5jeU9wZXJhdGlvbiIgVmFsdWU9IjEiLz4KICA8b3BjO\n kVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJBZGRpdGlvbk9wZXJhdGlvbiIgVmFsdWU9IjIiLz4KI\n CA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJNaXhlZFJlZHVuZGFuY3kiIFZhbHVlPSIzI\n i8\u002BCiA8L29wYzpFbnVtZXJhdGVkVHlwZT4KIDxvcGM6RW51bWVyYXRlZFR5cGUgTGVuZ3RoS\n W5CaXRzPSIzMiIgTmFtZT0iT3BlcmF0aW5nTW9kZUVudW0iPgogIDxvcGM6RG9jdW1lbnRhd\n Glvbj5zcGVjaWZpZXMgd2hldGhlciB0aGUgcHVtcCBpcyB0byBiZSBvcGVyYXRlZCBpbiBza\n W5nbGUsIHBhcmFsbGVsIG9yIHNlcmllcyBjb25uZWN0aW9uPC9vcGM6RG9jdW1lbnRhdGlvb\n j4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTaW5nbGVPcGVyYXRpb24iIFZhbHVlP\n SIwIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iU2VyaWVzT3BlcmF0aW9uIiBWY\n Wx1ZT0iMSIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlBhcmFsbGVsT3BlcmF0a\n W9uIiBWYWx1ZT0iMiIvPgogPC9vcGM6RW51bWVyYXRlZFR5cGU\u002BCiA8b3BjOkVudW1lcmF0Z\n WRUeXBlIExlbmd0aEluQml0cz0iMzIiIE5hbWU9Ik9wZXJhdGlvbk1vZGVFbnVtIj4KICA8b\n 3BjOkRvY3VtZW50YXRpb24\u002BZGVzY3JpYmVzIHRoZSBwb3NzaWJsZSBvcGVyYXRpb24gbW9kZ\n XMgb2YgdGhlIHB1bXA8L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RW51bWVyYXRlZFZhb\n HVlIE5hbWU9IkF1dG9Db250cm9sIiBWYWx1ZT0iMCIvPgogIDxvcGM6RW51bWVyYXRlZFZhb\n HVlIE5hbWU9IkNsb3NlZExvb3BTdGFuZGFyZFBJRCIgVmFsdWU9IjEiLz4KICA8b3BjOkVud\n W1lcmF0ZWRWYWx1ZSBOYW1lPSJBZHZhbmNlZCIgVmFsdWU9IjIiLz4KICA8b3BjOkVudW1lc\n mF0ZWRWYWx1ZSBOYW1lPSJTdGFuZEJ5IiBWYWx1ZT0iMyIvPgogIDxvcGM6RW51bWVyYXRlZ\n FZhbHVlIE5hbWU9Ik9wZW5Mb29wTWluIiBWYWx1ZT0iNCIvPgogIDxvcGM6RW51bWVyYXRlZ\n FZhbHVlIE5hbWU9Ik9wZW5Mb29wVmFsdWUiIFZhbHVlPSI1Ii8\u002BCiAgPG9wYzpFbnVtZXJhd\n GVkVmFsdWUgTmFtZT0iT3Blbkxvb3BNYXgiIFZhbHVlPSI2Ii8\u002BCiAgPG9wYzpFbnVtZXJhd\n GVkVmFsdWUgTmFtZT0iQ2xvc2VkTG9vcE1pbiIgVmFsdWU9IjciLz4KICA8b3BjOkVudW1lc\n mF0ZWRWYWx1ZSBOYW1lPSJDbG9zZWRMb29wTWF4IiBWYWx1ZT0iOCIvPgogIDxvcGM6RW51b\n WVyYXRlZFZhbHVlIE5hbWU9IlRlc3QiIFZhbHVlPSI5Ii8\u002BCiAgPG9wYzpFbnVtZXJhdGVkV\n mFsdWUgTmFtZT0iQ2FsaWJyYXRpb24iIFZhbHVlPSIxMCIvPgogPC9vcGM6RW51bWVyYXRlZ\n FR5cGU\u002BCiA8b3BjOkVudW1lcmF0ZWRUeXBlIExlbmd0aEluQml0cz0iMzIiIE5hbWU9IlBvc\n nREaXJlY3Rpb25FbnVtIj4KICA8b3BjOkRvY3VtZW50YXRpb24\u002BZGV0ZXJtaW5lcyB3aGV0a\n GVyIHRoZSBwb3J0IGlzIGFuIGlubGV0IGFuZCBvdXRsZXQgb3IgYm90aDwvb3BjOkRvY3VtZ\n W50YXRpb24\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSW4iIFZhbHVlPSIwIi8\u002BC\n iAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iT3V0IiBWYWx1ZT0iMSIvPgogIDxvcGM6R\n W51bWVyYXRlZFZhbHVlIE5hbWU9IkluT3V0IiBWYWx1ZT0iMiIvPgogPC9vcGM6RW51bWVyY\n XRlZFR5cGU\u002BCiA8b3BjOkVudW1lcmF0ZWRUeXBlIExlbmd0aEluQml0cz0iMzIiIE5hbWU9I\n lB1bXBDbGFzc0VudW0iPgogIDxvcGM6RG9jdW1lbnRhdGlvbj5kZWZpbmVzIHBvc3NpYmxlI\n HB1bXAgdHlwZXM8L29wYzpEb2N1bWVudGF0aW9uPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlI\n E5hbWU9IlJvdG9keW5hbWljUHVtcCIgVmFsdWU9IjAiLz4KICA8b3BjOkVudW1lcmF0ZWRWY\n Wx1ZSBOYW1lPSJQb3NpdGl2ZURpc3BsYWNlbWVudFB1bXAiIFZhbHVlPSIxIi8\u002BCiAgPG9wY\n zpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iUHJvY2Vzc1ZhY3V1bVB1bXAiIFZhbHVlPSIyIi8\u002BC\n iAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iVHVyYm9WYWN1dW1QdW1wIiBWYWx1ZT0iM\n yIvPgogIDxvcGM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlZhY3V1bVB1bXAiIFZhbHVlPSI0I\n i8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iTGlxdWlkUHVtcCIgVmFsdWU9IjUiL\n z4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJQdW1wIiBWYWx1ZT0iNiIvPgogPC9vc\n GM6RW51bWVyYXRlZFR5cGU\u002BCiA8b3BjOkVudW1lcmF0ZWRUeXBlIExlbmd0aEluQml0cz0iM\n zIiIE5hbWU9IlB1bXBLaWNrTW9kZUVudW0iPgogIDxvcGM6RG9jdW1lbnRhdGlvbj5kZXNjc\n mliZXMgdGhlIHB1bXAga2ljayBtb2RlIG9mIHRoZSBwdW1wPC9vcGM6RG9jdW1lbnRhdGlvb\n j4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJNYW51ZmFjdHVyZXJTcGVjaWZpYyIgV\n mFsdWU9IjAiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJEaXNhYmxlZCIgVmFsd\n WU9IjEiLz4KICA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJPcGVyYXRvclNwZWNpZmljI\n iBWYWx1ZT0iMiIvPgogPC9vcGM6RW51bWVyYXRlZFR5cGU\u002BCiA8b3BjOkVudW1lcmF0ZWRUe\n XBlIExlbmd0aEluQml0cz0iMzIiIE5hbWU9IlB1bXBSb2xlRW51bSI\u002BCiAgPG9wYzpEb2N1b\n WVudGF0aW9uPmlkZW50aWZpZXMgdGhlIHJvbGUgcnNwLiB0YXNrIG9mIHRoZSBwdW1wIHdpd\n GhpbiB0aGUgbXVsdGkgcHVtcCBtYW5hZ2VtZW50PC9vcGM6RG9jdW1lbnRhdGlvbj4KICA8b\n 3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJTbGF2ZSIgVmFsdWU9IjAiLz4KICA8b3BjOkVud\n W1lcmF0ZWRWYWx1ZSBOYW1lPSJNYXN0ZXIiIFZhbHVlPSIxIi8\u002BCiAgPG9wYzpFbnVtZXJhd\n GVkVmFsdWUgTmFtZT0iU2xhdmVBbmRBdXhpbGlhcnlNYXN0ZXIiIFZhbHVlPSIyIi8\u002BCiA8L\n 29wYzpFbnVtZXJhdGVkVHlwZT4KIDxvcGM6RW51bWVyYXRlZFR5cGUgTGVuZ3RoSW5CaXRzP\n SIzMiIgTmFtZT0iU3RhdGVPZlRoZUl0ZW1FbnVtIj4KICA8b3BjOkRvY3VtZW50YXRpb24\u002BZ\n GVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgcHVtcDwvb3BjOkRvY3VtZW50YXRpb24\u002BCiAgP\n G9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iSWRsZVN0YXRlIiBWYWx1ZT0iMCIvPgogIDxvc\n GM6RW51bWVyYXRlZFZhbHVlIE5hbWU9IlN0YW5kQnlTdGF0ZSIgVmFsdWU9IjEiLz4KICA8b\n 3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJPcGVyYXRpbmdTdGF0ZSIgVmFsdWU9IjIiLz4KI\n CA8b3BjOkVudW1lcmF0ZWRWYWx1ZSBOYW1lPSJFeHRlcm5hbERpc2FibGVkU3RhdGUiIFZhb\n HVlPSIzIi8\u002BCiAgPG9wYzpFbnVtZXJhdGVkVmFsdWUgTmFtZT0iRG93blN0YXRlIiBWYWx1Z\n T0iNCIvPgogPC9vcGM6RW51bWVyYXRlZFR5cGU\u002BCjwvb3BjOlR5cGVEaWN0aW9uYXJ5Pgo=\u003C/uax:ByteString\u003E"},{"browseName":"1:DeclarationOfConformityOptionSet","dataType":"String","displayName":[{"value":"DeclarationOfConformityOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6026","parentNodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5013"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6002"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EDeclarationOfConformityOptionSet\u003C/uax:String\u003E"},{"browseName":"1:ExplosionProtectionOptionSet","dataType":"String","displayName":[{"value":"ExplosionProtectionOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6020","parentNodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5004"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6002"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EExplosionProtectionOptionSet\u003C/uax:String\u003E"},{"browseName":"1:ExplosionZoneOptionSet","dataType":"String","displayName":[{"value":"ExplosionZoneOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6018","parentNodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5001"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6002"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EExplosionZoneOptionSet\u003C/uax:String\u003E"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=6003","parentNodeId":"ns=1;i=6002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6002"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/Pumps/\u003C/uax:String\u003E"},{"browseName":"1:OfferedControlModesOptionSet","dataType":"String","displayName":[{"value":"OfferedControlModesOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6022","parentNodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5007"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6002"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EOfferedControlModesOptionSet\u003C/uax:String\u003E"},{"browseName":"1:OfferedFieldbusesOptionSet","dataType":"String","displayName":[{"value":"OfferedFieldbusesOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6024","parentNodeId":"ns=1;i=6002","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5010"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6002"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EOfferedFieldbusesOptionSet\u003C/uax:String\u003E"},{"browseName":"1:TypeDictionary","dataType":"ByteString","description":[{"value":"Collects the data type descriptions of http://opcfoundation.org/UA/Pumps/"}],"displayName":[{"value":"TypeDictionary"}],"nodeClass":"Variable","nodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=72"},{"referenceType":"HasComponent","target":"ns=1;i=6027"},{"referenceType":"HasComponent","target":"ns=1;i=6021"},{"referenceType":"HasComponent","target":"ns=1;i=6019"},{"referenceType":"HasProperty","target":"ns=1;i=6005"},{"referenceType":"HasComponent","target":"ns=1;i=6023"},{"referenceType":"HasComponent","target":"ns=1;i=6025"},{"referenceType":"HasComponent","target":"ns=1;i=6029"},{"isForward":false,"referenceType":"HasComponent","target":"i=92"}],"symbolicName":"TypeDictionary_XmlSchema","typeDefinition":"i=72","valueXml":"\u003Cuax:ByteString xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPHhzOnNjaGVtYSBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdGFyZ2V0TmFtZXNwYWNlPSJod\n HRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvUHVtcHMvVHlwZXMueHNkIiB4bWxuczp0bnM9I\n mh0dHA6Ly9vcGNmb3VuZGF0aW9uLm9yZy9VQS9QdW1wcy9UeXBlcy54c2QiIHhtbG5zOnVhP\n SJodHRwOi8vb3BjZm91bmRhdGlvbi5vcmcvVUEvMjAwOC8wMi9UeXBlcy54c2QiIHhtbG5zO\n nhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI\u002BCiA8eHM6aW1wb3J0IG5hb\n WVzcGFjZT0iaHR0cDovL29wY2ZvdW5kYXRpb24ub3JnL1VBLzIwMDgvMDIvVHlwZXMueHNkI\n i8\u002BCiA8eHM6c2ltcGxlVHlwZSBuYW1lPSJDb250cm9sTW9kZUVudW0iPgogIDx4czphbm5vd\n GF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvbj5kZXNjcmliZXMgdGhlIHBvc3NpYmxlIGNvb\n nRyb2wgbW9kZXMgb2YgdGhlIHB1bXA8L3hzOmRvY3VtZW50YXRpb24\u002BCiAgPC94czphbm5vd\n GF0aW9uPgogIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgogICA8eHM6ZW51b\n WVyYXRpb24gdmFsdWU9IkNvbnN0YW50UHJlc3N1cmVDb250cm9sXzAiLz4KICAgPHhzOmVud\n W1lcmF0aW9uIHZhbHVlPSJDb25zdGFudFRlbXBlcmF0dXJlQ29udHJvbF8xIi8\u002BCiAgIDx4c\n zplbnVtZXJhdGlvbiB2YWx1ZT0iRGlmZmVyZW50aWFsUHJlc3N1cmVDb250cm9sXzIiLz4KI\n CAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDb25zdGFudERpZmZlcmVudGlhbFByZXNzdXJlQ\n 29udHJvbF8zIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVmFyaWFibGVEaWZmZXJlb\n nRpYWxQcmVzc3VyZUNvbnRyb2xfNCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZsb\n 3dEZXBlbmRlbnREaWZmZXJlbnRpYWxQcmVzc3VyZUNvbnRyb2xfNSIvPgogICA8eHM6ZW51b\n WVyYXRpb24gdmFsdWU9IlJldHVybkZsb3dUZW1wZXJhdHVyZUNvbnRyb2xfNiIvPgogICA8e\n HM6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dUZW1wZXJhdHVyZUNvbnRyb2xfNyIvPgogICA8e\n HM6ZW51bWVyYXRpb24gdmFsdWU9IkZsb3dSYXRlQ29udHJvbF84Ii8\u002BCiAgIDx4czplbnVtZ\n XJhdGlvbiB2YWx1ZT0iU3BlZWRDb250cm9sXzkiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhb\n HVlPSJBdXRvbWF0aWNfMTAiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVbmNvbnRyb\n 2xsZWRfMTEiLz4KICA8L3hzOnJlc3RyaWN0aW9uPgogPC94czpzaW1wbGVUeXBlPgogPHhzO\n mVsZW1lbnQgdHlwZT0idG5zOkNvbnRyb2xNb2RlRW51bSIgbmFtZT0iQ29udHJvbE1vZGVFb\n nVtIi8\u002BCiA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mQ29udHJvbE1vZGVFbnVtIj4KI\n CA8eHM6c2VxdWVuY2U\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzP\n SJ1bmJvdW5kZWQiIHR5cGU9InRuczpDb250cm9sTW9kZUVudW0iIG5hbWU9IkNvbnRyb2xNb\n 2RlRW51bSIgbmlsbGFibGU9InRydWUiLz4KICA8L3hzOnNlcXVlbmNlPgogPC94czpjb21wb\n GV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuczpMaXN0T2ZDb250cm9sTW9kZUVudW0iI\n G5hbWU9Ikxpc3RPZkNvbnRyb2xNb2RlRW51bSIgbmlsbGFibGU9InRydWUiLz4KIDx4czpza\n W1wbGVUeXBlIG5hbWU9IkRpc3RyaWJ1dGlvblR5cGVFbnVtIj4KICA8eHM6YW5ub3RhdGlvb\n j4KICAgPHhzOmRvY3VtZW50YXRpb24\u002BZGVzY3JpYmVzIHRoZSBzaGFyZSBvZiBvcGVyYXRpb\n 24gdGltZSBvZiBkaWZmZXJlbnQgcHVtcHMgb2YgdGhlIHB1bXAgc3lzdGVtIGluIGFkZGl0a\n W9uIG9wZXJhdGlvbiBtb2RlPC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6YW5ub3RhdGlvb\n j4KICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KICAgPHhzOmVudW1lcmF0a\n W9uIHZhbHVlPSJNYW51ZmFjdHVyZXJTcGVjaWZpY18wIi8\u002BCiAgIDx4czplbnVtZXJhdGlvb\n iB2YWx1ZT0iT3BlcmF0b3JTcGVjaWZpY18xIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1Z\n T0iQ29uY2VybmluZ1RpbWVEaXN0cmlidXRpb25fMiIvPgogICA8eHM6ZW51bWVyYXRpb24gd\n mFsdWU9IkNvbmNlcm5pbmdMb2FkRGlzdHJpYnV0aW9uXzMiLz4KICA8L3hzOnJlc3RyaWN0a\n W9uPgogPC94czpzaW1wbGVUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOkRpc3RyaWJ1d\n GlvblR5cGVFbnVtIiBuYW1lPSJEaXN0cmlidXRpb25UeXBlRW51bSIvPgogPHhzOmNvbXBsZ\n XhUeXBlIG5hbWU9Ikxpc3RPZkRpc3RyaWJ1dGlvblR5cGVFbnVtIj4KICA8eHM6c2VxdWVuY\n 2U\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiI\n HR5cGU9InRuczpEaXN0cmlidXRpb25UeXBlRW51bSIgbmFtZT0iRGlzdHJpYnV0aW9uVHlwZ\n UVudW0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxle\n FR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mRGlzdHJpYnV0aW9uVHlwZUVud\n W0iIG5hbWU9Ikxpc3RPZkRpc3RyaWJ1dGlvblR5cGVFbnVtIiBuaWxsYWJsZT0idHJ1ZSIvP\n gogPHhzOnNpbXBsZVR5cGUgbmFtZT0iRXhjaGFuZ2VNb2RlRW51bSI\u002BCiAgPHhzOmFubm90Y\n XRpb24\u002BCiAgIDx4czpkb2N1bWVudGF0aW9uPnNwZWNpZmllcyB0aGUgZXhjaGFuZ2UgbW9kZ\n SBvZiB0aGUgcHVtcDwveHM6ZG9jdW1lbnRhdGlvbj4KICA8L3hzOmFubm90YXRpb24\u002BCiAgP\n HhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2Y\n Wx1ZT0iTWFudWZhY3R1cmVyU3BlY2lmaWNfMCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsd\n WU9IkV4Y2hhbmdlRGlzYWJsZWRfMSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZ\n XJhdG9yU3BlY2lmaWNfMiIvPgogIDwveHM6cmVzdHJpY3Rpb24\u002BCiA8L3hzOnNpbXBsZVR5c\n GU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6RXhjaGFuZ2VNb2RlRW51bSIgbmFtZT0iRXhja\n GFuZ2VNb2RlRW51bSIvPgogPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZkV4Y2hhbmdlT\n W9kZUVudW0iPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwI\n iBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOkV4Y2hhbmdlTW9kZUVudW0iIG5hb\n WU9IkV4Y2hhbmdlTW9kZUVudW0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZ\n T4KIDwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mRXhja\n GFuZ2VNb2RlRW51bSIgbmFtZT0iTGlzdE9mRXhjaGFuZ2VNb2RlRW51bSIgbmlsbGFibGU9I\n nRydWUiLz4KIDx4czpzaW1wbGVUeXBlIG5hbWU9IkZpZWxkYnVzRW51bSI\u002BCiAgPHhzOmFub\n m90YXRpb24\u002BCiAgIDx4czpkb2N1bWVudGF0aW9uPmRlZmluZXMgcG9zc2libGUgZmllbGQgY\n nVzZXM8L3hzOmRvY3VtZW50YXRpb24\u002BCiAgPC94czphbm5vdGF0aW9uPgogIDx4czpyZXN0c\n mljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik90a\n GVyXzAiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBUkNORVRfMSIvPgogICA8eHM6Z\n W51bWVyYXRpb24gdmFsdWU9IkFTLUludGVyZmFjZV8yIi8\u002BCiAgIDx4czplbnVtZXJhdGlvb\n iB2YWx1ZT0iQkFDbmV0L0lQXzMiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCQUNuZ\n XQvTVNUUF80Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQmx1ZXRvb3RoXzUiLz4KI\n CAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJCbHVldG9vdGhMb3dFbmVyZ3lfNiIvPgogICA8e\n HM6ZW51bWVyYXRpb24gdmFsdWU9IkNBTl83Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1Z\n T0iQ0FOb3Blbl84Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ0MtTGlua185Ii8\u002BC\n iAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ29udHJvbE5ldF8xMCIvPgogICA8eHM6ZW51b\n WVyYXRpb24gdmFsdWU9IkRBTElfMTEiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJER\n UNUVUxFXzEyIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGV2aWNlTmV0XzEzIi8\u002BC\n iAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRE1YXzE0Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvb\n iB2YWx1ZT0iS05YXzE1Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRW5PY2Vhbl8xN\n iIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkV0aGVyQ0FUXzE3Ii8\u002BCiAgIDx4czplb\n nVtZXJhdGlvbiB2YWx1ZT0iRXRoZXJuZXQvSVBfMTgiLz4KICAgPHhzOmVudW1lcmF0aW9uI\n HZhbHVlPSJFdGhlcm5ldFRDUC9JUF8xOSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9I\n klFRUUxNTg4XzIwIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iR1NNXzIxIi8\u002BCiAgI\n Dx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZXJidXNfMjIiLz4KICAgPHhzOmVudW1lcmF0a\n W9uIHZhbHVlPSJJTy1MaW5rXzIzIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSV\n F8yNCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxPTl8yNSIvPgogICA8eHM6ZW51b\n WVyYXRpb24gdmFsdWU9IkxvUmFXQU5fMjYiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlP\n SJMSU4tQnVzXzI3Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTFRFXzI4Ii8\u002BCiAgI\n Dx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTFRFLU1fMjkiLz4KICAgPHhzOmVudW1lcmF0aW9uI\n HZhbHVlPSJNLUJ1c18zMCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGJ1c1RDU\n F8zMSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik1vZGJ1c1JUVV8zMiIvPgogICA8e\n HM6ZW51bWVyYXRpb24gdmFsdWU9Ik1QLUJ1c18zMyIvPgogICA8eHM6ZW51bWVyYXRpb24gd\n mFsdWU9Ik5CLUlPVF8zNCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5GQ18zNSIvP\n gogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9QQ1VBXzM2Ii8\u002BCiAgIDx4czplbnVtZXJhd\n GlvbiB2YWx1ZT0iT1BDREFfMzciLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9GS\n UJVU0RQXzM4Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPRklORVRSVF8zOSIvP\n gogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBvd2VybGlua180MCIvPgogICA8eHM6ZW51b\n WVyYXRpb24gdmFsdWU9IlNFUkNPU180MSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9I\n lNNSV80MiIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlRocmVhZF80MyIvPgogICA8e\n HM6ZW51bWVyYXRpb24gdmFsdWU9IlVNVFNfNDQiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhb\n HVlPSJXSUZJXzQ1Ii8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iWDJYLUxpbmtfNDYiL\n z4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJWQVJBTl80NyIvPgogICA8eHM6ZW51bWVyY\n XRpb24gdmFsdWU9IlppZ0JlZV80OCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlotV\n 2F2ZV80OSIvPgogIDwveHM6cmVzdHJpY3Rpb24\u002BCiA8L3hzOnNpbXBsZVR5cGU\u002BCiA8eHM6Z\n WxlbWVudCB0eXBlPSJ0bnM6RmllbGRidXNFbnVtIiBuYW1lPSJGaWVsZGJ1c0VudW0iLz4KI\n Dx4czpjb21wbGV4VHlwZSBuYW1lPSJMaXN0T2ZGaWVsZGJ1c0VudW0iPgogIDx4czpzZXF1Z\n W5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZ\n CIgdHlwZT0idG5zOkZpZWxkYnVzRW51bSIgbmFtZT0iRmllbGRidXNFbnVtIiBuaWxsYWJsZ\n T0idHJ1ZSIvPgogIDwveHM6c2VxdWVuY2U\u002BCiA8L3hzOmNvbXBsZXhUeXBlPgogPHhzOmVsZ\n W1lbnQgdHlwZT0idG5zOkxpc3RPZkZpZWxkYnVzRW51bSIgbmFtZT0iTGlzdE9mRmllbGRid\n XNFbnVtIiBuaWxsYWJsZT0idHJ1ZSIvPgogPHhzOnNpbXBsZVR5cGUgbmFtZT0iTWFpbnRlb\n mFuY2VMZXZlbEVudW0iPgogIDx4czphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvb\n j5kZWZpbmVzIG1haW50ZW5hbmNlIGxldmVscyBmb3IgdGhlIHB1bXA8L3hzOmRvY3VtZW50Y\n XRpb24\u002BCiAgPC94czphbm5vdGF0aW9uPgogIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzd\n HJpbmciPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsMV8wIi8\u002BCiAgIDx4czplb\n nVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWwyXzEiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlP\n SJMZXZlbDNfMiIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkxldmVsNF8zIi8\u002BCiAgI\n Dx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTGV2ZWw1XzQiLz4KICA8L3hzOnJlc3RyaWN0aW9uP\n gogPC94czpzaW1wbGVUeXBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOk1haW50ZW5hbmNlT\n GV2ZWxFbnVtIiBuYW1lPSJNYWludGVuYW5jZUxldmVsRW51bSIvPgogPHhzOmNvbXBsZXhUe\n XBlIG5hbWU9Ikxpc3RPZk1haW50ZW5hbmNlTGV2ZWxFbnVtIj4KICA8eHM6c2VxdWVuY2U\u002BC\n iAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHR5c\n GU9InRuczpNYWludGVuYW5jZUxldmVsRW51bSIgbmFtZT0iTWFpbnRlbmFuY2VMZXZlbEVud\n W0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5c\n GU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mTWFpbnRlbmFuY2VMZXZlbEVudW0iI\n G5hbWU9Ikxpc3RPZk1haW50ZW5hbmNlTGV2ZWxFbnVtIiBuaWxsYWJsZT0idHJ1ZSIvPgogP\n HhzOnNpbXBsZVR5cGUgbmFtZT0iTXVsdGlQdW1wT3BlcmF0aW9uTW9kZUVudW0iPgogIDx4c\n zphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvbj5zcGVjaWZpZXMgdGhlIGFjdHVhb\n CBtdWx0aSBwdW1wIG9wZXJhdGlvbiBtb2RlPC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6Y\n W5ub3RhdGlvbj4KICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KICAgPHhzO\n mVudW1lcmF0aW9uIHZhbHVlPSJTdGFuZGFsb25lXzAiLz4KICAgPHhzOmVudW1lcmF0aW9uI\n HZhbHVlPSJSZWR1bmRhbmN5T3BlcmF0aW9uXzEiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhb\n HVlPSJBZGRpdGlvbk9wZXJhdGlvbl8yIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT\n Wl4ZWRSZWR1bmRhbmN5XzMiLz4KICA8L3hzOnJlc3RyaWN0aW9uPgogPC94czpzaW1wbGVUe\n XBlPgogPHhzOmVsZW1lbnQgdHlwZT0idG5zOk11bHRpUHVtcE9wZXJhdGlvbk1vZGVFbnVtI\n iBuYW1lPSJNdWx0aVB1bXBPcGVyYXRpb25Nb2RlRW51bSIvPgogPHhzOmNvbXBsZXhUeXBlI\n G5hbWU9Ikxpc3RPZk11bHRpUHVtcE9wZXJhdGlvbk1vZGVFbnVtIj4KICA8eHM6c2VxdWVuY\n 2U\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiI\n HR5cGU9InRuczpNdWx0aVB1bXBPcGVyYXRpb25Nb2RlRW51bSIgbmFtZT0iTXVsdGlQdW1wT\n 3BlcmF0aW9uTW9kZUVudW0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KI\n DwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mTXVsdGlQd\n W1wT3BlcmF0aW9uTW9kZUVudW0iIG5hbWU9Ikxpc3RPZk11bHRpUHVtcE9wZXJhdGlvbk1vZ\n GVFbnVtIiBuaWxsYWJsZT0idHJ1ZSIvPgogPHhzOnNpbXBsZVR5cGUgbmFtZT0iT3BlcmF0a\n W5nTW9kZUVudW0iPgogIDx4czphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvbj5zc\n GVjaWZpZXMgd2hldGhlciB0aGUgcHVtcCBpcyB0byBiZSBvcGVyYXRlZCBpbiBzaW5nbGUsI\n HBhcmFsbGVsIG9yIHNlcmllcyBjb25uZWN0aW9uPC94czpkb2N1bWVudGF0aW9uPgogIDwve\n HM6YW5ub3RhdGlvbj4KICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KICAgP\n HhzOmVudW1lcmF0aW9uIHZhbHVlPSJTaW5nbGVPcGVyYXRpb25fMCIvPgogICA8eHM6ZW51b\n WVyYXRpb24gdmFsdWU9IlNlcmllc09wZXJhdGlvbl8xIi8\u002BCiAgIDx4czplbnVtZXJhdGlvb\n iB2YWx1ZT0iUGFyYWxsZWxPcGVyYXRpb25fMiIvPgogIDwveHM6cmVzdHJpY3Rpb24\u002BCiA8L\n 3hzOnNpbXBsZVR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6T3BlcmF0aW5nTW9kZUVud\n W0iIG5hbWU9Ik9wZXJhdGluZ01vZGVFbnVtIi8\u002BCiA8eHM6Y29tcGxleFR5cGUgbmFtZT0iT\n GlzdE9mT3BlcmF0aW5nTW9kZUVudW0iPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lb\n nQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zOk9wZXJhd\n GluZ01vZGVFbnVtIiBuYW1lPSJPcGVyYXRpbmdNb2RlRW51bSIgbmlsbGFibGU9InRydWUiL\n z4KICA8L3hzOnNlcXVlbmNlPgogPC94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5c\n GU9InRuczpMaXN0T2ZPcGVyYXRpbmdNb2RlRW51bSIgbmFtZT0iTGlzdE9mT3BlcmF0aW5nT\n W9kZUVudW0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiA8eHM6c2ltcGxlVHlwZSBuYW1lPSJPcGVyY\n XRpb25Nb2RlRW51bSI\u002BCiAgPHhzOmFubm90YXRpb24\u002BCiAgIDx4czpkb2N1bWVudGF0aW9uP\n mRlc2NyaWJlcyB0aGUgcG9zc2libGUgb3BlcmF0aW9uIG1vZGVzIG9mIHRoZSBwdW1wPC94c\n zpkb2N1bWVudGF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6cmVzdHJpY3Rpb24gY\n mFzZT0ieHM6c3RyaW5nIj4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBdXRvQ29udHJvb\n F8wIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQ2xvc2VkTG9vcFN0YW5kYXJkUElEX\n zEiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBZHZhbmNlZF8yIi8\u002BCiAgIDx4czplb\n nVtZXJhdGlvbiB2YWx1ZT0iU3RhbmRCeV8zIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1Z\n T0iT3Blbkxvb3BNaW5fNCIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Mb29wV\n mFsdWVfNSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik9wZW5Mb29wTWF4XzYiLz4KI\n CAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDbG9zZWRMb29wTWluXzciLz4KICAgPHhzOmVud\n W1lcmF0aW9uIHZhbHVlPSJDbG9zZWRMb29wTWF4XzgiLz4KICAgPHhzOmVudW1lcmF0aW9uI\n HZhbHVlPSJUZXN0XzkiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJDYWxpYnJhdGlvb\n l8xMCIvPgogIDwveHM6cmVzdHJpY3Rpb24\u002BCiA8L3hzOnNpbXBsZVR5cGU\u002BCiA8eHM6ZWxlb\n WVudCB0eXBlPSJ0bnM6T3BlcmF0aW9uTW9kZUVudW0iIG5hbWU9Ik9wZXJhdGlvbk1vZGVFb\n nVtIi8\u002BCiA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mT3BlcmF0aW9uTW9kZUVudW0iP\n gogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1c\n nM9InVuYm91bmRlZCIgdHlwZT0idG5zOk9wZXJhdGlvbk1vZGVFbnVtIiBuYW1lPSJPcGVyY\n XRpb25Nb2RlRW51bSIgbmlsbGFibGU9InRydWUiLz4KICA8L3hzOnNlcXVlbmNlPgogPC94c\n zpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuczpMaXN0T2ZPcGVyYXRpb25Nb\n 2RlRW51bSIgbmFtZT0iTGlzdE9mT3BlcmF0aW9uTW9kZUVudW0iIG5pbGxhYmxlPSJ0cnVlI\n i8\u002BCiA8eHM6c2ltcGxlVHlwZSBuYW1lPSJQb3J0RGlyZWN0aW9uRW51bSI\u002BCiAgPHhzOmFub\n m90YXRpb24\u002BCiAgIDx4czpkb2N1bWVudGF0aW9uPmRldGVybWluZXMgd2hldGhlciB0aGUgc\n G9ydCBpcyBhbiBpbmxldCBhbmQgb3V0bGV0IG9yIGJvdGg8L3hzOmRvY3VtZW50YXRpb24\u002BC\n iAgPC94czphbm5vdGF0aW9uPgogIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciP\n gogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkluXzAiLz4KICAgPHhzOmVudW1lcmF0aW9uI\n HZhbHVlPSJPdXRfMSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkluT3V0XzIiLz4KI\n CA8L3hzOnJlc3RyaWN0aW9uPgogPC94czpzaW1wbGVUeXBlPgogPHhzOmVsZW1lbnQgdHlwZ\n T0idG5zOlBvcnREaXJlY3Rpb25FbnVtIiBuYW1lPSJQb3J0RGlyZWN0aW9uRW51bSIvPgogP\n HhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlBvcnREaXJlY3Rpb25FbnVtIj4KICA8eHM6c\n 2VxdWVuY2U\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvd\n W5kZWQiIHR5cGU9InRuczpQb3J0RGlyZWN0aW9uRW51bSIgbmFtZT0iUG9ydERpcmVjdGlvb\n kVudW0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxle\n FR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mUG9ydERpcmVjdGlvbkVudW0iI\n G5hbWU9Ikxpc3RPZlBvcnREaXJlY3Rpb25FbnVtIiBuaWxsYWJsZT0idHJ1ZSIvPgogPHhzO\n nNpbXBsZVR5cGUgbmFtZT0iUHVtcENsYXNzRW51bSI\u002BCiAgPHhzOmFubm90YXRpb24\u002BCiAgI\n Dx4czpkb2N1bWVudGF0aW9uPmRlZmluZXMgcG9zc2libGUgcHVtcCB0eXBlczwveHM6ZG9jd\n W1lbnRhdGlvbj4KICA8L3hzOmFubm90YXRpb24\u002BCiAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9I\n nhzOnN0cmluZyI\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUm90b2R5bmFtaWNQdW1wX\n zAiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQb3NpdGl2ZURpc3BsYWNlbWVudFB1b\n XBfMSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlByb2Nlc3NWYWN1dW1QdW1wXzIiL\n z4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJUdXJib1ZhY3V1bVB1bXBfMyIvPgogICA8e\n HM6ZW51bWVyYXRpb24gdmFsdWU9IlZhY3V1bVB1bXBfNCIvPgogICA8eHM6ZW51bWVyYXRpb\n 24gdmFsdWU9IkxpcXVpZFB1bXBfNSIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlB1b\n XBfNiIvPgogIDwveHM6cmVzdHJpY3Rpb24\u002BCiA8L3hzOnNpbXBsZVR5cGU\u002BCiA8eHM6ZWxlb\n WVudCB0eXBlPSJ0bnM6UHVtcENsYXNzRW51bSIgbmFtZT0iUHVtcENsYXNzRW51bSIvPgogP\n HhzOmNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlB1bXBDbGFzc0VudW0iPgogIDx4czpzZXF1Z\n W5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZ\n CIgdHlwZT0idG5zOlB1bXBDbGFzc0VudW0iIG5hbWU9IlB1bXBDbGFzc0VudW0iIG5pbGxhY\n mxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6Z\n WxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mUHVtcENsYXNzRW51bSIgbmFtZT0iTGlzdE9mUHVtc\n ENsYXNzRW51bSIgbmlsbGFibGU9InRydWUiLz4KIDx4czpzaW1wbGVUeXBlIG5hbWU9IlB1b\n XBLaWNrTW9kZUVudW0iPgogIDx4czphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvb\n j5kZXNjcmliZXMgdGhlIHB1bXAga2ljayBtb2RlIG9mIHRoZSBwdW1wPC94czpkb2N1bWVud\n GF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c\n 3RyaW5nIj4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJNYW51ZmFjdHVyZXJTcGVjaWZpY\n 18wIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzYWJsZWRfMSIvPgogICA8eHM6Z\n W51bWVyYXRpb24gdmFsdWU9Ik9wZXJhdG9yU3BlY2lmaWNfMiIvPgogIDwveHM6cmVzdHJpY\n 3Rpb24\u002BCiA8L3hzOnNpbXBsZVR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6UHVtcEtpY\n 2tNb2RlRW51bSIgbmFtZT0iUHVtcEtpY2tNb2RlRW51bSIvPgogPHhzOmNvbXBsZXhUeXBlI\n G5hbWU9Ikxpc3RPZlB1bXBLaWNrTW9kZUVudW0iPgogIDx4czpzZXF1ZW5jZT4KICAgPHhzO\n mVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgdHlwZT0idG5zO\n lB1bXBLaWNrTW9kZUVudW0iIG5hbWU9IlB1bXBLaWNrTW9kZUVudW0iIG5pbGxhYmxlPSJ0c\n nVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVud\n CB0eXBlPSJ0bnM6TGlzdE9mUHVtcEtpY2tNb2RlRW51bSIgbmFtZT0iTGlzdE9mUHVtcEtpY\n 2tNb2RlRW51bSIgbmlsbGFibGU9InRydWUiLz4KIDx4czpzaW1wbGVUeXBlIG5hbWU9IlB1b\n XBSb2xlRW51bSI\u002BCiAgPHhzOmFubm90YXRpb24\u002BCiAgIDx4czpkb2N1bWVudGF0aW9uPmlkZ\n W50aWZpZXMgdGhlIHJvbGUgcnNwLiB0YXNrIG9mIHRoZSBwdW1wIHdpdGhpbiB0aGUgbXVsd\n GkgcHVtcCBtYW5hZ2VtZW50PC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6YW5ub3RhdGlvb\n j4KICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KICAgPHhzOmVudW1lcmF0a\n W9uIHZhbHVlPSJTbGF2ZV8wIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTWFzdGVyX\n zEiLz4KICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJTbGF2ZUFuZEF1eGlsaWFyeU1hc3Rlc\n l8yIi8\u002BCiAgPC94czpyZXN0cmljdGlvbj4KIDwveHM6c2ltcGxlVHlwZT4KIDx4czplbGVtZ\n W50IHR5cGU9InRuczpQdW1wUm9sZUVudW0iIG5hbWU9IlB1bXBSb2xlRW51bSIvPgogPHhzO\n mNvbXBsZXhUeXBlIG5hbWU9Ikxpc3RPZlB1bXBSb2xlRW51bSI\u002BCiAgPHhzOnNlcXVlbmNlP\n gogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiB0e\n XBlPSJ0bnM6UHVtcFJvbGVFbnVtIiBuYW1lPSJQdW1wUm9sZUVudW0iIG5pbGxhYmxlPSJ0c\n nVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVud\n CB0eXBlPSJ0bnM6TGlzdE9mUHVtcFJvbGVFbnVtIiBuYW1lPSJMaXN0T2ZQdW1wUm9sZUVud\n W0iIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiA8eHM6c2ltcGxlVHlwZSBuYW1lPSJTdGF0ZU9mVGhlS\n XRlbUVudW0iPgogIDx4czphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvbj5kZXNjc\n mliZXMgdGhlIHN0YXRlIG9mIHRoZSBwdW1wPC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6Y\n W5ub3RhdGlvbj4KICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KICAgPHhzO\n mVudW1lcmF0aW9uIHZhbHVlPSJJZGxlU3RhdGVfMCIvPgogICA8eHM6ZW51bWVyYXRpb24gd\n mFsdWU9IlN0YW5kQnlTdGF0ZV8xIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iT3Blc\n mF0aW5nU3RhdGVfMiIvPgogICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkV4dGVybmFsRGlzY\n WJsZWRTdGF0ZV8zIi8\u002BCiAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRG93blN0YXRlXzQiL\n z4KICA8L3hzOnJlc3RyaWN0aW9uPgogPC94czpzaW1wbGVUeXBlPgogPHhzOmVsZW1lbnQgd\n HlwZT0idG5zOlN0YXRlT2ZUaGVJdGVtRW51bSIgbmFtZT0iU3RhdGVPZlRoZUl0ZW1FbnVtI\n i8\u002BCiA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mU3RhdGVPZlRoZUl0ZW1FbnVtIj4KI\n CA8eHM6c2VxdWVuY2U\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzP\n SJ1bmJvdW5kZWQiIHR5cGU9InRuczpTdGF0ZU9mVGhlSXRlbUVudW0iIG5hbWU9IlN0YXRlT\n 2ZUaGVJdGVtRW51bSIgbmlsbGFibGU9InRydWUiLz4KICA8L3hzOnNlcXVlbmNlPgogPC94c\n zpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuczpMaXN0T2ZTdGF0ZU9mVGhlS\n XRlbUVudW0iIG5hbWU9Ikxpc3RPZlN0YXRlT2ZUaGVJdGVtRW51bSIgbmlsbGFibGU9InRyd\n WUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJEZWNsYXJhdGlvbk9mQ29uZm9ybWl0eU9wd\n GlvblNldCI\u002BCiAgPHhzOmFubm90YXRpb24\u002BCiAgIDx4czpkb2N1bWVudGF0aW9uPmRlZmluZ\n XMgZmxhZ3MgZm9yIGRpcmVjdGl2ZXMgb24gdGhlIGJhc2lzIG9mIHdoaWNoIGNvbmZvcm1pd\n Hkgd2FzIGRldGVybWluZWQ8L3hzOmRvY3VtZW50YXRpb24\u002BCiAgPC94czphbm5vdGF0aW9uP\n gogIDx4czpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgogICA8eHM6ZXh0ZW5zaW9uI\n GJhc2U9InVhOk9wdGlvblNldCI\u002BCiAgICA8eHM6c2VxdWVuY2UvPgogICA8L3hzOmV4dGVuc\n 2lvbj4KICA8L3hzOmNvbXBsZXhDb250ZW50PgogPC94czpjb21wbGV4VHlwZT4KIDx4czplb\n GVtZW50IHR5cGU9InRuczpEZWNsYXJhdGlvbk9mQ29uZm9ybWl0eU9wdGlvblNldCIgbmFtZ\n T0iRGVjbGFyYXRpb25PZkNvbmZvcm1pdHlPcHRpb25TZXQiLz4KIDx4czpjb21wbGV4VHlwZ\n SBuYW1lPSJMaXN0T2ZEZWNsYXJhdGlvbk9mQ29uZm9ybWl0eU9wdGlvblNldCI\u002BCiAgPHhzO\n nNlcXVlbmNlPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib\n 3VuZGVkIiB0eXBlPSJ0bnM6RGVjbGFyYXRpb25PZkNvbmZvcm1pdHlPcHRpb25TZXQiIG5hb\n WU9IkRlY2xhcmF0aW9uT2ZDb25mb3JtaXR5T3B0aW9uU2V0IiBuaWxsYWJsZT0idHJ1ZSIvP\n gogIDwveHM6c2VxdWVuY2U\u002BCiA8L3hzOmNvbXBsZXhUeXBlPgogPHhzOmVsZW1lbnQgdHlwZ\n T0idG5zOkxpc3RPZkRlY2xhcmF0aW9uT2ZDb25mb3JtaXR5T3B0aW9uU2V0IiBuYW1lPSJMa\n XN0T2ZEZWNsYXJhdGlvbk9mQ29uZm9ybWl0eU9wdGlvblNldCIgbmlsbGFibGU9InRydWUiL\n z4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFeHBsb3Npb25Qcm90ZWN0aW9uT3B0aW9uU2V0I\n j4KICA8eHM6YW5ub3RhdGlvbj4KICAgPHhzOmRvY3VtZW50YXRpb24\u002BZGVmaW5lcyBmbGFnc\n yBmb3IgdGhlIGNhdGVnb3J5IG9mIGV4cGxvc2lvbiBwcm90ZWN0aW9uIGZvciBkZXZpY2VzI\n GFjY29yZGluZyB0byBFVSBEaXJlY3RpdmUgMjAxNC8zNC9FVSAoQVRFWCk8L3hzOmRvY3VtZ\n W50YXRpb24\u002BCiAgPC94czphbm5vdGF0aW9uPgogIDx4czpjb21wbGV4Q29udGVudCBtaXhlZ\n D0iZmFsc2UiPgogICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InVhOk9wdGlvblNldCI\u002BCiAgICA8e\n HM6c2VxdWVuY2UvPgogICA8L3hzOmV4dGVuc2lvbj4KICA8L3hzOmNvbXBsZXhDb250ZW50P\n gogPC94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuczpFeHBsb3Npb25Qc\n m90ZWN0aW9uT3B0aW9uU2V0IiBuYW1lPSJFeHBsb3Npb25Qcm90ZWN0aW9uT3B0aW9uU2V0I\n i8\u002BCiA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mRXhwbG9zaW9uUHJvdGVjdGlvbk9wd\n GlvblNldCI\u002BCiAgPHhzOnNlcXVlbmNlPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiI\n G1heE9jY3Vycz0idW5ib3VuZGVkIiB0eXBlPSJ0bnM6RXhwbG9zaW9uUHJvdGVjdGlvbk9wd\n GlvblNldCIgbmFtZT0iRXhwbG9zaW9uUHJvdGVjdGlvbk9wdGlvblNldCIgbmlsbGFibGU9I\n nRydWUiLz4KICA8L3hzOnNlcXVlbmNlPgogPC94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZ\n W50IHR5cGU9InRuczpMaXN0T2ZFeHBsb3Npb25Qcm90ZWN0aW9uT3B0aW9uU2V0IiBuYW1lP\n SJMaXN0T2ZFeHBsb3Npb25Qcm90ZWN0aW9uT3B0aW9uU2V0IiBuaWxsYWJsZT0idHJ1ZSIvP\n gogPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkV4cGxvc2lvblpvbmVPcHRpb25TZXQiPgogIDx4c\n zphbm5vdGF0aW9uPgogICA8eHM6ZG9jdW1lbnRhdGlvbj5kZWZpbmVzIGZsYWdzIGZvciB0a\n GUgY2F0ZWdvcnkgb2YgZXhwbG9zaW9uIHpvbmVzIGZvciBkZXZpY2VzPC94czpkb2N1bWVud\n GF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9I\n mZhbHNlIj4KICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ1YTpPcHRpb25TZXQiPgogICAgPHhzO\n nNlcXVlbmNlLz4KICAgPC94czpleHRlbnNpb24\u002BCiAgPC94czpjb21wbGV4Q29udGVudD4KI\n DwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6RXhwbG9zaW9uWm9uZ\n U9wdGlvblNldCIgbmFtZT0iRXhwbG9zaW9uWm9uZU9wdGlvblNldCIvPgogPHhzOmNvbXBsZ\n XhUeXBlIG5hbWU9Ikxpc3RPZkV4cGxvc2lvblpvbmVPcHRpb25TZXQiPgogIDx4czpzZXF1Z\n W5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZ\n CIgdHlwZT0idG5zOkV4cGxvc2lvblpvbmVPcHRpb25TZXQiIG5hbWU9IkV4cGxvc2lvblpvb\n mVPcHRpb25TZXQiIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZXF1ZW5jZT4KIDwveHM6Y\n 29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzdE9mRXhwbG9zaW9uWm9uZ\n U9wdGlvblNldCIgbmFtZT0iTGlzdE9mRXhwbG9zaW9uWm9uZU9wdGlvblNldCIgbmlsbGFib\n GU9InRydWUiLz4KIDx4czpjb21wbGV4VHlwZSBuYW1lPSJPZmZlcmVkQ29udHJvbE1vZGVzT\n 3B0aW9uU2V0Ij4KICA8eHM6YW5ub3RhdGlvbj4KICAgPHhzOmRvY3VtZW50YXRpb24\u002BZGVma\n W5lcyBmbGFncyBmb3Igb2ZmZXJkIGNvbnRyb2wgbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBtY\n W51ZmFjdHVyZXIgZm9yIHRoZSBwcm9kdWN0PC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6Y\n W5ub3RhdGlvbj4KICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KICAgPHhzO\n mV4dGVuc2lvbiBiYXNlPSJ1YTpPcHRpb25TZXQiPgogICAgPHhzOnNlcXVlbmNlLz4KICAgP\n C94czpleHRlbnNpb24\u002BCiAgPC94czpjb21wbGV4Q29udGVudD4KIDwveHM6Y29tcGxleFR5c\n GU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6T2ZmZXJlZENvbnRyb2xNb2Rlc09wdGlvblNld\n CIgbmFtZT0iT2ZmZXJlZENvbnRyb2xNb2Rlc09wdGlvblNldCIvPgogPHhzOmNvbXBsZXhUe\n XBlIG5hbWU9Ikxpc3RPZk9mZmVyZWRDb250cm9sTW9kZXNPcHRpb25TZXQiPgogIDx4czpzZ\n XF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91b\n mRlZCIgdHlwZT0idG5zOk9mZmVyZWRDb250cm9sTW9kZXNPcHRpb25TZXQiIG5hbWU9Ik9mZ\n mVyZWRDb250cm9sTW9kZXNPcHRpb25TZXQiIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiAgPC94czpzZ\n XF1ZW5jZT4KIDwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6TGlzd\n E9mT2ZmZXJlZENvbnRyb2xNb2Rlc09wdGlvblNldCIgbmFtZT0iTGlzdE9mT2ZmZXJlZENvb\n nRyb2xNb2Rlc09wdGlvblNldCIgbmlsbGFibGU9InRydWUiLz4KIDx4czpjb21wbGV4VHlwZ\n SBuYW1lPSJPZmZlcmVkRmllbGRidXNlc09wdGlvblNldCI\u002BCiAgPHhzOmFubm90YXRpb24\u002BC\n iAgIDx4czpkb2N1bWVudGF0aW9uPmRlZmluZXMgZmxhZ3MgZm9yIGZpZWxkYnVzZXMgc3Vwc\n G9ydGVkIGJ5IHRoZSBtYW51ZmFjdHVyZXIgZm9yIHRoZSBwcm9kdWN0PC94czpkb2N1bWVud\n GF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6Y29tcGxleENvbnRlbnQgbWl4ZWQ9I\n mZhbHNlIj4KICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ1YTpPcHRpb25TZXQiPgogICAgPHhzO\n nNlcXVlbmNlLz4KICAgPC94czpleHRlbnNpb24\u002BCiAgPC94czpjb21wbGV4Q29udGVudD4KI\n DwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6T2ZmZXJlZEZpZWxkY\n nVzZXNPcHRpb25TZXQiIG5hbWU9Ik9mZmVyZWRGaWVsZGJ1c2VzT3B0aW9uU2V0Ii8\u002BCiA8e\n HM6Y29tcGxleFR5cGUgbmFtZT0iTGlzdE9mT2ZmZXJlZEZpZWxkYnVzZXNPcHRpb25TZXQiP\n gogIDx4czpzZXF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1c\n nM9InVuYm91bmRlZCIgdHlwZT0idG5zOk9mZmVyZWRGaWVsZGJ1c2VzT3B0aW9uU2V0IiBuY\n W1lPSJPZmZlcmVkRmllbGRidXNlc09wdGlvblNldCIgbmlsbGFibGU9InRydWUiLz4KICA8L\n 3hzOnNlcXVlbmNlPgogPC94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuc\n zpMaXN0T2ZPZmZlcmVkRmllbGRidXNlc09wdGlvblNldCIgbmFtZT0iTGlzdE9mT2ZmZXJlZ\n EZpZWxkYnVzZXNPcHRpb25TZXQiIG5pbGxhYmxlPSJ0cnVlIi8\u002BCiA8eHM6Y29tcGxleFR5c\n GUgbmFtZT0iUGh5c2ljYWxBZGRyZXNzRGF0YVR5cGUiPgogIDx4czphbm5vdGF0aW9uPgogI\n CA8eHM6ZG9jdW1lbnRhdGlvbj5QaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtYW51ZmFjdHVyZ\n XIuPC94czpkb2N1bWVudGF0aW9uPgogIDwveHM6YW5ub3RhdGlvbj4KICA8eHM6c2VxdWVuY\n 2U\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgdHlwZT0ieHM6dW5zaWduZWRJbnQiI\n G5hbWU9IkVuY29kaW5nTWFzayIvPgogICA8eHM6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1he\n E9jY3Vycz0iMSIgdHlwZT0idWE6TG9jYWxpemVkVGV4dCIgbmFtZT0iU3RyZWV0Ii8\u002BCiAgI\n Dx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlPSJ1YTpMb2Nhb\n Gl6ZWRUZXh0IiBuYW1lPSJOdW1iZXIiLz4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwI\n iBtYXhPY2N1cnM9IjEiIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG5hbWU9IkNpdHkiLz4KI\n CAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InVhOkxvY\n 2FsaXplZFRleHQiIG5hbWU9IlBvc3RhbENvZGUiLz4KICAgPHhzOmVsZW1lbnQgbWluT2Njd\n XJzPSIwIiBtYXhPY2N1cnM9IjEiIHR5cGU9InVhOkxvY2FsaXplZFRleHQiIG5hbWU9IlN0Y\n XRlIi8\u002BCiAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiB0eXBlP\n SJ1YTpMb2NhbGl6ZWRUZXh0IiBuYW1lPSJDb3VudHJ5Ii8\u002BCiAgPC94czpzZXF1ZW5jZT4KI\n DwveHM6Y29tcGxleFR5cGU\u002BCiA8eHM6ZWxlbWVudCB0eXBlPSJ0bnM6UGh5c2ljYWxBZGRyZ\n XNzRGF0YVR5cGUiIG5hbWU9IlBoeXNpY2FsQWRkcmVzc0RhdGFUeXBlIi8\u002BCiA8eHM6Y29tc\n GxleFR5cGUgbmFtZT0iTGlzdE9mUGh5c2ljYWxBZGRyZXNzRGF0YVR5cGUiPgogIDx4czpzZ\n XF1ZW5jZT4KICAgPHhzOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91b\n mRlZCIgdHlwZT0idG5zOlBoeXNpY2FsQWRkcmVzc0RhdGFUeXBlIiBuYW1lPSJQaHlzaWNhb\n EFkZHJlc3NEYXRhVHlwZSIgbmlsbGFibGU9InRydWUiLz4KICA8L3hzOnNlcXVlbmNlPgogP\n C94czpjb21wbGV4VHlwZT4KIDx4czplbGVtZW50IHR5cGU9InRuczpMaXN0T2ZQaHlzaWNhb\n EFkZHJlc3NEYXRhVHlwZSIgbmFtZT0iTGlzdE9mUGh5c2ljYWxBZGRyZXNzRGF0YVR5cGUiI\n G5pbGxhYmxlPSJ0cnVlIi8\u002BCjwveHM6c2NoZW1hPgo=\u003C/uax:ByteString\u003E"},{"browseName":"1:DeclarationOfConformityOptionSet","dataType":"String","displayName":[{"value":"DeclarationOfConformityOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6027","parentNodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5014"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6004"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027DeclarationOfConformityOptionSet\u0027]\u003C/uax:String\u003E"},{"browseName":"1:ExplosionProtectionOptionSet","dataType":"String","displayName":[{"value":"ExplosionProtectionOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6021","parentNodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5005"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6004"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027ExplosionProtectionOptionSet\u0027]\u003C/uax:String\u003E"},{"browseName":"1:ExplosionZoneOptionSet","dataType":"String","displayName":[{"value":"ExplosionZoneOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6019","parentNodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5002"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6004"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027ExplosionZoneOptionSet\u0027]\u003C/uax:String\u003E"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=6005","parentNodeId":"ns=1;i=6004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6004"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/Pumps/Types.xsd\u003C/uax:String\u003E"},{"browseName":"1:OfferedControlModesOptionSet","dataType":"String","displayName":[{"value":"OfferedControlModesOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6023","parentNodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5008"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6004"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027OfferedControlModesOptionSet\u0027]\u003C/uax:String\u003E"},{"browseName":"1:OfferedFieldbusesOptionSet","dataType":"String","displayName":[{"value":"OfferedFieldbusesOptionSet"}],"nodeClass":"Variable","nodeId":"ns=1;i=6025","parentNodeId":"ns=1;i=6004","references":[{"referenceType":"HasTypeDefinition","target":"i=69"},{"isForward":false,"referenceType":"HasDescription","target":"ns=1;i=5011"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=6004"}],"typeDefinition":"i=69","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E//xs:element[@name=\u0027OfferedFieldbusesOptionSet\u0027]\u003C/uax:String\u003E"},{"browseName":"1:IPumpVendorNameplateType","displayName":[{"value":"IPumpVendorNameplateType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.2","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1004","references":[{"referenceType":"HasProperty","target":"ns=1;i=6063"},{"referenceType":"HasProperty","target":"ns=1;i=6080"},{"referenceType":"HasProperty","target":"ns=1;i=6064"},{"referenceType":"HasProperty","target":"ns=1;i=6065"},{"referenceType":"HasProperty","target":"ns=1;i=6066"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=2;i=1010"},{"referenceType":"HasProperty","target":"ns=1;i=6067"},{"referenceType":"HasProperty","target":"ns=1;i=6068"},{"referenceType":"HasProperty","target":"ns=1;i=9940"},{"referenceType":"HasProperty","target":"ns=1;i=6069"},{"referenceType":"HasProperty","target":"ns=1;i=6070"},{"isForward":false,"referenceType":"HasInterface","target":"ns=1;i=1005"}],"superType":"ns=2;i=1010"},{"browseName":"1:ArticleNumber","dataType":"String","description":[{"value":"Alphanumeric character sequence identifying a manufactured, non-configurable product."}],"displayName":[{"value":"ArticleNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6063","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:CountryOfOrigin","dataType":"String","description":[{"value":"Country in which the product is manufactured."}],"displayName":[{"value":"CountryOfOrigin"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6080","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DayOfConstruction","dataType":"Int32","description":[{"value":"The optional DayOfConstrucition provides the day of the month in which the manufacturing process of the machine has been completed. It shall be a number and never change during the life-cycle of a machine."}],"displayName":[{"value":"DayOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6064","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FabricationNumber","dataType":"String","description":[{"value":"Alphanumeric character sequence assigned to a fabricated product, which allows the date, time and circumstances of fabrication to be traced."}],"displayName":[{"value":"FabricationNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6065","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GTINCode","dataType":"String","description":[{"value":"Bar code number that identifies the device based on the Global Trade Item Number system."}],"displayName":[{"value":"GTINCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6066","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NationalStockNumber","dataType":"String","description":[{"value":"13-digit numeric code, identifying all \u0027standardized material items of supply\u0027 as recognized by the United States Department of Defense."}],"displayName":[{"value":"NationalStockNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6067","parentNodeId":"ns=1;i=1004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OrderProductCode","dataType":"String","description":[{"value":"Unique combination of numbers and letters used to order the device."}],"displayName":[{"value":"OrderProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6068","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PhysicalAddress","dataType":"PhysicalAddressDataType","description":[{"value":"Physical address of the manufacturer."}],"displayName":[{"value":"PhysicalAddress"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9940","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ens=1;i=5017\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003CPhysicalAddressDataType xmlns=\u0022http://opcfoundation.org/UA/Pumps/Types.xsd\u0022\u003E\n \u003CEncodingMask\u003E0\u003C/EncodingMask\u003E\n \u003C/PhysicalAddressDataType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Supplier","dataType":"String","description":[{"value":"Name of the supplier or vendor of a device."}],"displayName":[{"value":"Supplier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6069","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"}],"typeDefinition":"i=68"},{"browseName":"1:TypeOfProduct","dataType":"String","description":[{"value":"Characterization of the device based on its usage, operation principle, and its fabricated form."}],"displayName":[{"value":"TypeOfProduct"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6070","parentNodeId":"ns=1;i=1004","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1004"}],"typeDefinition":"i=68"},{"browseName":"1:DiscreteObjectType","displayName":[{"value":"DiscreteObjectType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.27","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1029","references":[{"isForward":false,"referenceType":"HasSubtype","target":"i=58"},{"referenceType":"HasComponent","target":"ns=1;i=8777"},{"referenceType":"HasComponent","target":"ns=1;i=8773"}],"superType":"i=58"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8777","parentNodeId":"ns=1;i=1029","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8778"},{"referenceType":"HasProperty","target":"ns=1;i=8780"},{"referenceType":"HasProperty","target":"ns=1;i=8779"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1029"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8778","parentNodeId":"ns=1;i=8777","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8777"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8780","parentNodeId":"ns=1;i=8777","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8777"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8779","parentNodeId":"ns=1;i=8777","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8777"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8773","parentNodeId":"ns=1;i=1029","references":[{"referenceType":"HasProperty","target":"ns=1;i=8776"},{"referenceType":"HasProperty","target":"ns=1;i=8774"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1029"},{"referenceType":"HasProperty","target":"ns=1;i=8775"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8776","parentNodeId":"ns=1;i=8773","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8773"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8774","parentNodeId":"ns=1;i=8773","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8773"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8775","parentNodeId":"ns=1;i=8773","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8773"}],"typeDefinition":"i=68"},{"browseName":"1:DiscreteInputObjectType","displayName":[{"value":"DiscreteInputObjectType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.28","nodeClass":"ObjectType","nodeId":"ns=1;i=1030","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1029"},{"referenceType":"HasComponent","target":"ns=1;i=8837"}],"superType":"ns=1;i=1029"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8837","parentNodeId":"ns=1;i=1030","references":[{"referenceType":"HasProperty","target":"ns=1;i=8840"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1030"},{"referenceType":"HasProperty","target":"ns=1;i=8838"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8839"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8840","parentNodeId":"ns=1;i=8837","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8837"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8838","parentNodeId":"ns=1;i=8837","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8837"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8839","parentNodeId":"ns=1;i=8837","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8837"}],"typeDefinition":"i=68"},{"browseName":"1:DiscreteOutputObjectType","displayName":[{"value":"DiscreteOutputObjectType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.29","nodeClass":"ObjectType","nodeId":"ns=1;i=1031","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1029"},{"referenceType":"HasComponent","target":"ns=1;i=8781"},{"referenceType":"HasComponent","target":"ns=1;i=8784"},{"referenceType":"HasComponent","target":"ns=1;i=8787"}],"superType":"ns=1;i=1029"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8781","parentNodeId":"ns=1;i=1031","references":[{"referenceType":"HasProperty","target":"ns=1;i=8819"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1031"},{"referenceType":"HasProperty","target":"ns=1;i=8782"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8783"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8819","parentNodeId":"ns=1;i=8781","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8781"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8782","parentNodeId":"ns=1;i=8781","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8781"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8783","parentNodeId":"ns=1;i=8781","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8781"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8784","parentNodeId":"ns=1;i=1031","references":[{"referenceType":"HasProperty","target":"ns=1;i=8818"},{"referenceType":"HasProperty","target":"ns=1;i=8785"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8786"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8818","parentNodeId":"ns=1;i=8784","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8784"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8785","parentNodeId":"ns=1;i=8784","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8784"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8786","parentNodeId":"ns=1;i=8784","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8784"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8787","parentNodeId":"ns=1;i=1031","references":[{"referenceType":"HasProperty","target":"ns=1;i=8817"},{"referenceType":"HasProperty","target":"ns=1;i=8788"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8789"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8817","parentNodeId":"ns=1;i=8787","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8787"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8788","parentNodeId":"ns=1;i=8787","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8787"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8789","parentNodeId":"ns=1;i=8787","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8787"}],"typeDefinition":"i=68"},{"browseName":"1:PumpKickObjectType","displayName":[{"value":"PumpKickObjectType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.30","nodeClass":"ObjectType","nodeId":"ns=1;i=1032","references":[{"referenceType":"HasComponent","target":"ns=1;i=8829"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8830"},{"referenceType":"HasComponent","target":"ns=1;i=8831"}],"superType":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:PumpKickMode","dataType":"PumpKickModeEnum","description":[{"value":"This property describes the pump kick mode of the pump."}],"displayName":[{"value":"PumpKickMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8829","parentNodeId":"ns=1;i=1032","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8836"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1032"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8836","parentNodeId":"ns=1;i=8829","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8829"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTime","dataType":"Double","description":[{"value":"This property determines the absolute time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8830","parentNodeId":"ns=1;i=1032","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8835"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1032"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8835","parentNodeId":"ns=1;i=8830","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8830"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTimeDifference","dataType":"Double","description":[{"value":"This property determines the interval time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8831","parentNodeId":"ns=1;i=1032","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=8833"},{"referenceType":"HasProperty","target":"ns=1;i=8832"},{"referenceType":"HasProperty","target":"ns=1;i=8834"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1032"}],"typeDefinition":"i=17497","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8833","parentNodeId":"ns=1;i=8831","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8831"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8832","parentNodeId":"ns=1;i=8831","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8831"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8834","parentNodeId":"ns=1;i=8831","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8831"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ActuationType","displayName":[{"value":"ActuationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.25","nodeClass":"ObjectType","nodeId":"ns=1;i=1025","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=8728"},{"referenceType":"HasComponent","target":"ns=1;i=8733"},{"referenceType":"HasComponent","target":"ns=1;i=8734"},{"referenceType":"HasComponent","target":"ns=1;i=8738"},{"referenceType":"HasComponent","target":"ns=1;i=8721"},{"referenceType":"HasComponent","target":"ns=1;i=8736"},{"referenceType":"HasComponent","target":"ns=1;i=8725"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8728","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasProperty","target":"ns=1;i=8731"},{"referenceType":"HasProperty","target":"ns=1;i=8729"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8730"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8731","parentNodeId":"ns=1;i=8728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8728"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8729","parentNodeId":"ns=1;i=8728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8728"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8730","parentNodeId":"ns=1;i=8728","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8728"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8733","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8739"},{"referenceType":"HasProperty","target":"ns=1;i=8741"},{"referenceType":"HasProperty","target":"ns=1;i=8740"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8739","parentNodeId":"ns=1;i=8733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8741","parentNodeId":"ns=1;i=8733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8740","parentNodeId":"ns=1;i=8733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8734","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=8742"},{"referenceType":"HasProperty","target":"ns=1;i=8735"},{"referenceType":"HasProperty","target":"ns=1;i=8743"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8742","parentNodeId":"ns=1;i=8734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8734"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8735","parentNodeId":"ns=1;i=8734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8734"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8743","parentNodeId":"ns=1;i=8734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8734"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8738","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8744"},{"referenceType":"HasProperty","target":"ns=1;i=8746"},{"referenceType":"HasProperty","target":"ns=1;i=8745"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8744","parentNodeId":"ns=1;i=8738","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8738"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8746","parentNodeId":"ns=1;i=8738","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8738"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8745","parentNodeId":"ns=1;i=8738","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8738"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8721","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasProperty","target":"ns=1;i=8724"},{"referenceType":"HasProperty","target":"ns=1;i=8722"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8723"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8724","parentNodeId":"ns=1;i=8721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8722","parentNodeId":"ns=1;i=8721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8721"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8723","parentNodeId":"ns=1;i=8721","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8721"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8736","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=8747"},{"referenceType":"HasProperty","target":"ns=1;i=8737"},{"referenceType":"HasProperty","target":"ns=1;i=8748"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8747","parentNodeId":"ns=1;i=8736","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8736"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8737","parentNodeId":"ns=1;i=8736","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8736"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8748","parentNodeId":"ns=1;i=8736","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8736"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8725","parentNodeId":"ns=1;i=1025","references":[{"referenceType":"HasProperty","target":"ns=1;i=8732"},{"referenceType":"HasProperty","target":"ns=1;i=8726"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1025"},{"referenceType":"HasProperty","target":"ns=1;i=8727"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8732","parentNodeId":"ns=1;i=8725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8726","parentNodeId":"ns=1;i=8725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8725"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8727","parentNodeId":"ns=1;i=8725","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8725"}],"typeDefinition":"i=68"},{"browseName":"1:PumpActuationType","displayName":[{"value":"PumpActuationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.26","nodeClass":"ObjectType","nodeId":"ns=1;i=1028","references":[{"referenceType":"HasComponent","target":"ns=1;i=8754"},{"referenceType":"HasComponent","target":"ns=1;i=8750"},{"referenceType":"HasComponent","target":"ns=1;i=5078"},{"referenceType":"HasComponent","target":"ns=1;i=8756"},{"referenceType":"HasComponent","target":"ns=1;i=8762"},{"referenceType":"HasComponent","target":"ns=1;i=8759"},{"referenceType":"HasComponent","target":"ns=1;i=5076"},{"referenceType":"HasComponent","target":"ns=1;i=5079"},{"referenceType":"HasComponent","target":"ns=1;i=5074"},{"referenceType":"HasComponent","target":"ns=1;i=5075"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1025"},{"referenceType":"HasComponent","target":"ns=1;i=5082"},{"referenceType":"HasComponent","target":"ns=1;i=5080"},{"referenceType":"HasComponent","target":"ns=1;i=5077"},{"referenceType":"HasComponent","target":"ns=1;i=8751"},{"referenceType":"HasComponent","target":"ns=1;i=8755"},{"referenceType":"HasComponent","target":"ns=1;i=8749"},{"referenceType":"HasComponent","target":"ns=1;i=5081"}],"superType":"ns=1;i=1025"},{"browseName":"1:ActualControlMode","dataType":"ControlModeEnum","description":[{"value":"This property describes the actual control mode of the pump."}],"displayName":[{"value":"ActualControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8754","parentNodeId":"ns=1;i=1028","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8765"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8765","parentNodeId":"ns=1;i=8754","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8754"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ActualOperationMode","dataType":"OperationModeEnum","description":[{"value":"This property describes the actual operation mode of the pump."}],"displayName":[{"value":"ActualOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8750","parentNodeId":"ns=1;i=1028","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8766"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8766","parentNodeId":"ns=1;i=8750","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8750"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:CleanValveRequest","description":[{"value":"This element offers a request for the opening of the clean valve."}],"displayName":[{"value":"CleanValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5078","parentNodeId":"ns=1;i=1028","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8802"},{"referenceType":"HasComponent","target":"ns=1;i=8841"},{"referenceType":"HasComponent","target":"ns=1;i=8844"},{"referenceType":"HasComponent","target":"ns=1;i=8847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8848"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8802","parentNodeId":"ns=1;i=5078","references":[{"referenceType":"HasProperty","target":"ns=1;i=8824"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5078"},{"referenceType":"HasProperty","target":"ns=1;i=8803"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8804"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8824","parentNodeId":"ns=1;i=8802","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8802"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8803","parentNodeId":"ns=1;i=8802","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8802"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8804","parentNodeId":"ns=1;i=8802","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8802"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8841","parentNodeId":"ns=1;i=5078","references":[{"referenceType":"HasProperty","target":"ns=1;i=8851"},{"referenceType":"HasProperty","target":"ns=1;i=8842"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5078"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8843"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8851","parentNodeId":"ns=1;i=8841","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8841"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8842","parentNodeId":"ns=1;i=8841","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8841"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8843","parentNodeId":"ns=1;i=8841","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8841"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8844","parentNodeId":"ns=1;i=5078","references":[{"referenceType":"HasProperty","target":"ns=1;i=8852"},{"referenceType":"HasProperty","target":"ns=1;i=8845"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5078"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8846"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8852","parentNodeId":"ns=1;i=8844","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8844"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8845","parentNodeId":"ns=1;i=8844","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8844"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8846","parentNodeId":"ns=1;i=8844","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8844"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8847","parentNodeId":"ns=1;i=5078","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8853"},{"referenceType":"HasProperty","target":"ns=1;i=8855"},{"referenceType":"HasProperty","target":"ns=1;i=8854"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5078"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8853","parentNodeId":"ns=1;i=8847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8855","parentNodeId":"ns=1;i=8847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8854","parentNodeId":"ns=1;i=8847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8848","parentNodeId":"ns=1;i=5078","references":[{"referenceType":"HasProperty","target":"ns=1;i=8856"},{"referenceType":"HasProperty","target":"ns=1;i=8849"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5078"},{"referenceType":"HasProperty","target":"ns=1;i=8850"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8856","parentNodeId":"ns=1;i=8848","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8848"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8849","parentNodeId":"ns=1;i=8848","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8848"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8850","parentNodeId":"ns=1;i=8848","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8848"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ControlInversion","dataType":"Boolean","description":[{"value":"This property offers the inversion of the selected control mode in operation mode AutoControl. A \u0022True\u0022 status means that the control mode inversion is activated and a \u0022False\u0022 status means that the control mode inversion is deactivated."}],"displayName":[{"value":"ControlInversion"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8756","parentNodeId":"ns=1;i=1028","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasProperty","target":"ns=1;i=8767"},{"referenceType":"HasProperty","target":"ns=1;i=8757"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8758"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8767","parentNodeId":"ns=1;i=8756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8756"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8757","parentNodeId":"ns=1;i=8756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8756"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8758","parentNodeId":"ns=1;i=8756","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8756"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Enable","dataType":"Boolean","description":[{"value":"This property activates of the control function."}],"displayName":[{"value":"Enable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8762","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasProperty","target":"ns=1;i=8768"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasProperty","target":"ns=1;i=8763"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8764"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8768","parentNodeId":"ns=1;i=8762","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8762"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8763","parentNodeId":"ns=1;i=8762","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8762"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8764","parentNodeId":"ns=1;i=8762","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8762"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExternalSignal","dataType":"Boolean","description":[{"value":"This property offers the activation of an external electrical interface serving the setpoint of the control function by selecting the kind of electrical (analogue) signal."}],"displayName":[{"value":"ExternalSignal"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8759","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasProperty","target":"ns=1;i=8769"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasProperty","target":"ns=1;i=8760"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8761"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8769","parentNodeId":"ns=1;i=8759","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8759"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8760","parentNodeId":"ns=1;i=8759","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8759"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8761","parentNodeId":"ns=1;i=8759","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8759"}],"typeDefinition":"i=68"},{"browseName":"1:FlushValveRequest","description":[{"value":"This element offers a request for the opening of the flush valve."}],"displayName":[{"value":"FlushValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5076","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8796"},{"referenceType":"HasComponent","target":"ns=1;i=8857"},{"referenceType":"HasComponent","target":"ns=1;i=8860"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8864"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8796","parentNodeId":"ns=1;i=5076","references":[{"referenceType":"HasProperty","target":"ns=1;i=8822"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5076"},{"referenceType":"HasProperty","target":"ns=1;i=8797"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8798"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8822","parentNodeId":"ns=1;i=8796","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8796"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8797","parentNodeId":"ns=1;i=8796","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8796"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8798","parentNodeId":"ns=1;i=8796","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8796"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8857","parentNodeId":"ns=1;i=5076","references":[{"referenceType":"HasProperty","target":"ns=1;i=8867"},{"referenceType":"HasProperty","target":"ns=1;i=8858"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8859"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8867","parentNodeId":"ns=1;i=8857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8857"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8858","parentNodeId":"ns=1;i=8857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8857"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8859","parentNodeId":"ns=1;i=8857","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8857"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8860","parentNodeId":"ns=1;i=5076","references":[{"referenceType":"HasProperty","target":"ns=1;i=8868"},{"referenceType":"HasProperty","target":"ns=1;i=8861"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8862"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8868","parentNodeId":"ns=1;i=8860","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8860"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8861","parentNodeId":"ns=1;i=8860","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8860"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8862","parentNodeId":"ns=1;i=8860","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8860"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8863","parentNodeId":"ns=1;i=5076","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8869"},{"referenceType":"HasProperty","target":"ns=1;i=8871"},{"referenceType":"HasProperty","target":"ns=1;i=8870"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5076"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8869","parentNodeId":"ns=1;i=8863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8871","parentNodeId":"ns=1;i=8863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8870","parentNodeId":"ns=1;i=8863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8864","parentNodeId":"ns=1;i=5076","references":[{"referenceType":"HasProperty","target":"ns=1;i=8872"},{"referenceType":"HasProperty","target":"ns=1;i=8865"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5076"},{"referenceType":"HasProperty","target":"ns=1;i=8866"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8872","parentNodeId":"ns=1;i=8864","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8864"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8865","parentNodeId":"ns=1;i=8864","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8864"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8866","parentNodeId":"ns=1;i=8864","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8864"}],"typeDefinition":"i=68"},{"browseName":"1:GasDilValveRequest","description":[{"value":"This element offers a request for the opening of the gas dilution valve."}],"displayName":[{"value":"GasDilValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5079","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8805"},{"referenceType":"HasComponent","target":"ns=1;i=8873"},{"referenceType":"HasComponent","target":"ns=1;i=8876"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8880"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8805","parentNodeId":"ns=1;i=5079","references":[{"referenceType":"HasProperty","target":"ns=1;i=8825"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5079"},{"referenceType":"HasProperty","target":"ns=1;i=8806"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8807"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8825","parentNodeId":"ns=1;i=8805","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8805"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8806","parentNodeId":"ns=1;i=8805","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8805"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8807","parentNodeId":"ns=1;i=8805","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8805"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8873","parentNodeId":"ns=1;i=5079","references":[{"referenceType":"HasProperty","target":"ns=1;i=8883"},{"referenceType":"HasProperty","target":"ns=1;i=8874"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5079"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8875"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8883","parentNodeId":"ns=1;i=8873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8874","parentNodeId":"ns=1;i=8873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8873"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8875","parentNodeId":"ns=1;i=8873","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8873"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8876","parentNodeId":"ns=1;i=5079","references":[{"referenceType":"HasProperty","target":"ns=1;i=8884"},{"referenceType":"HasProperty","target":"ns=1;i=8877"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5079"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8878"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8884","parentNodeId":"ns=1;i=8876","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8876"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8877","parentNodeId":"ns=1;i=8876","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8876"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8878","parentNodeId":"ns=1;i=8876","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8876"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8879","parentNodeId":"ns=1;i=5079","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8885"},{"referenceType":"HasProperty","target":"ns=1;i=8887"},{"referenceType":"HasProperty","target":"ns=1;i=8886"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5079"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8885","parentNodeId":"ns=1;i=8879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8887","parentNodeId":"ns=1;i=8879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8886","parentNodeId":"ns=1;i=8879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8880","parentNodeId":"ns=1;i=5079","references":[{"referenceType":"HasProperty","target":"ns=1;i=8888"},{"referenceType":"HasProperty","target":"ns=1;i=8881"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5079"},{"referenceType":"HasProperty","target":"ns=1;i=8882"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8888","parentNodeId":"ns=1;i=8880","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8880"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8881","parentNodeId":"ns=1;i=8880","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8880"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8882","parentNodeId":"ns=1;i=8880","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8880"}],"typeDefinition":"i=68"},{"browseName":"1:InletValveRequest","description":[{"value":"This element offers a request for the opening of the inlet valve."}],"displayName":[{"value":"InletValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5074","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8790"},{"referenceType":"HasComponent","target":"ns=1;i=8889"},{"referenceType":"HasComponent","target":"ns=1;i=8892"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8895"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8896"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8790","parentNodeId":"ns=1;i=5074","references":[{"referenceType":"HasProperty","target":"ns=1;i=8820"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5074"},{"referenceType":"HasProperty","target":"ns=1;i=8791"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8792"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8820","parentNodeId":"ns=1;i=8790","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8790"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8791","parentNodeId":"ns=1;i=8790","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8790"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8792","parentNodeId":"ns=1;i=8790","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8790"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8889","parentNodeId":"ns=1;i=5074","references":[{"referenceType":"HasProperty","target":"ns=1;i=8899"},{"referenceType":"HasProperty","target":"ns=1;i=8890"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5074"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8891"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8899","parentNodeId":"ns=1;i=8889","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8889"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8890","parentNodeId":"ns=1;i=8889","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8889"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8891","parentNodeId":"ns=1;i=8889","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8889"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8892","parentNodeId":"ns=1;i=5074","references":[{"referenceType":"HasProperty","target":"ns=1;i=8900"},{"referenceType":"HasProperty","target":"ns=1;i=8893"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5074"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8894"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8900","parentNodeId":"ns=1;i=8892","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8892"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8893","parentNodeId":"ns=1;i=8892","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8892"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8894","parentNodeId":"ns=1;i=8892","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8892"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8895","parentNodeId":"ns=1;i=5074","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8901"},{"referenceType":"HasProperty","target":"ns=1;i=8903"},{"referenceType":"HasProperty","target":"ns=1;i=8902"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5074"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8901","parentNodeId":"ns=1;i=8895","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8895"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8903","parentNodeId":"ns=1;i=8895","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8895"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8902","parentNodeId":"ns=1;i=8895","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8895"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8896","parentNodeId":"ns=1;i=5074","references":[{"referenceType":"HasProperty","target":"ns=1;i=8904"},{"referenceType":"HasProperty","target":"ns=1;i=8897"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5074"},{"referenceType":"HasProperty","target":"ns=1;i=8898"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8904","parentNodeId":"ns=1;i=8896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8897","parentNodeId":"ns=1;i=8896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8896"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8898","parentNodeId":"ns=1;i=8896","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8896"}],"typeDefinition":"i=68"},{"browseName":"1:OutletValveRequest","description":[{"value":"This element offers a request for the opening of the outlet valve."}],"displayName":[{"value":"OutletValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5075","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8793"},{"referenceType":"HasComponent","target":"ns=1;i=8905"},{"referenceType":"HasComponent","target":"ns=1;i=8908"},{"referenceType":"HasComponent","target":"ns=1;i=8911"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8912"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8793","parentNodeId":"ns=1;i=5075","references":[{"referenceType":"HasProperty","target":"ns=1;i=8821"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5075"},{"referenceType":"HasProperty","target":"ns=1;i=8794"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8795"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8821","parentNodeId":"ns=1;i=8793","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8793"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8794","parentNodeId":"ns=1;i=8793","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8793"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8795","parentNodeId":"ns=1;i=8793","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8793"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8905","parentNodeId":"ns=1;i=5075","references":[{"referenceType":"HasProperty","target":"ns=1;i=8915"},{"referenceType":"HasProperty","target":"ns=1;i=8906"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5075"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8907"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8915","parentNodeId":"ns=1;i=8905","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8905"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8906","parentNodeId":"ns=1;i=8905","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8905"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8907","parentNodeId":"ns=1;i=8905","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8905"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8908","parentNodeId":"ns=1;i=5075","references":[{"referenceType":"HasProperty","target":"ns=1;i=8916"},{"referenceType":"HasProperty","target":"ns=1;i=8909"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5075"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8910"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8916","parentNodeId":"ns=1;i=8908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8908"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8909","parentNodeId":"ns=1;i=8908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8908"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8910","parentNodeId":"ns=1;i=8908","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8908"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8911","parentNodeId":"ns=1;i=5075","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8917"},{"referenceType":"HasProperty","target":"ns=1;i=8919"},{"referenceType":"HasProperty","target":"ns=1;i=8918"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5075"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8917","parentNodeId":"ns=1;i=8911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8919","parentNodeId":"ns=1;i=8911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8918","parentNodeId":"ns=1;i=8911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8912","parentNodeId":"ns=1;i=5075","references":[{"referenceType":"HasProperty","target":"ns=1;i=8920"},{"referenceType":"HasProperty","target":"ns=1;i=8913"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5075"},{"referenceType":"HasProperty","target":"ns=1;i=8914"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8920","parentNodeId":"ns=1;i=8912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8912"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8913","parentNodeId":"ns=1;i=8912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8912"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8914","parentNodeId":"ns=1;i=8912","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8912"}],"typeDefinition":"i=68"},{"browseName":"1:PumpKick","description":[{"value":"This element describes a periodical operation of a pump, avoiding blockage at non operation time."}],"displayName":[{"value":"PumpKick"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5082","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasComponent","target":"ns=1;i=8814"},{"referenceType":"HasComponent","target":"ns=1;i=8921"},{"referenceType":"HasComponent","target":"ns=1;i=8924"},{"referenceType":"HasComponent","target":"ns=1;i=8927"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8928"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1032"},{"referenceType":"HasComponent","target":"ns=1;i=8929"},{"referenceType":"HasComponent","target":"ns=1;i=8930"},{"referenceType":"HasComponent","target":"ns=1;i=8932"}],"typeDefinition":"ns=1;i=1032"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8814","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasProperty","target":"ns=1;i=8828"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"},{"referenceType":"HasProperty","target":"ns=1;i=8815"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8816"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8828","parentNodeId":"ns=1;i=8814","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8814"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8815","parentNodeId":"ns=1;i=8814","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8814"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8816","parentNodeId":"ns=1;i=8814","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8814"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8921","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasProperty","target":"ns=1;i=8935"},{"referenceType":"HasProperty","target":"ns=1;i=8922"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8923"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8935","parentNodeId":"ns=1;i=8921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8922","parentNodeId":"ns=1;i=8921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8921"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8923","parentNodeId":"ns=1;i=8921","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8921"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8924","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasProperty","target":"ns=1;i=8936"},{"referenceType":"HasProperty","target":"ns=1;i=8925"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8926"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8936","parentNodeId":"ns=1;i=8924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8925","parentNodeId":"ns=1;i=8924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8924"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8926","parentNodeId":"ns=1;i=8924","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8924"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8927","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8937"},{"referenceType":"HasProperty","target":"ns=1;i=8939"},{"referenceType":"HasProperty","target":"ns=1;i=8938"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8937","parentNodeId":"ns=1;i=8927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8939","parentNodeId":"ns=1;i=8927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8938","parentNodeId":"ns=1;i=8927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickMode","dataType":"PumpKickModeEnum","description":[{"value":"This property describes the pump kick mode of the pump."}],"displayName":[{"value":"PumpKickMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8928","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8940"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8940","parentNodeId":"ns=1;i=8928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTime","dataType":"Double","description":[{"value":"This property determines the absolute time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8929","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8941"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8941","parentNodeId":"ns=1;i=8929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTimeDifference","dataType":"Double","description":[{"value":"This property determines the interval time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8930","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=8942"},{"referenceType":"HasProperty","target":"ns=1;i=8931"},{"referenceType":"HasProperty","target":"ns=1;i=8943"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"}],"typeDefinition":"i=17497","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8942","parentNodeId":"ns=1;i=8930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8931","parentNodeId":"ns=1;i=8930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8930"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8943","parentNodeId":"ns=1;i=8930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8932","parentNodeId":"ns=1;i=5082","references":[{"referenceType":"HasProperty","target":"ns=1;i=8944"},{"referenceType":"HasProperty","target":"ns=1;i=8933"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5082"},{"referenceType":"HasProperty","target":"ns=1;i=8934"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8944","parentNodeId":"ns=1;i=8932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8933","parentNodeId":"ns=1;i=8932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8932"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8934","parentNodeId":"ns=1;i=8932","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8932"}],"typeDefinition":"i=68"},{"browseName":"1:PumpStandByRequest","description":[{"value":"This element offers a request for pump standby."}],"displayName":[{"value":"PumpStandByRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5080","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8808"},{"referenceType":"HasComponent","target":"ns=1;i=8945"},{"referenceType":"HasComponent","target":"ns=1;i=8948"},{"referenceType":"HasComponent","target":"ns=1;i=8951"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8952"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8808","parentNodeId":"ns=1;i=5080","references":[{"referenceType":"HasProperty","target":"ns=1;i=8826"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5080"},{"referenceType":"HasProperty","target":"ns=1;i=8809"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8810"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8826","parentNodeId":"ns=1;i=8808","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8808"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8809","parentNodeId":"ns=1;i=8808","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8808"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8810","parentNodeId":"ns=1;i=8808","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8808"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8945","parentNodeId":"ns=1;i=5080","references":[{"referenceType":"HasProperty","target":"ns=1;i=8955"},{"referenceType":"HasProperty","target":"ns=1;i=8946"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5080"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8947"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8955","parentNodeId":"ns=1;i=8945","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8945"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8946","parentNodeId":"ns=1;i=8945","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8945"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8947","parentNodeId":"ns=1;i=8945","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8945"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8948","parentNodeId":"ns=1;i=5080","references":[{"referenceType":"HasProperty","target":"ns=1;i=8956"},{"referenceType":"HasProperty","target":"ns=1;i=8949"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5080"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8950"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8956","parentNodeId":"ns=1;i=8948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8949","parentNodeId":"ns=1;i=8948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8948"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8950","parentNodeId":"ns=1;i=8948","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8948"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8951","parentNodeId":"ns=1;i=5080","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8957"},{"referenceType":"HasProperty","target":"ns=1;i=8959"},{"referenceType":"HasProperty","target":"ns=1;i=8958"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5080"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8957","parentNodeId":"ns=1;i=8951","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8959","parentNodeId":"ns=1;i=8951","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8958","parentNodeId":"ns=1;i=8951","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8952","parentNodeId":"ns=1;i=5080","references":[{"referenceType":"HasProperty","target":"ns=1;i=8960"},{"referenceType":"HasProperty","target":"ns=1;i=8953"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5080"},{"referenceType":"HasProperty","target":"ns=1;i=8954"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8960","parentNodeId":"ns=1;i=8952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8953","parentNodeId":"ns=1;i=8952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8952"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8954","parentNodeId":"ns=1;i=8952","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8952"}],"typeDefinition":"i=68"},{"browseName":"1:PurgeValveRequest","description":[{"value":"This element offers a request for the opening of the purge valve."}],"displayName":[{"value":"PurgeValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5077","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8799"},{"referenceType":"HasComponent","target":"ns=1;i=8961"},{"referenceType":"HasComponent","target":"ns=1;i=8964"},{"referenceType":"HasComponent","target":"ns=1;i=8967"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=8968"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8799","parentNodeId":"ns=1;i=5077","references":[{"referenceType":"HasProperty","target":"ns=1;i=8823"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5077"},{"referenceType":"HasProperty","target":"ns=1;i=8800"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8801"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8823","parentNodeId":"ns=1;i=8799","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8799"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8800","parentNodeId":"ns=1;i=8799","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8799"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8801","parentNodeId":"ns=1;i=8799","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8799"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8961","parentNodeId":"ns=1;i=5077","references":[{"referenceType":"HasProperty","target":"ns=1;i=8971"},{"referenceType":"HasProperty","target":"ns=1;i=8962"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8963"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8971","parentNodeId":"ns=1;i=8961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8962","parentNodeId":"ns=1;i=8961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8961"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8963","parentNodeId":"ns=1;i=8961","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8961"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8964","parentNodeId":"ns=1;i=5077","references":[{"referenceType":"HasProperty","target":"ns=1;i=8972"},{"referenceType":"HasProperty","target":"ns=1;i=8965"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8966"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8972","parentNodeId":"ns=1;i=8964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8964"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8965","parentNodeId":"ns=1;i=8964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8964"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8966","parentNodeId":"ns=1;i=8964","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8964"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8967","parentNodeId":"ns=1;i=5077","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8973"},{"referenceType":"HasProperty","target":"ns=1;i=8975"},{"referenceType":"HasProperty","target":"ns=1;i=8974"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5077"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8973","parentNodeId":"ns=1;i=8967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8975","parentNodeId":"ns=1;i=8967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8974","parentNodeId":"ns=1;i=8967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8968","parentNodeId":"ns=1;i=5077","references":[{"referenceType":"HasProperty","target":"ns=1;i=8976"},{"referenceType":"HasProperty","target":"ns=1;i=8969"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5077"},{"referenceType":"HasProperty","target":"ns=1;i=8970"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8976","parentNodeId":"ns=1;i=8968","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8968"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8969","parentNodeId":"ns=1;i=8968","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8968"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8970","parentNodeId":"ns=1;i=8968","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8968"}],"typeDefinition":"i=68"},{"browseName":"1:ReverseRotatingDirection","dataType":"Boolean","description":[{"value":"This property indicates the inversion of the standard rotating direction."}],"displayName":[{"value":"ReverseRotatingDirection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8751","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasProperty","target":"ns=1;i=8770"},{"referenceType":"HasProperty","target":"ns=1;i=8752"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"},{"referenceType":"HasProperty","target":"ns=1;i=8753"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8770","parentNodeId":"ns=1;i=8751","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8751"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8752","parentNodeId":"ns=1;i=8751","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8751"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8753","parentNodeId":"ns=1;i=8751","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8751"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SetControlMode","dataType":"ControlModeEnum","description":[{"value":"This property describes the desired control mode of the pump."}],"displayName":[{"value":"SetControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8755","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8771"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8771","parentNodeId":"ns=1;i=8755","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8755"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SetOperationMode","dataType":"OperationModeEnum","description":[{"value":"This property describes the desired operation mode of the pump."}],"displayName":[{"value":"SetOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8749","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8772"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8772","parentNodeId":"ns=1;i=8749","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8749"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:VentValveRequest","description":[{"value":"This element offers a request for the opening of the vent valve."}],"displayName":[{"value":"VentValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5081","parentNodeId":"ns=1;i=1028","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=8811"},{"referenceType":"HasComponent","target":"ns=1;i=8977"},{"referenceType":"HasComponent","target":"ns=1;i=8980"},{"referenceType":"HasComponent","target":"ns=1;i=8983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8984"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1028"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8811","parentNodeId":"ns=1;i=5081","references":[{"referenceType":"HasProperty","target":"ns=1;i=8827"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5081"},{"referenceType":"HasProperty","target":"ns=1;i=8812"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8813"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8827","parentNodeId":"ns=1;i=8811","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8811"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8812","parentNodeId":"ns=1;i=8811","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8811"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8813","parentNodeId":"ns=1;i=8811","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8811"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8977","parentNodeId":"ns=1;i=5081","references":[{"referenceType":"HasProperty","target":"ns=1;i=8987"},{"referenceType":"HasProperty","target":"ns=1;i=8978"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8979"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8987","parentNodeId":"ns=1;i=8977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8978","parentNodeId":"ns=1;i=8977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8977"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8979","parentNodeId":"ns=1;i=8977","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8977"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8980","parentNodeId":"ns=1;i=5081","references":[{"referenceType":"HasProperty","target":"ns=1;i=8988"},{"referenceType":"HasProperty","target":"ns=1;i=8981"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8982"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8988","parentNodeId":"ns=1;i=8980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8981","parentNodeId":"ns=1;i=8980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8980"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8982","parentNodeId":"ns=1;i=8980","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8980"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8983","parentNodeId":"ns=1;i=5081","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8989"},{"referenceType":"HasProperty","target":"ns=1;i=8991"},{"referenceType":"HasProperty","target":"ns=1;i=8990"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5081"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8989","parentNodeId":"ns=1;i=8983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8991","parentNodeId":"ns=1;i=8983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8990","parentNodeId":"ns=1;i=8983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8984","parentNodeId":"ns=1;i=5081","references":[{"referenceType":"HasProperty","target":"ns=1;i=8992"},{"referenceType":"HasProperty","target":"ns=1;i=8985"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5081"},{"referenceType":"HasProperty","target":"ns=1;i=8986"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8992","parentNodeId":"ns=1;i=8984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8985","parentNodeId":"ns=1;i=8984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8984"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8986","parentNodeId":"ns=1;i=8984","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8984"}],"typeDefinition":"i=68"},{"browseName":"1:BreakdownMaintenanceType","displayName":[{"value":"BreakdownMaintenanceType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.10","nodeClass":"ObjectType","nodeId":"ns=1;i=1010","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=6558"},{"referenceType":"HasComponent","target":"ns=1;i=6562"},{"referenceType":"HasComponent","target":"ns=1;i=6565"},{"referenceType":"HasComponent","target":"ns=1;i=6563"},{"referenceType":"HasComponent","target":"ns=1;i=6564"}],"superType":"ns=3;i=1005"},{"browseName":"1:CorrectiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the maintenance time when active corrective maintenance is carried out on an item, including technical, logistic and internal administrative delays"}],"displayName":[{"value":"CorrectiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6558","parentNodeId":"ns=1;i=1010","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1010"},{"referenceType":"HasProperty","target":"ns=1;i=6559"},{"referenceType":"HasProperty","target":"ns=1;i=6561"},{"referenceType":"HasProperty","target":"ns=1;i=6560"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6559","parentNodeId":"ns=1;i=6558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6561","parentNodeId":"ns=1;i=6558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6560","parentNodeId":"ns=1;i=6558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Criticality","dataType":"Double","description":[{"value":"Index of the severity of an effect combined with the probability of expected frequency of its occurrence"}],"displayName":[{"value":"Criticality"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6562","parentNodeId":"ns=1;i=1010","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1010"},{"referenceType":"HasProperty","target":"ns=1;i=6568"},{"referenceType":"HasProperty","target":"ns=1;i=6569"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6568","parentNodeId":"ns=1;i=6562","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6562"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6569","parentNodeId":"ns=1;i=6562","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6562"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Failure","dataType":"Boolean","description":[{"value":"Termination of the ability of an item to perform a required function. A \u0022True\u0022 status means that the pump has a failure and a \u0022False\u0022 status means that the pump has no failure."}],"displayName":[{"value":"Failure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6565","parentNodeId":"ns=1;i=1010","references":[{"referenceType":"HasProperty","target":"ns=1;i=6571"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1010"},{"referenceType":"HasProperty","target":"ns=1;i=6566"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6567"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6571","parentNodeId":"ns=1;i=6565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6565"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6566","parentNodeId":"ns=1;i=6565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6565"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6567","parentNodeId":"ns=1;i=6565","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6565"}],"typeDefinition":"i=68"},{"browseName":"1:NumberOfFailures","dataType":"Int32","description":[{"value":"Number of failures of an object"}],"displayName":[{"value":"NumberOfFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6563","parentNodeId":"ns=1;i=1010","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6572"},{"referenceType":"HasProperty","target":"ns=1;i=6573"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1010"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6572","parentNodeId":"ns=1;i=6563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6573","parentNodeId":"ns=1;i=6563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Severity","dataType":"String","description":[{"value":"Extent of loss, damage or harm caused by a fault or failure"}],"displayName":[{"value":"Severity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6564","parentNodeId":"ns=1;i=1010","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6575"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1010"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6575","parentNodeId":"ns=1;i=6564","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6564"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ConditionBasedMaintenanceType","displayName":[{"value":"ConditionBasedMaintenanceType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.8","nodeClass":"ObjectType","nodeId":"ns=1;i=1008","references":[{"referenceType":"HasComponent","target":"ns=1;i=6500"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=6504"},{"referenceType":"HasComponent","target":"ns=1;i=6505"},{"referenceType":"HasComponent","target":"ns=1;i=6506"},{"referenceType":"HasComponent","target":"ns=1;i=6507"},{"referenceType":"HasComponent","target":"ns=1;i=6508"},{"referenceType":"HasComponent","target":"ns=1;i=6509"},{"referenceType":"HasComponent","target":"ns=1;i=13077"},{"referenceType":"HasComponent","target":"ns=1;i=6510"},{"referenceType":"HasComponent","target":"ns=1;i=6511"},{"referenceType":"HasComponent","target":"ns=1;i=6512"}],"superType":"ns=3;i=1005"},{"browseName":"1:Availability","dataType":"Double","description":[{"value":"Probability that a machine will, when used under specified conditions, operate satisfactorily and effectively"}],"displayName":[{"value":"Availability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6500","parentNodeId":"ns=1;i=1008","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6501"},{"referenceType":"HasProperty","target":"ns=1;i=6503"},{"referenceType":"HasProperty","target":"ns=1;i=6502"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6501","parentNodeId":"ns=1;i=6500","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6500"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6503","parentNodeId":"ns=1;i=6500","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6500"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6502","parentNodeId":"ns=1;i=6500","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6500"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Durability","dataType":"Double","description":[{"value":"Actual reliability of an item considering operating modes, operating conditions and possible preventive maintenance actions carried out"}],"displayName":[{"value":"Durability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6504","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6513"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasProperty","target":"ns=1;i=6515"},{"referenceType":"HasProperty","target":"ns=1;i=6514"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6513","parentNodeId":"ns=1;i=6504","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6504"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6515","parentNodeId":"ns=1;i=6504","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6504"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6514","parentNodeId":"ns=1;i=6504","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6504"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ExpectedReliability","dataType":"Double","description":[{"value":"Reliability of an item determined by design and manufacture under expected conditions of operation and maintenance"}],"displayName":[{"value":"ExpectedReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6505","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6516"},{"referenceType":"HasProperty","target":"ns=1;i=6518"},{"referenceType":"HasProperty","target":"ns=1;i=6517"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6516","parentNodeId":"ns=1;i=6505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6505"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6518","parentNodeId":"ns=1;i=6505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6505"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6517","parentNodeId":"ns=1;i=6505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6505"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InstantaneousAvailability","dataType":"Double","description":[{"value":"Probability that an item is in a state to perform as required at a given instant, under given conditions, assuming that the necessary external resources are provided"}],"displayName":[{"value":"InstantaneousAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6506","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6519"},{"referenceType":"HasProperty","target":"ns=1;i=6521"},{"referenceType":"HasProperty","target":"ns=1;i=6520"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6519","parentNodeId":"ns=1;i=6506","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6506"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6521","parentNodeId":"ns=1;i=6506","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6506"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6520","parentNodeId":"ns=1;i=6506","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6506"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IntrinsicMaintainability","dataType":"Double","description":[{"value":"Maintainability of an item determined by the design under expected conditions of maintenance and logistic support"}],"displayName":[{"value":"IntrinsicMaintainability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6507","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6522"},{"referenceType":"HasProperty","target":"ns=1;i=6524"},{"referenceType":"HasProperty","target":"ns=1;i=6523"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6522","parentNodeId":"ns=1;i=6507","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6507"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6524","parentNodeId":"ns=1;i=6507","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6507"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6523","parentNodeId":"ns=1;i=6507","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6507"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IntrinsicReliability","dataType":"Double","description":[{"value":"Reliability of an item determined by design and manufacture under expected conditions of operation assuming that no preventive maintenance task is carried out, excepting routine maintenance"}],"displayName":[{"value":"IntrinsicReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6508","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6525"},{"referenceType":"HasProperty","target":"ns=1;i=6527"},{"referenceType":"HasProperty","target":"ns=1;i=6526"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6525","parentNodeId":"ns=1;i=6508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6508"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6527","parentNodeId":"ns=1;i=6508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6508"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6526","parentNodeId":"ns=1;i=6508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6508"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Maintainability","dataType":"Double","description":[{"value":"Ability of a machine or part of a system to be retained in, or restored to, a state in which it can perform the required function(s)"}],"displayName":[{"value":"Maintainability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6509","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6528"},{"referenceType":"HasProperty","target":"ns=1;i=6530"},{"referenceType":"HasProperty","target":"ns=1;i=6529"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6528","parentNodeId":"ns=1;i=6509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6530","parentNodeId":"ns=1;i=6509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6529","parentNodeId":"ns=1;i=6509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperationalReliability","dataType":"Double","description":[{"value":"Actual reliability of an item considering operating modes, operating conditions and possible preventive maintenance actions carried out"}],"displayName":[{"value":"OperationalReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13077","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13078"},{"referenceType":"HasProperty","target":"ns=1;i=13080"},{"referenceType":"HasProperty","target":"ns=1;i=13079"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13078","parentNodeId":"ns=1;i=13077","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13080","parentNodeId":"ns=1;i=13077","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13079","parentNodeId":"ns=1;i=13077","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProductionBasedAvailability","dataType":"Double","description":[{"value":"Ratio of actual production to required production, or any other reference level, over a specified period of time"}],"displayName":[{"value":"ProductionBasedAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6510","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6531"},{"referenceType":"HasProperty","target":"ns=1;i=6533"},{"referenceType":"HasProperty","target":"ns=1;i=6532"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6531","parentNodeId":"ns=1;i=6510","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6510"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6533","parentNodeId":"ns=1;i=6510","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6510"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6532","parentNodeId":"ns=1;i=6510","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6510"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Reliability","dataType":"Double","description":[{"value":"Probability that a machine will perform its required functions without failure for a specified time period when used under specified conditions"}],"displayName":[{"value":"Reliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6511","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6534"},{"referenceType":"HasProperty","target":"ns=1;i=6536"},{"referenceType":"HasProperty","target":"ns=1;i=6535"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6534","parentNodeId":"ns=1;i=6511","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6511"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6536","parentNodeId":"ns=1;i=6511","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6511"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6535","parentNodeId":"ns=1;i=6511","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6511"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeBasedAvailability","dataType":"Double","description":[{"value":"During a given period of time, percentage of the time during which an item was able to perform when required"}],"displayName":[{"value":"TimeBasedAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6512","parentNodeId":"ns=1;i=1008","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6537"},{"referenceType":"HasProperty","target":"ns=1;i=6539"},{"referenceType":"HasProperty","target":"ns=1;i=6538"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1008"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6537","parentNodeId":"ns=1;i=6512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6539","parentNodeId":"ns=1;i=6512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6538","parentNodeId":"ns=1;i=6512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ConfigurationGroupType","displayName":[{"value":"ConfigurationGroupType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.19","nodeClass":"ObjectType","nodeId":"ns=1;i=1024","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasComponent","target":"ns=1;i=5066"}],"superType":"ns=3;i=1005"},{"browseName":"1:Design","description":[{"value":"Static design properties for a pump."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5064","parentNodeId":"ns=1;i=1024","references":[{"referenceType":"HasComponent","target":"ns=1;i=8305"},{"referenceType":"HasComponent","target":"ns=1;i=8234"},{"referenceType":"HasComponent","target":"ns=1;i=8235"},{"referenceType":"HasComponent","target":"ns=1;i=8236"},{"referenceType":"HasComponent","target":"ns=1;i=8237"},{"referenceType":"HasComponent","target":"ns=1;i=8240"},{"referenceType":"HasComponent","target":"ns=1;i=8243"},{"referenceType":"HasComponent","target":"ns=1;i=8244"},{"referenceType":"HasComponent","target":"ns=1;i=8247"},{"referenceType":"HasComponent","target":"ns=1;i=8248"},{"referenceType":"HasComponent","target":"ns=1;i=8249"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1024"},{"referenceType":"HasComponent","target":"ns=1;i=8252"},{"referenceType":"HasComponent","target":"ns=1;i=8253"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=8254"},{"referenceType":"HasComponent","target":"ns=1;i=8255"},{"referenceType":"HasComponent","target":"ns=1;i=8256"},{"referenceType":"HasComponent","target":"ns=1;i=8258"},{"referenceType":"HasComponent","target":"ns=1;i=8257"},{"referenceType":"HasComponent","target":"ns=1;i=8259"},{"referenceType":"HasComponent","target":"ns=1;i=5067"},{"referenceType":"HasComponent","target":"ns=1;i=8279"},{"referenceType":"HasComponent","target":"ns=1;i=8280"},{"referenceType":"HasComponent","target":"ns=1;i=8281"},{"referenceType":"HasComponent","target":"ns=1;i=8282"},{"referenceType":"HasComponent","target":"ns=1;i=8283"},{"referenceType":"HasComponent","target":"ns=1;i=8284"},{"referenceType":"HasComponent","target":"ns=1;i=8285"},{"referenceType":"HasComponent","target":"ns=1;i=8286"},{"referenceType":"HasComponent","target":"ns=1;i=8287"},{"referenceType":"HasComponent","target":"ns=1;i=8288"},{"referenceType":"HasComponent","target":"ns=1;i=8289"},{"referenceType":"HasComponent","target":"ns=1;i=8290"},{"referenceType":"HasComponent","target":"ns=1;i=8291"},{"referenceType":"HasComponent","target":"ns=1;i=8292"},{"referenceType":"HasComponent","target":"ns=1;i=8293"},{"referenceType":"HasComponent","target":"ns=1;i=8294"},{"referenceType":"HasComponent","target":"ns=1;i=8295"},{"referenceType":"HasComponent","target":"ns=1;i=8296"},{"referenceType":"HasComponent","target":"ns=1;i=8297"},{"referenceType":"HasComponent","target":"ns=1;i=8298"},{"referenceType":"HasComponent","target":"ns=1;i=8299"},{"referenceType":"HasComponent","target":"ns=1;i=8300"},{"referenceType":"HasComponent","target":"ns=1;i=8301"},{"referenceType":"HasComponent","target":"ns=1;i=8302"},{"referenceType":"HasComponent","target":"ns=1;i=8303"},{"referenceType":"HasComponent","target":"ns=1;i=8304"},{"referenceType":"HasComponent","target":"ns=1;i=8306"},{"referenceType":"HasComponent","target":"ns=1;i=8307"},{"referenceType":"HasComponent","target":"ns=1;i=8308"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8309"},{"referenceType":"HasComponent","target":"ns=1;i=8310"},{"referenceType":"HasComponent","target":"ns=1;i=8311"},{"referenceType":"HasComponent","target":"ns=1;i=8407"},{"referenceType":"HasComponent","target":"ns=1;i=5068"},{"referenceType":"HasComponent","target":"ns=1;i=5069"},{"referenceType":"HasComponent","target":"ns=1;i=5070"},{"referenceType":"HasComponent","target":"ns=1;i=5071"},{"referenceType":"HasComponent","target":"ns=1;i=5072"},{"referenceType":"HasComponent","target":"ns=1;i=8408"},{"referenceType":"HasComponent","target":"ns=1;i=8409"},{"referenceType":"HasComponent","target":"ns=1;i=8410"},{"referenceType":"HasComponent","target":"ns=1;i=8411"},{"referenceType":"HasComponent","target":"ns=1;i=8412"},{"referenceType":"HasComponent","target":"ns=1;i=8413"},{"referenceType":"HasComponent","target":"ns=1;i=8414"},{"referenceType":"HasComponent","target":"ns=1;i=8415"},{"referenceType":"HasComponent","target":"ns=1;i=8416"},{"referenceType":"HasComponent","target":"ns=1;i=8417"},{"referenceType":"HasComponent","target":"ns=1;i=5073"},{"referenceType":"HasComponent","target":"ns=1;i=8437"},{"referenceType":"HasComponent","target":"ns=1;i=8438"},{"referenceType":"HasComponent","target":"ns=1;i=8439"},{"referenceType":"HasComponent","target":"ns=1;i=8440"},{"referenceType":"HasComponent","target":"ns=1;i=8441"},{"referenceType":"HasComponent","target":"ns=1;i=8442"},{"referenceType":"HasComponent","target":"ns=1;i=8443"},{"referenceType":"HasComponent","target":"ns=1;i=8444"},{"referenceType":"HasComponent","target":"ns=1;i=8445"},{"referenceType":"HasComponent","target":"ns=1;i=8446"},{"referenceType":"HasComponent","target":"ns=1;i=8447"}],"typeDefinition":"ns=1;i=1020"},{"arrayDimensions":"128","browseName":"1:AdditionalFieldbuses","dataType":"String","description":[{"value":"Additional fieldbuses supported by the product."}],"displayName":[{"value":"AdditionalFieldbuses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8305","parentNodeId":"ns=1;i=5064","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13500"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueRank":1,"valueXml":"\u003Cuax:ListOfString xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:String\u003E\n \u003C/uax:String\u003E\n \u003C/uax:ListOfString\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13500","parentNodeId":"ns=1;i=8305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:BalancingRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow which is extracted to activate a balance device"}],"displayName":[{"value":"BalancingRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8234","parentNodeId":"ns=1;i=5064","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8448"},{"referenceType":"HasProperty","target":"ns=1;i=8450"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8448","parentNodeId":"ns=1;i=8234","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8234"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8450","parentNodeId":"ns=1;i=8234","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8234"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:BasePressure","dataType":"Double","description":[{"value":"Pressure obtained in the test dome after conditioning the vacuum pump and the test dome"}],"displayName":[{"value":"BasePressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8235","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13267"},{"referenceType":"HasProperty","target":"ns=1;i=13268"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13267","parentNodeId":"ns=1;i=8235","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8235"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13268","parentNodeId":"ns=1;i=8235","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8235"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ClearanceVolume","dataType":"Double","description":[{"value":"Volume remaining unswept at the end of the discharge stroke."}],"displayName":[{"value":"ClearanceVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8236","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=12089"},{"referenceType":"HasProperty","target":"ns=1;i=13271"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12089","parentNodeId":"ns=1;i=8236","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13271","parentNodeId":"ns=1;i=8236","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ClockwiseRotation","dataType":"Boolean","description":[{"value":"Direction of rotation in which the shaft is seen to be turning in a clockwise direction when viewing the drive end of the shaft. A \u0022True\u0022 status means that the rotation of pump is clockwise and a \u0022False\u0022 status means that the rotation of pump is anticlockwise."}],"displayName":[{"value":"ClockwiseRotation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8237","parentNodeId":"ns=1;i=5064","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13275"},{"referenceType":"HasProperty","target":"ns=1;i=8238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8239"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13275","parentNodeId":"ns=1;i=8237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8238","parentNodeId":"ns=1;i=8237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8237"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8239","parentNodeId":"ns=1;i=8237","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8237"}],"typeDefinition":"i=68"},{"browseName":"1:Controllable","dataType":"Boolean","description":[{"value":"Indicates whether the product is a controllable pump or a self-controlling pump. A \u0022True\u0022 status means that the pump is controllable and a \u0022False\u0022 status means that the pump is not controllable."}],"displayName":[{"value":"Controllable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8240","parentNodeId":"ns=1;i=5064","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13278"},{"referenceType":"HasProperty","target":"ns=1;i=8241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8242"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13278","parentNodeId":"ns=1;i=8240","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8240"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8241","parentNodeId":"ns=1;i=8240","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8240"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8242","parentNodeId":"ns=1;i=8240","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8240"}],"typeDefinition":"i=68"},{"browseName":"1:Cool_DownTimeForAVaporJetPumpOrADiffusionPump","dataType":"Double","description":[{"value":"The cool-down time is the time required to cool the propellant from the working temperature to a temperature at which the propellant can be exposed to atmospheric air without risk after the heating has been switched off."}],"displayName":[{"value":"Cool_DownTimeForAVaporJetPumpOrADiffusionPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8243","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13282"},{"referenceType":"HasProperty","target":"ns=1;i=13283"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13282","parentNodeId":"ns=1;i=8243","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8243"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13283","parentNodeId":"ns=1;i=8243","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8243"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Counter_ClockwiseRotation","dataType":"Boolean","description":[{"value":"Direction of rotation in which the shaft is seen to be turning in an anticlockwise direction, when viewing the drive end of the shaft. A \u0022True\u0022 status means that the rotation of pump is anticlockwise and a \u0022False\u0022 status means that the rotation of pump is clockwise."}],"displayName":[{"value":"Counter_ClockwiseRotation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8244","parentNodeId":"ns=1;i=5064","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13287"},{"referenceType":"HasProperty","target":"ns=1;i=8245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8246"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13287","parentNodeId":"ns=1;i=8244","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8244"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8245","parentNodeId":"ns=1;i=8244","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8244"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8246","parentNodeId":"ns=1;i=8244","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8244"}],"typeDefinition":"i=68"},{"browseName":"1:CriticalSpeed","dataType":"Double","description":[{"value":"Speed of rotation at which the frequency of vibration (or its multiples) corresponds to the rotor resonant (lateral or torsional)"}],"displayName":[{"value":"CriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8247","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13291"},{"referenceType":"HasProperty","target":"ns=1;i=13292"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13291","parentNodeId":"ns=1;i=8247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13292","parentNodeId":"ns=1;i=8247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DeclarationOfConformity","dataType":"String","description":[{"value":"Publicly accessible attestation of conformity, commonly available on websites."}],"displayName":[{"value":"DeclarationOfConformity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8248","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13296"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13296","parentNodeId":"ns=1;i=8248","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8248"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DeclarationOfConformityAvailable","dataType":"Boolean","description":[{"value":"Whether or not a declaration of conformity exists. A \u0022True\u0022 status means that the declaration exists and a \u0022False\u0022 status means that there is no declaration available."}],"displayName":[{"value":"DeclarationOfConformityAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8249","parentNodeId":"ns=1;i=5064","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13299"},{"referenceType":"HasProperty","target":"ns=1;i=8250"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8251"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13299","parentNodeId":"ns=1;i=8249","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8249"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8250","parentNodeId":"ns=1;i=8249","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8249"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8251","parentNodeId":"ns=1;i=8249","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8249"}],"typeDefinition":"i=68"},{"browseName":"1:DesignAxialLoad","dataType":"Double","description":[{"value":"Residual axial thrust on the pump rotor on which the thrust-bearing selection is based."}],"displayName":[{"value":"DesignAxialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8252","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13303"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13304"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13303","parentNodeId":"ns=1;i=8252","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8252"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13304","parentNodeId":"ns=1;i=8252","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8252"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DesignRadialLoad","dataType":"Double","description":[{"value":"Radial load of the pump rotor for which the bearing system is selected."}],"displayName":[{"value":"DesignRadialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8253","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13310"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13309","parentNodeId":"ns=1;i=8253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13310","parentNodeId":"ns=1;i=8253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DirectivesOfEUDeclarationOfConformity","dataType":"DeclarationOfConformityOptionSet","description":[{"value":"Set of directives on the basis of which conformity was determined."}],"displayName":[{"value":"DirectivesOfEUDeclarationOfConformity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8254","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13317"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ens=1;i=5014\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003COptionSet xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CValue\u003EAA==\u003C/Value\u003E\n \u003CValidBits\u003E/w==\u003C/ValidBits\u003E\n \u003C/OptionSet\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13317","parentNodeId":"ns=1;i=8254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8254"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DryCriticalSpeed","dataType":"Double","description":[{"value":"Rotor resonant frequency calculated assuming that the rotor is supported only at its bearings and that the bearings are of infinite stiffness"}],"displayName":[{"value":"DryCriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8255","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13321"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13322"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13321","parentNodeId":"ns=1;i=8255","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8255"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13322","parentNodeId":"ns=1;i=8255","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8255"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ExplosionProtection","dataType":"ExplosionProtectionOptionSet","description":[{"value":"Device category for explosion protection according to 2014/34/EU (ATEX)."}],"displayName":[{"value":"ExplosionProtection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8256","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13326"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13326","parentNodeId":"ns=1;i=8256","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8256"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GeometricalFlow","dataType":"Double","description":[{"value":"Product of geometrical displacement volume and speed of rotation or stroke frequency"}],"displayName":[{"value":"GeometricalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8258","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13330"},{"referenceType":"HasProperty","target":"ns=1;i=13331"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13330","parentNodeId":"ns=1;i=8258","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8258"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13331","parentNodeId":"ns=1;i=8258","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8258"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:GeometricDisplacementVolume","dataType":"Double","description":[{"value":"Displacement volume for one stroke or one cycle."}],"displayName":[{"value":"GeometricDisplacementVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8257","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13336"},{"referenceType":"HasProperty","target":"ns=1;i=13337"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13336","parentNodeId":"ns=1;i=8257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13337","parentNodeId":"ns=1;i=8257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:HeadAtPeakPoint","dataType":"Double","description":[{"value":"Highest total head developed by a pump when this does not occur at a zero rate of flow"}],"displayName":[{"value":"HeadAtPeakPoint"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8259","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13342"},{"referenceType":"HasProperty","target":"ns=1;i=13343"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13342","parentNodeId":"ns=1;i=8259","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8259"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13343","parentNodeId":"ns=1;i=8259","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8259"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:InstallationNpshCurve","description":[{"value":"Relationship between the net positive suction head available and the rate of flow at given operating conditions for a given liquid"}],"displayName":[{"value":"InstallationNpshCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5067","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8260"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8262"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=13347"},{"referenceType":"HasComponent","target":"ns=1;i=8265"},{"referenceType":"HasProperty","target":"ns=1;i=8268"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8269"},{"referenceType":"HasComponent","target":"ns=1;i=8272"},{"referenceType":"HasProperty","target":"ns=1;i=8274"},{"referenceType":"HasProperty","target":"ns=1;i=8275"},{"referenceType":"HasProperty","target":"ns=1;i=8276"},{"referenceType":"HasComponent","target":"ns=1;i=8277"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8260","parentNodeId":"ns=1;i=5067","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5067"},{"referenceType":"HasProperty","target":"ns=1;i=8261"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8261","parentNodeId":"ns=1;i=8260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8260"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8262","parentNodeId":"ns=1;i=5067","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5067"},{"referenceType":"HasProperty","target":"ns=1;i=8263"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8264"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8263","parentNodeId":"ns=1;i=8262","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8262"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8264","parentNodeId":"ns=1;i=8262","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8262"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13347","parentNodeId":"ns=1;i=5067","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5067"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8265","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasProperty","target":"ns=1;i=8266"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5067"},{"referenceType":"HasProperty","target":"ns=1;i=8267"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8266","parentNodeId":"ns=1;i=8265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8265"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8267","parentNodeId":"ns=1;i=8265","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8265"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8268","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5067"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8269","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasProperty","target":"ns=1;i=8270"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8271"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5067"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8270","parentNodeId":"ns=1;i=8269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8269"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8271","parentNodeId":"ns=1;i=8269","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8269"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8272","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasProperty","target":"ns=1;i=8273"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5067"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8273","parentNodeId":"ns=1;i=8272","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8272"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8274","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5067"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8275","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5067"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8276","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5067"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8277","parentNodeId":"ns=1;i=5067","references":[{"referenceType":"HasProperty","target":"ns=1;i=8278"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5067"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8278","parentNodeId":"ns=1;i=8277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8277"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LeakageRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow leaking from shaft seals"}],"displayName":[{"value":"LeakageRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8279","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13351"},{"referenceType":"HasProperty","target":"ns=1;i=13352"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13351","parentNodeId":"ns=1;i=8279","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8279"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13352","parentNodeId":"ns=1;i=8279","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8279"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableAmbientTemperature","dataType":"Double","description":[{"value":"Highest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MaximumAllowableAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8280","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13357"},{"referenceType":"HasProperty","target":"ns=1;i=13358"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13357","parentNodeId":"ns=1;i=8280","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8280"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13358","parentNodeId":"ns=1;i=8280","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8280"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableCasingWorkingPressure","dataType":"Double","description":[{"value":"Greatest outlet pressure at the specified operating temperature at which the pump casing can be used"}],"displayName":[{"value":"MaximumAllowableCasingWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8281","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13363"},{"referenceType":"HasProperty","target":"ns=1;i=13364"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13363","parentNodeId":"ns=1;i=8281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13364","parentNodeId":"ns=1;i=8281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableContinuousSpeed","dataType":"Double","description":[{"value":"Highest rotational speed for continuous operation recommended by the manufacturer"}],"displayName":[{"value":"MaximumAllowableContinuousSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8282","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13369"},{"referenceType":"HasProperty","target":"ns=1;i=13370"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13369","parentNodeId":"ns=1;i=8282","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8282"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13370","parentNodeId":"ns=1;i=8282","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8282"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableHead","dataType":"Double","description":[{"value":"Maximum permissible head at which the pump can be continuously operated without suffering damage"}],"displayName":[{"value":"MaximumAllowableHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8283","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13375"},{"referenceType":"HasProperty","target":"ns=1;i=13376"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13375","parentNodeId":"ns=1;i=8283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13376","parentNodeId":"ns=1;i=8283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableRelativeHumidity","dataType":"Double","description":[{"value":"Highest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MaximumAllowableRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8284","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13381"},{"referenceType":"HasProperty","target":"ns=1;i=13382"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13381","parentNodeId":"ns=1;i=8284","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8284"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13382","parentNodeId":"ns=1;i=8284","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8284"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableTemperature","dataType":"Double","description":[{"value":"Highest allowable continuous fluid temperature for which the equipment (or any part to which the term refers) is suitable when handling the specified operating fluid at the specified operating pressure"}],"displayName":[{"value":"MaximumAllowableTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8285","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13387"},{"referenceType":"HasProperty","target":"ns=1;i=13388"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13387","parentNodeId":"ns=1;i=8285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13388","parentNodeId":"ns=1;i=8285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableThroughput","dataType":"Double","description":[{"value":"Maximum pV flow the pump can withstand without damage"}],"displayName":[{"value":"MaximumAllowableThroughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8286","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13393"},{"referenceType":"HasProperty","target":"ns=1;i=13394"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13393","parentNodeId":"ns=1;i=8286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13394","parentNodeId":"ns=1;i=8286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableWorkingPressure","dataType":"Double","description":[{"value":"Pressure for a component on the basis of materials used and on the basis of calculation rules at the specified operating temperature"}],"displayName":[{"value":"MaximumAllowableWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8287","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13399"},{"referenceType":"HasProperty","target":"ns=1;i=13400"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13399","parentNodeId":"ns=1;i=8287","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13400","parentNodeId":"ns=1;i=8287","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAxialLoad","dataType":"Double","description":[{"value":"Greatest value of the residual axial thrust on the pump rotor resulting from operating the pump at any condition within its allowable operating range."}],"displayName":[{"value":"MaximumAxialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8288","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13405"},{"referenceType":"HasProperty","target":"ns=1;i=13406"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13405","parentNodeId":"ns=1;i=8288","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8288"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13406","parentNodeId":"ns=1;i=8288","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8288"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumPumpPowerInput","dataType":"Double","description":[{"value":"Highest value of the pump power input at any rate of flow at any allowable operating condition"}],"displayName":[{"value":"MaximumPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8289","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13411"},{"referenceType":"HasProperty","target":"ns=1;i=13412"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13411","parentNodeId":"ns=1;i=8289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13412","parentNodeId":"ns=1;i=8289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumRadialLoad","dataType":"Double","description":[{"value":"Greatest radial load of the pump rotor resulting from operating the pump at any condition within its allowable operating range."}],"displayName":[{"value":"MaximumRadialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8290","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13417"},{"referenceType":"HasProperty","target":"ns=1;i=13418"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13417","parentNodeId":"ns=1;i=8290","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8290"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13418","parentNodeId":"ns=1;i=8290","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8290"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumStaticSealingPressure","dataType":"Double","description":[{"value":"Highest pressure, excluding hydrostatic testing, to which the seal can be subjected while the pump is shut down"}],"displayName":[{"value":"MaximumStaticSealingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8291","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13423"},{"referenceType":"HasProperty","target":"ns=1;i=13424"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13423","parentNodeId":"ns=1;i=8291","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8291"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13424","parentNodeId":"ns=1;i=8291","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8291"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MeanTimebetweenFailures","dataType":"Double","description":[{"value":"Average of the times between failures."}],"displayName":[{"value":"MeanTimebetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8292","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13429"},{"referenceType":"HasProperty","target":"ns=1;i=13430"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13429","parentNodeId":"ns=1;i=8292","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8292"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13430","parentNodeId":"ns=1;i=8292","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8292"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableAmbientTemperature","dataType":"Double","description":[{"value":"Lowest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MinimumAllowableAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8293","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13435"},{"referenceType":"HasProperty","target":"ns=1;i=13436"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13435","parentNodeId":"ns=1;i=8293","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8293"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13436","parentNodeId":"ns=1;i=8293","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8293"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableContinuousSpeed","dataType":"Double","description":[{"value":"Lowest speed for continuous operation recommended by the manufacturer"}],"displayName":[{"value":"MinimumAllowableContinuousSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8294","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13441"},{"referenceType":"HasProperty","target":"ns=1;i=13442"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13441","parentNodeId":"ns=1;i=8294","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8294"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13442","parentNodeId":"ns=1;i=8294","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8294"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableHead","dataType":"Double","description":[{"value":"Minimum permissible head at which the pump can be operated without suffering damage"}],"displayName":[{"value":"MinimumAllowableHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8295","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13447"},{"referenceType":"HasProperty","target":"ns=1;i=13448"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13447","parentNodeId":"ns=1;i=8295","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8295"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13448","parentNodeId":"ns=1;i=8295","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8295"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableRelativeHumidity","dataType":"Double","description":[{"value":"Lowest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MinimumAllowableRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8296","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13453"},{"referenceType":"HasProperty","target":"ns=1;i=13454"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13453","parentNodeId":"ns=1;i=8296","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8296"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13454","parentNodeId":"ns=1;i=8296","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8296"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableTemperature","dataType":"Double","description":[{"value":"Lowest allowable continuous temperature for which the equipment (or any part to which the term refers) is suitable when handling the specified operating fluid at the specified operating pressure"}],"displayName":[{"value":"MinimumAllowableTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8297","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13459"},{"referenceType":"HasProperty","target":"ns=1;i=13460"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13459","parentNodeId":"ns=1;i=8297","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8297"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13460","parentNodeId":"ns=1;i=8297","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8297"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableThermalFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without its operation being impaired by the temperature rise of the pumped liquid"}],"displayName":[{"value":"MinimumAllowableThermalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8298","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13465"},{"referenceType":"HasProperty","target":"ns=1;i=13466"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13465","parentNodeId":"ns=1;i=8298","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8298"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13466","parentNodeId":"ns=1;i=8298","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8298"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumContinuousStableFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can be operated without it adversely affecting its performance in terms of life expectancy, noise and vibrations"}],"displayName":[{"value":"MinimumContinuousStableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8299","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13471"},{"referenceType":"HasProperty","target":"ns=1;i=13472"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13471","parentNodeId":"ns=1;i=8299","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8299"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13472","parentNodeId":"ns=1;i=8299","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8299"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumContinuousThermalFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without its operation being impaired by the temperature rise of the pumped liquid"}],"displayName":[{"value":"MinimumContinuousThermalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8300","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13477"},{"referenceType":"HasProperty","target":"ns=1;i=13478"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13477","parentNodeId":"ns=1;i=8300","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8300"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13478","parentNodeId":"ns=1;i=8300","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8300"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:NetPositiveSuctionHeadRequired","dataType":"Double","description":[{"value":"Minimum NPSH at the pump inlet connection required to give the rated or operating performance at the specified conditions"}],"displayName":[{"value":"NetPositiveSuctionHeadRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8301","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13483"},{"referenceType":"HasProperty","target":"ns=1;i=13484"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13483","parentNodeId":"ns=1;i=8301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8301"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13484","parentNodeId":"ns=1;i=8301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8301"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:NetPositiveSuctionHeadRequiredForADropOf3Percent","dataType":"Double","description":[{"value":"NPSH required for a drop of 3 % in the total head of the first stage of the pump as a standard basis for use in performance curves"}],"displayName":[{"value":"NetPositiveSuctionHeadRequiredForADropOf3Percent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8302","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13489"},{"referenceType":"HasProperty","target":"ns=1;i=13490"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13489","parentNodeId":"ns=1;i=8302","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8302"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13490","parentNodeId":"ns=1;i=8302","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8302"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OfferedControlModes","dataType":"OfferedControlModesOptionSet","description":[{"value":"Control modes supported by the manufacturer for the product."}],"displayName":[{"value":"OfferedControlModes"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8303","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13494"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13494","parentNodeId":"ns=1;i=8303","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8303"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OfferedFieldbuses","dataType":"OfferedFieldbusesOptionSet","description":[{"value":"Fieldbuses supported by the manufacturer for the product."}],"displayName":[{"value":"OfferedFieldbuses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8304","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13497"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13497","parentNodeId":"ns=1;i=8304","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8304"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OptimumHead","dataType":"Double","description":[{"value":"Total head developed by the pump at a rate of flow corresponding to the best efficiency"}],"displayName":[{"value":"OptimumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8306","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13504"},{"referenceType":"HasProperty","target":"ns=1;i=13505"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13504","parentNodeId":"ns=1;i=8306","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8306"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13505","parentNodeId":"ns=1;i=8306","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8306"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OptimumPumpPowerInput","dataType":"Double","description":[{"value":"Pump power input at the rate of flow corresponding to the best efficiency"}],"displayName":[{"value":"OptimumPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8307","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13510"},{"referenceType":"HasProperty","target":"ns=1;i=13511"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13510","parentNodeId":"ns=1;i=8307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8307"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13511","parentNodeId":"ns=1;i=8307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8307"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OptimumRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow at the point of best efficiency"}],"displayName":[{"value":"OptimumRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8308","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13516"},{"referenceType":"HasProperty","target":"ns=1;i=13517"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13516","parentNodeId":"ns=1;i=8308","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8308"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13517","parentNodeId":"ns=1;i=8308","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8308"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:PistonVelocity","dataType":"Double","description":[{"value":"Average speed given by the stroke length multiplied with the number of complete pumping cycles of the piston, plunger or piston attached to the diaphragm per minute (stroke per minute or pump crank speed)"}],"displayName":[{"value":"PistonVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8309","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13522"},{"referenceType":"HasProperty","target":"ns=1;i=13523"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13522","parentNodeId":"ns=1;i=8309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8309"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13523","parentNodeId":"ns=1;i=8309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8309"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"1:PossibleFluids","dataType":"String","description":[{"value":"Fluids that can be pumped by the pump."}],"displayName":[{"value":"PossibleFluids"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8310","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13527"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13527","parentNodeId":"ns=1;i=8310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8310"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Pre_ChargePressure","dataType":"Double","description":[{"value":"Pressure to which the pulsation dampener is charged with dry gas prior to start of operation"}],"displayName":[{"value":"Pre_ChargePressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8311","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13531"},{"referenceType":"HasProperty","target":"ns=1;i=13532"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13531","parentNodeId":"ns=1;i=8311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13532","parentNodeId":"ns=1;i=8311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:PumpClass","dataType":"PumpClassEnum","description":[{"value":"Pump type according to functional principle and pumped fluid"}],"displayName":[{"value":"PumpClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8407","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13314"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13314","parentNodeId":"ns=1;i=8407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PumpCurve","description":[{"value":"Representation of the pump head plotted against the flow rate"}],"displayName":[{"value":"PumpCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5068","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8312"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8314"},{"referenceType":"HasProperty","target":"ns=1;i=13536"},{"referenceType":"HasComponent","target":"ns=1;i=8317"},{"referenceType":"HasProperty","target":"ns=1;i=8320"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasComponent","target":"ns=1;i=8321"},{"referenceType":"HasComponent","target":"ns=1;i=8324"},{"referenceType":"HasProperty","target":"ns=1;i=8326"},{"referenceType":"HasProperty","target":"ns=1;i=8327"},{"referenceType":"HasProperty","target":"ns=1;i=8328"},{"referenceType":"HasComponent","target":"ns=1;i=8329"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8312","parentNodeId":"ns=1;i=5068","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5068"},{"referenceType":"HasProperty","target":"ns=1;i=8313"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8313","parentNodeId":"ns=1;i=8312","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8312"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8314","parentNodeId":"ns=1;i=5068","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5068"},{"referenceType":"HasProperty","target":"ns=1;i=8315"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8316"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8315","parentNodeId":"ns=1;i=8314","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8314"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8316","parentNodeId":"ns=1;i=8314","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8314"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13536","parentNodeId":"ns=1;i=5068","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5068"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8317","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasProperty","target":"ns=1;i=8318"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5068"},{"referenceType":"HasProperty","target":"ns=1;i=8319"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8318","parentNodeId":"ns=1;i=8317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8317"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8319","parentNodeId":"ns=1;i=8317","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8317"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8320","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5068"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8321","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasProperty","target":"ns=1;i=8322"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8323"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5068"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8322","parentNodeId":"ns=1;i=8321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8321"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8323","parentNodeId":"ns=1;i=8321","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8321"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8324","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasProperty","target":"ns=1;i=8325"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5068"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8325","parentNodeId":"ns=1;i=8324","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8324"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8326","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5068"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8327","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5068"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8328","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5068"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8329","parentNodeId":"ns=1;i=5068","references":[{"referenceType":"HasProperty","target":"ns=1;i=8330"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5068"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8330","parentNodeId":"ns=1;i=8329","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8329"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpEfficiencyCurve","description":[{"value":"Relationship between the pump efficiency and the rate of flow at given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpEfficiencyCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5069","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8331"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8333"},{"referenceType":"HasProperty","target":"ns=1;i=13539"},{"referenceType":"HasComponent","target":"ns=1;i=8336"},{"referenceType":"HasProperty","target":"ns=1;i=8339"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasComponent","target":"ns=1;i=8340"},{"referenceType":"HasComponent","target":"ns=1;i=8343"},{"referenceType":"HasProperty","target":"ns=1;i=8345"},{"referenceType":"HasProperty","target":"ns=1;i=8346"},{"referenceType":"HasProperty","target":"ns=1;i=8347"},{"referenceType":"HasComponent","target":"ns=1;i=8348"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8331","parentNodeId":"ns=1;i=5069","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5069"},{"referenceType":"HasProperty","target":"ns=1;i=8332"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8332","parentNodeId":"ns=1;i=8331","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8331"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8333","parentNodeId":"ns=1;i=5069","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5069"},{"referenceType":"HasProperty","target":"ns=1;i=8334"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8335"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8334","parentNodeId":"ns=1;i=8333","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8333"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8335","parentNodeId":"ns=1;i=8333","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8333"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13539","parentNodeId":"ns=1;i=5069","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5069"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8336","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasProperty","target":"ns=1;i=8337"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5069"},{"referenceType":"HasProperty","target":"ns=1;i=8338"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8337","parentNodeId":"ns=1;i=8336","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8336"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8338","parentNodeId":"ns=1;i=8336","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8336"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8339","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5069"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8340","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasProperty","target":"ns=1;i=8341"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8342"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5069"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8341","parentNodeId":"ns=1;i=8340","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8340"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8342","parentNodeId":"ns=1;i=8340","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8340"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8343","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasProperty","target":"ns=1;i=8344"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5069"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8344","parentNodeId":"ns=1;i=8343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8343"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8345","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5069"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8346","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5069"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8347","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5069"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8348","parentNodeId":"ns=1;i=5069","references":[{"referenceType":"HasProperty","target":"ns=1;i=8349"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5069"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8349","parentNodeId":"ns=1;i=8348","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8348"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpH_Q_Curve","description":[{"value":"Relationship between the total head of the pump and the rate of flow at given operating conditions /rated conditions of speed and liquid"}],"displayName":[{"value":"PumpH(Q)Curve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5070","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8350"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8352"},{"referenceType":"HasProperty","target":"ns=1;i=13542"},{"referenceType":"HasComponent","target":"ns=1;i=8355"},{"referenceType":"HasProperty","target":"ns=1;i=8358"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasComponent","target":"ns=1;i=8359"},{"referenceType":"HasComponent","target":"ns=1;i=8362"},{"referenceType":"HasProperty","target":"ns=1;i=8364"},{"referenceType":"HasProperty","target":"ns=1;i=8365"},{"referenceType":"HasProperty","target":"ns=1;i=8366"},{"referenceType":"HasComponent","target":"ns=1;i=8367"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8350","parentNodeId":"ns=1;i=5070","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5070"},{"referenceType":"HasProperty","target":"ns=1;i=8351"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8351","parentNodeId":"ns=1;i=8350","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8350"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8352","parentNodeId":"ns=1;i=5070","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5070"},{"referenceType":"HasProperty","target":"ns=1;i=8353"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8354"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8353","parentNodeId":"ns=1;i=8352","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8352"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8354","parentNodeId":"ns=1;i=8352","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8352"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13542","parentNodeId":"ns=1;i=5070","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5070"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8355","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasProperty","target":"ns=1;i=8356"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5070"},{"referenceType":"HasProperty","target":"ns=1;i=8357"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8356","parentNodeId":"ns=1;i=8355","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8355"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8357","parentNodeId":"ns=1;i=8355","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8355"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8358","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5070"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8359","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasProperty","target":"ns=1;i=8360"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8361"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5070"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8360","parentNodeId":"ns=1;i=8359","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8359"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8361","parentNodeId":"ns=1;i=8359","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8359"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8362","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasProperty","target":"ns=1;i=8363"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5070"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8363","parentNodeId":"ns=1;i=8362","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8362"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8364","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5070"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8365","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5070"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8366","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5070"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8367","parentNodeId":"ns=1;i=5070","references":[{"referenceType":"HasProperty","target":"ns=1;i=8368"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5070"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8368","parentNodeId":"ns=1;i=8367","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8367"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpNpshCurve","description":[{"value":"Relationship between the net positive suction head required and the rate of flow at given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpNpshCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5071","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8369"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8371"},{"referenceType":"HasProperty","target":"ns=1;i=13545"},{"referenceType":"HasComponent","target":"ns=1;i=8374"},{"referenceType":"HasProperty","target":"ns=1;i=8377"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasComponent","target":"ns=1;i=8378"},{"referenceType":"HasComponent","target":"ns=1;i=8381"},{"referenceType":"HasProperty","target":"ns=1;i=8383"},{"referenceType":"HasProperty","target":"ns=1;i=8384"},{"referenceType":"HasProperty","target":"ns=1;i=8385"},{"referenceType":"HasComponent","target":"ns=1;i=8386"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8369","parentNodeId":"ns=1;i=5071","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5071"},{"referenceType":"HasProperty","target":"ns=1;i=8370"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8370","parentNodeId":"ns=1;i=8369","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8369"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8371","parentNodeId":"ns=1;i=5071","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5071"},{"referenceType":"HasProperty","target":"ns=1;i=8372"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8373"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8372","parentNodeId":"ns=1;i=8371","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8371"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8373","parentNodeId":"ns=1;i=8371","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8371"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13545","parentNodeId":"ns=1;i=5071","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5071"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8374","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasProperty","target":"ns=1;i=8375"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5071"},{"referenceType":"HasProperty","target":"ns=1;i=8376"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8375","parentNodeId":"ns=1;i=8374","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8374"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8376","parentNodeId":"ns=1;i=8374","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8374"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8377","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5071"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8378","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasProperty","target":"ns=1;i=8379"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8380"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5071"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8379","parentNodeId":"ns=1;i=8378","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8378"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8380","parentNodeId":"ns=1;i=8378","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8378"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8381","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasProperty","target":"ns=1;i=8382"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5071"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8382","parentNodeId":"ns=1;i=8381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8381"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8383","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5071"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8384","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5071"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8385","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5071"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8386","parentNodeId":"ns=1;i=5071","references":[{"referenceType":"HasProperty","target":"ns=1;i=8387"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5071"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8387","parentNodeId":"ns=1;i=8386","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8386"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpPowerInputCurve","description":[{"value":"Relationship between the pump power input and the rate of flow given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpPowerInputCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5072","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8388"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8390"},{"referenceType":"HasProperty","target":"ns=1;i=13548"},{"referenceType":"HasComponent","target":"ns=1;i=8393"},{"referenceType":"HasProperty","target":"ns=1;i=8396"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasComponent","target":"ns=1;i=8397"},{"referenceType":"HasComponent","target":"ns=1;i=8400"},{"referenceType":"HasProperty","target":"ns=1;i=8402"},{"referenceType":"HasProperty","target":"ns=1;i=8403"},{"referenceType":"HasProperty","target":"ns=1;i=8404"},{"referenceType":"HasComponent","target":"ns=1;i=8405"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8388","parentNodeId":"ns=1;i=5072","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5072"},{"referenceType":"HasProperty","target":"ns=1;i=8389"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8389","parentNodeId":"ns=1;i=8388","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8388"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8390","parentNodeId":"ns=1;i=5072","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5072"},{"referenceType":"HasProperty","target":"ns=1;i=8391"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8392"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8391","parentNodeId":"ns=1;i=8390","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8390"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8392","parentNodeId":"ns=1;i=8390","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8390"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13548","parentNodeId":"ns=1;i=5072","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5072"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8393","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasProperty","target":"ns=1;i=8394"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5072"},{"referenceType":"HasProperty","target":"ns=1;i=8395"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8394","parentNodeId":"ns=1;i=8393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8393"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8395","parentNodeId":"ns=1;i=8393","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8393"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8396","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5072"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8397","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasProperty","target":"ns=1;i=8398"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8399"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5072"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8398","parentNodeId":"ns=1;i=8397","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8397"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8399","parentNodeId":"ns=1;i=8397","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8397"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8400","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasProperty","target":"ns=1;i=8401"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5072"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8401","parentNodeId":"ns=1;i=8400","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8400"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8402","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5072"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8403","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5072"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8404","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5072"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8405","parentNodeId":"ns=1;i=5072","references":[{"referenceType":"HasProperty","target":"ns=1;i=8406"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5072"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8406","parentNodeId":"ns=1;i=8405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8405"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:Shut_OffHead","dataType":"Double","description":[{"value":"Total head developed by the pump in a zero rate of flow"}],"displayName":[{"value":"Shut_OffHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8408","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13552"},{"referenceType":"HasProperty","target":"ns=1;i=13553"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13552","parentNodeId":"ns=1;i=8408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13553","parentNodeId":"ns=1;i=8408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Shut_OffPumpPowerInput","dataType":"Double","description":[{"value":"Pump power input at zero rate of flow"}],"displayName":[{"value":"Shut_OffPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8409","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13558"},{"referenceType":"HasProperty","target":"ns=1;i=13559"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13558","parentNodeId":"ns=1;i=8409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13559","parentNodeId":"ns=1;i=8409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SlipFlow","dataType":"Double","description":[{"value":"Flow lost internally through clearances"}],"displayName":[{"value":"SlipFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8410","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13564"},{"referenceType":"HasProperty","target":"ns=1;i=13565"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13564","parentNodeId":"ns=1;i=8410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13565","parentNodeId":"ns=1;i=8410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundEnergy","dataType":"Double","description":[{"value":"Integral of the sound power, P, over a stated time interval of duration T (starting at t1 and ending at t2)."}],"displayName":[{"value":"SoundEnergy"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8411","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13570"},{"referenceType":"HasProperty","target":"ns=1;i=13571"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13570","parentNodeId":"ns=1;i=8411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13571","parentNodeId":"ns=1;i=8411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundEnergyLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the sound energy, J, to a reference value, J0, expressed in decibels."}],"displayName":[{"value":"SoundEnergyLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8412","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13576"},{"referenceType":"HasProperty","target":"ns=1;i=13577"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13576","parentNodeId":"ns=1;i=8412","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8412"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13577","parentNodeId":"ns=1;i=8412","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8412"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPower","dataType":"Double","description":[{"value":"Through a surface, product of the sound pressure, p, and the component of the particle velocity, un, at a point on the surface in the direction normal to the surface, integrated over that surface."}],"displayName":[{"value":"SoundPower"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8413","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13582"},{"referenceType":"HasProperty","target":"ns=1;i=13583"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13582","parentNodeId":"ns=1;i=8413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13583","parentNodeId":"ns=1;i=8413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPowerLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the sound power of a source, P, to a reference value, P0, expressed in decibels."}],"displayName":[{"value":"SoundPowerLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8414","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13588"},{"referenceType":"HasProperty","target":"ns=1;i=13589"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13588","parentNodeId":"ns=1;i=8414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13589","parentNodeId":"ns=1;i=8414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPressure","dataType":"Double","description":[{"value":"Difference between instantaneous pressure and static pressure."}],"displayName":[{"value":"SoundPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8415","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13594"},{"referenceType":"HasProperty","target":"ns=1;i=13595"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13594","parentNodeId":"ns=1;i=8415","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13595","parentNodeId":"ns=1;i=8415","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPressureLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the square of the sound pressure, p, to the square of a reference value, p0, expressed in decibels."}],"displayName":[{"value":"SoundPressureLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8416","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13600"},{"referenceType":"HasProperty","target":"ns=1;i=13601"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13600","parentNodeId":"ns=1;i=8416","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8416"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13601","parentNodeId":"ns=1;i=8416","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8416"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SpecificSpeed","dataType":"Double","description":[{"value":"Speed that characterizes a pump in terms of its speed, flow rate per impeller eye, i.e. total flow for single-flow impeller, half flow for double-flow impeller, at the best efficiency point and head per stage at maximum impeller diameter"}],"displayName":[{"value":"SpecificSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8417","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13606"},{"referenceType":"HasProperty","target":"ns=1;i=13607"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13606","parentNodeId":"ns=1;i=8417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13607","parentNodeId":"ns=1;i=8417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:StablePumpH_Q_Curve","description":[{"value":"Pump H(Q) curve where the maximum head and shut-off head are coincidental, and the total head declines continuously as the rate of flow increases"}],"displayName":[{"value":"StablePumpH(Q)Curve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5073","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasComponent","target":"ns=1;i=8418"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=8420"},{"referenceType":"HasProperty","target":"ns=1;i=13611"},{"referenceType":"HasComponent","target":"ns=1;i=8423"},{"referenceType":"HasProperty","target":"ns=1;i=8426"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8427"},{"referenceType":"HasComponent","target":"ns=1;i=8430"},{"referenceType":"HasProperty","target":"ns=1;i=8432"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"},{"referenceType":"HasProperty","target":"ns=1;i=8433"},{"referenceType":"HasProperty","target":"ns=1;i=8434"},{"referenceType":"HasComponent","target":"ns=1;i=8435"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8418","parentNodeId":"ns=1;i=5073","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5073"},{"referenceType":"HasProperty","target":"ns=1;i=8419"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8419","parentNodeId":"ns=1;i=8418","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8418"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8420","parentNodeId":"ns=1;i=5073","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5073"},{"referenceType":"HasProperty","target":"ns=1;i=8421"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8422"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8421","parentNodeId":"ns=1;i=8420","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8420"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8422","parentNodeId":"ns=1;i=8420","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8420"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13611","parentNodeId":"ns=1;i=5073","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5073"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8423","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasProperty","target":"ns=1;i=8424"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5073"},{"referenceType":"HasProperty","target":"ns=1;i=8425"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8424","parentNodeId":"ns=1;i=8423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8423"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8425","parentNodeId":"ns=1;i=8423","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8423"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8426","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5073"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8427","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasProperty","target":"ns=1;i=8428"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8429"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5073"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8428","parentNodeId":"ns=1;i=8427","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8427"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8429","parentNodeId":"ns=1;i=8427","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8427"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8430","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasProperty","target":"ns=1;i=8431"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5073"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8431","parentNodeId":"ns=1;i=8430","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8430"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8432","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5073"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8433","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5073"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8434","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5073"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=8435","parentNodeId":"ns=1;i=5073","references":[{"referenceType":"HasProperty","target":"ns=1;i=8436"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5073"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8436","parentNodeId":"ns=1;i=8435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8435"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:StandardGasFlowrate","dataType":"Double","description":[{"value":"Volume flow rate at standard reference conditions, i.e. 0 \u00B0C and 101 325 Pa"}],"displayName":[{"value":"StandardGasFlowrate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8437","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13615"},{"referenceType":"HasProperty","target":"ns=1;i=13616"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13615","parentNodeId":"ns=1;i=8437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8437"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13616","parentNodeId":"ns=1;i=8437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8437"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:StartingPressure","dataType":"Double","description":[{"value":"The starting pressure is the pressure at which a vacuum pump can be switched on and a pumping effect is achieved without damage occurring."}],"displayName":[{"value":"StartingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8438","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13621"},{"referenceType":"HasProperty","target":"ns=1;i=13622"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13621","parentNodeId":"ns=1;i=8438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8438"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13622","parentNodeId":"ns=1;i=8438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8438"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Suction_SpecificSpeed","dataType":"Double","description":[{"value":"Speed that characterizes a pump\u0027s cavitation performance in terms of its speed, optimum rate of flow per impeller eye at best efficiency point and NPSH3 at best efficiency point for the first stage at maximum impeller diameter"}],"displayName":[{"value":"Suction_SpecificSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8439","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13627"},{"referenceType":"HasProperty","target":"ns=1;i=13628"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13627","parentNodeId":"ns=1;i=8439","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8439"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13628","parentNodeId":"ns=1;i=8439","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8439"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SweptVolume","dataType":"Double","description":[{"value":"Volume traversed by a single stroke of piston, plunger or diaphragm."}],"displayName":[{"value":"SweptVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8440","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13633"},{"referenceType":"HasProperty","target":"ns=1;i=13634"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13633","parentNodeId":"ns=1;i=8440","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8440"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13634","parentNodeId":"ns=1;i=8440","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8440"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:TripSpeed","dataType":"Double","description":[{"value":"Speed at which the independent emergency overspeed devices operate to shut down a prime mover"}],"displayName":[{"value":"TripSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8441","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13639"},{"referenceType":"HasProperty","target":"ns=1;i=13640"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13639","parentNodeId":"ns=1;i=8441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8441"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13640","parentNodeId":"ns=1;i=8441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8441"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:TypeNumber","dataType":"Double","description":[{"value":"Pure number calculated at the point of best efficiency"}],"displayName":[{"value":"TypeNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8442","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13644"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13644","parentNodeId":"ns=1;i=8442","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8442"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:VolumeFlowRate","dataType":"Double","description":[{"value":"Volume flow rate of the gas removed by the pump from the gas phase within the evacuated chamber."}],"displayName":[{"value":"VolumeFlowRate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8443","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13648"},{"referenceType":"HasProperty","target":"ns=1;i=13649"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13648","parentNodeId":"ns=1;i=8443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13649","parentNodeId":"ns=1;i=8443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:VolumeFlowRateOfBackingPump","dataType":"Double","description":[{"value":"Maximum volume flow rate for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump"}],"displayName":[{"value":"VolumeFlowRateOfBackingPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8444","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13654"},{"referenceType":"HasProperty","target":"ns=1;i=13655"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13654","parentNodeId":"ns=1;i=8444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13655","parentNodeId":"ns=1;i=8444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WarmUpTimeForAVaporJetPumpOrADiffusionPump","dataType":"Double","description":[{"value":"The warm-up time is the time required to heat the blowing agent in the boiling vessel to its working temperature. The initial temperature can either be equal to the ambient temperature or equal to the temperature at which the blowing agent of the vacuum pump can be exposed to atmospheric air without risk."}],"displayName":[{"value":"WarmUpTimeForAVaporJetPumpOrADiffusionPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8445","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13660"},{"referenceType":"HasProperty","target":"ns=1;i=13661"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13660","parentNodeId":"ns=1;i=8445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13661","parentNodeId":"ns=1;i=8445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WaterVaporTolerableLoad","dataType":"Double","description":[{"value":"The mass flow rate for water vapor, in a gas ballast pump, in continuous operation and under normal ambient conditions, if the pumped gas is pure water vapor."}],"displayName":[{"value":"WaterVaporTolerableLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8446","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13666"},{"referenceType":"HasProperty","target":"ns=1;i=13667"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13666","parentNodeId":"ns=1;i=8446","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8446"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13667","parentNodeId":"ns=1;i=8446","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8446"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WetCriticalSpeed","dataType":"Double","description":[{"value":"Rotor resonant frequency calculated considering the additional support and damping produced by the action of the pumped fluid within rotor"}],"displayName":[{"value":"WetCriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8447","parentNodeId":"ns=1;i=5064","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13672"},{"referenceType":"HasProperty","target":"ns=1;i=13673"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5064"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13672","parentNodeId":"ns=1;i=8447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13673","parentNodeId":"ns=1;i=8447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Implementation","description":[{"value":"Static implementation properties for a pump."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5065","parentNodeId":"ns=1;i=1024","references":[{"referenceType":"HasComponent","target":"ns=1;i=8451"},{"referenceType":"HasComponent","target":"ns=1;i=8452"},{"referenceType":"HasComponent","target":"ns=1;i=8453"},{"referenceType":"HasComponent","target":"ns=1;i=8454"},{"referenceType":"HasComponent","target":"ns=1;i=8455"},{"referenceType":"HasComponent","target":"ns=1;i=8456"},{"referenceType":"HasComponent","target":"ns=1;i=8457"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1024"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1023"},{"referenceType":"HasComponent","target":"ns=1;i=8458"},{"referenceType":"HasComponent","target":"ns=1;i=8459"},{"referenceType":"HasComponent","target":"ns=1;i=8460"},{"referenceType":"HasComponent","target":"ns=1;i=8461"},{"referenceType":"HasComponent","target":"ns=1;i=8464"},{"referenceType":"HasComponent","target":"ns=1;i=8465"},{"referenceType":"HasComponent","target":"ns=1;i=8466"},{"referenceType":"HasComponent","target":"ns=1;i=8467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8468"},{"referenceType":"HasComponent","target":"ns=1;i=8469"},{"referenceType":"HasComponent","target":"ns=1;i=8470"},{"referenceType":"HasComponent","target":"ns=1;i=8471"},{"referenceType":"HasComponent","target":"ns=1;i=8472"},{"referenceType":"HasComponent","target":"ns=1;i=8473"},{"referenceType":"HasComponent","target":"ns=1;i=8474"},{"referenceType":"HasComponent","target":"ns=1;i=8475"},{"referenceType":"HasComponent","target":"ns=1;i=8462"},{"referenceType":"HasComponent","target":"ns=1;i=8463"},{"referenceType":"HasComponent","target":"ns=1;i=8476"},{"referenceType":"HasComponent","target":"ns=1;i=8477"},{"referenceType":"HasComponent","target":"ns=1;i=8478"},{"referenceType":"HasComponent","target":"ns=1;i=8479"},{"referenceType":"HasComponent","target":"ns=1;i=8480"},{"referenceType":"HasComponent","target":"ns=1;i=8481"},{"referenceType":"HasComponent","target":"ns=1;i=8482"},{"referenceType":"HasComponent","target":"ns=1;i=8483"}],"typeDefinition":"ns=1;i=1023"},{"accessLevel":3,"browseName":"1:AtmosphericPressure","dataType":"Double","description":[{"value":"Mean absolute pressure of the atmosphere measured at the place of installation (2.1.1.3) of the pump"}],"displayName":[{"value":"AtmosphericPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8451","parentNodeId":"ns=1;i=5065","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8484"},{"referenceType":"HasProperty","target":"ns=1;i=8486"},{"referenceType":"HasProperty","target":"ns=1;i=8485"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8484","parentNodeId":"ns=1;i=8451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8486","parentNodeId":"ns=1;i=8451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8485","parentNodeId":"ns=1;i=8451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Density","dataType":"Double","description":[{"value":"Volumetric mass at a stated temperature"}],"displayName":[{"value":"Density"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8452","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8487"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasProperty","target":"ns=1;i=8489"},{"referenceType":"HasProperty","target":"ns=1;i=8488"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8487","parentNodeId":"ns=1;i=8452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8489","parentNodeId":"ns=1;i=8452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4934993\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/m\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per cubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8488","parentNodeId":"ns=1;i=8452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DynamicViscosity","dataType":"Double","description":[{"value":"Ratio of the shear stress to the shear velocity acting in a liquid subjected to a plane shear motion"}],"displayName":[{"value":"DynamicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8453","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8490"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasProperty","target":"ns=1;i=8492"},{"referenceType":"HasProperty","target":"ns=1;i=8491"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8490","parentNodeId":"ns=1;i=8453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8492","parentNodeId":"ns=1;i=8453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4404789\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8491","parentNodeId":"ns=1;i=8453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheInletManometer","dataType":"Double","description":[{"value":"Height of the zero or center position of the inlet manometer, or other point as defined by the manometer calibration"}],"displayName":[{"value":"HeightOfTheInletManometer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8454","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8493"},{"referenceType":"HasProperty","target":"ns=1;i=8495"},{"referenceType":"HasProperty","target":"ns=1;i=8494"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8493","parentNodeId":"ns=1;i=8454","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8454"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8495","parentNodeId":"ns=1;i=8454","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8454"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8494","parentNodeId":"ns=1;i=8454","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8454"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheNpshDatumPlane","dataType":"Double","description":[{"value":"Difference between the NPSH datum plane and the reference plane"}],"displayName":[{"value":"HeightOfTheNpshDatumPlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8455","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8496"},{"referenceType":"HasProperty","target":"ns=1;i=8498"},{"referenceType":"HasProperty","target":"ns=1;i=8497"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8496","parentNodeId":"ns=1;i=8455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8498","parentNodeId":"ns=1;i=8455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8497","parentNodeId":"ns=1;i=8455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletManometer","dataType":"Double","description":[{"value":"Height of the zero or center position of the outlet manometer, or other point as defined by the manometer calibration"}],"displayName":[{"value":"HeightOfTheOutletManometer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8456","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8499"},{"referenceType":"HasProperty","target":"ns=1;i=8501"},{"referenceType":"HasProperty","target":"ns=1;i=8500"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8499","parentNodeId":"ns=1;i=8456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8501","parentNodeId":"ns=1;i=8456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8500","parentNodeId":"ns=1;i=8456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HydraulicEfficiency","dataType":"Double","description":[{"value":"Proportion of pump available power input, Pa, which is delivered as pump power output, Pu, after satisfying the losses resulting from friction due to the relative motion of internal surfaces and internal leakage"}],"displayName":[{"value":"HydraulicEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8457","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8502"},{"referenceType":"HasProperty","target":"ns=1;i=8504"},{"referenceType":"HasProperty","target":"ns=1;i=8503"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8502","parentNodeId":"ns=1;i=8457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8504","parentNodeId":"ns=1;i=8457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8503","parentNodeId":"ns=1;i=8457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:InstallationTotalHead","dataType":"Double","description":[{"value":"Difference between the total head at the outlet side of the installation and the total head at the inlet side of the installation"}],"displayName":[{"value":"InstallationTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8458","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8505"},{"referenceType":"HasProperty","target":"ns=1;i=8507"},{"referenceType":"HasProperty","target":"ns=1;i=8506"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8505","parentNodeId":"ns=1;i=8458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8458"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8507","parentNodeId":"ns=1;i=8458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8458"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8506","parentNodeId":"ns=1;i=8458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8458"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:KinematicViscosity","dataType":"Double","description":[{"value":"Ratio of the dynamic viscosity to the density of the pumped liquid"}],"displayName":[{"value":"KinematicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8459","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8508"},{"referenceType":"HasProperty","target":"ns=1;i=8510"},{"referenceType":"HasProperty","target":"ns=1;i=8509"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8508","parentNodeId":"ns=1;i=8459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8510","parentNodeId":"ns=1;i=8459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E21300\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8509","parentNodeId":"ns=1;i=8459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumAllowableFlow","dataType":"Double","description":[{"value":"Greatest rate of flow that the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied"}],"displayName":[{"value":"MaximumAllowableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8460","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8511"},{"referenceType":"HasProperty","target":"ns=1;i=8513"},{"referenceType":"HasProperty","target":"ns=1;i=8512"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8511","parentNodeId":"ns=1;i=8460","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8460"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8513","parentNodeId":"ns=1;i=8460","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8460"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8512","parentNodeId":"ns=1;i=8460","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8460"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumDynamicSealingPressure","dataType":"Double","description":[{"value":"Highest pressure expected at the shaft seals during any specified operating condition and during startup and shutdown"}],"displayName":[{"value":"MaximumDynamicSealingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8461","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8514"},{"referenceType":"HasProperty","target":"ns=1;i=8516"},{"referenceType":"HasProperty","target":"ns=1;i=8515"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8514","parentNodeId":"ns=1;i=8461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8516","parentNodeId":"ns=1;i=8461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8515","parentNodeId":"ns=1;i=8461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MechanicalEfficiency","dataType":"Double","description":[{"value":"Proportion of the pump power input, P, available after satisfying the mechanical power losses, PJ,ab, at given operating conditions"}],"displayName":[{"value":"MechanicalEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8464","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8523"},{"referenceType":"HasProperty","target":"ns=1;i=8525"},{"referenceType":"HasProperty","target":"ns=1;i=8524"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8523","parentNodeId":"ns=1;i=8464","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8525","parentNodeId":"ns=1;i=8464","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8524","parentNodeId":"ns=1;i=8464","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAllowableFlow","dataType":"Double","description":[{"value":"Smallest rate of flow that the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied"}],"displayName":[{"value":"MinimumAllowableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8465","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8526"},{"referenceType":"HasProperty","target":"ns=1;i=8528"},{"referenceType":"HasProperty","target":"ns=1;i=8527"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8526","parentNodeId":"ns=1;i=8465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8528","parentNodeId":"ns=1;i=8465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8527","parentNodeId":"ns=1;i=8465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAllowableStableFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without exceeding the noise and vibration limits imposed in the order"}],"displayName":[{"value":"MinimumAllowableStableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8466","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8529"},{"referenceType":"HasProperty","target":"ns=1;i=8531"},{"referenceType":"HasProperty","target":"ns=1;i=8530"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8529","parentNodeId":"ns=1;i=8466","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8466"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8531","parentNodeId":"ns=1;i=8466","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8466"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8530","parentNodeId":"ns=1;i=8466","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8466"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NetPositiveSuctionHeadAvailable","dataType":"Double","description":[{"value":"Minimum NPSH available at the inlet area of the pump as determined by the conditions of the installation for a specified rate of flow"}],"displayName":[{"value":"NetPositiveSuctionHeadAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8467","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8532"},{"referenceType":"HasProperty","target":"ns=1;i=8534"},{"referenceType":"HasProperty","target":"ns=1;i=8533"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8532","parentNodeId":"ns=1;i=8467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8534","parentNodeId":"ns=1;i=8467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8533","parentNodeId":"ns=1;i=8467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OverallEfficiency","dataType":"Double","description":[{"value":"Proportion of the driver power input, Pmot, delivered as pump power output, Pu"}],"displayName":[{"value":"OverallEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8468","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8535"},{"referenceType":"HasProperty","target":"ns=1;i=8537"},{"referenceType":"HasProperty","target":"ns=1;i=8536"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8535","parentNodeId":"ns=1;i=8468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8537","parentNodeId":"ns=1;i=8468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8536","parentNodeId":"ns=1;i=8468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpBestEfficiency","dataType":"Double","description":[{"value":"Greatest value of pump efficiency obtained at given operating conditions"}],"displayName":[{"value":"PumpBestEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8469","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8538"},{"referenceType":"HasProperty","target":"ns=1;i=8540"},{"referenceType":"HasProperty","target":"ns=1;i=8539"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8538","parentNodeId":"ns=1;i=8469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8540","parentNodeId":"ns=1;i=8469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8539","parentNodeId":"ns=1;i=8469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpEfficiency","dataType":"Double","description":[{"value":"Proportion of the pump power input, P, delivered as pump power output, Pu, at given operating conditions"}],"displayName":[{"value":"PumpEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8470","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8541"},{"referenceType":"HasProperty","target":"ns=1;i=8543"},{"referenceType":"HasProperty","target":"ns=1;i=8542"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8541","parentNodeId":"ns=1;i=8470","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8470"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8543","parentNodeId":"ns=1;i=8470","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8470"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8542","parentNodeId":"ns=1;i=8470","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8470"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpMechanicalPowerLosses","dataType":"Double","description":[{"value":"Power absorbed by friction in bearings and shaft seal at given operating conditions of the pump"}],"displayName":[{"value":"PumpMechanicalPowerLosses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8471","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8544"},{"referenceType":"HasProperty","target":"ns=1;i=8546"},{"referenceType":"HasProperty","target":"ns=1;i=8545"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8544","parentNodeId":"ns=1;i=8471","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8471"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8546","parentNodeId":"ns=1;i=8471","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8471"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8545","parentNodeId":"ns=1;i=8471","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8471"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpRatedPowerInput","dataType":"Double","description":[{"value":"Power required by the pump at the rated conditions"}],"displayName":[{"value":"PumpRatedPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8472","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8547"},{"referenceType":"HasProperty","target":"ns=1;i=8549"},{"referenceType":"HasProperty","target":"ns=1;i=8548"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8547","parentNodeId":"ns=1;i=8472","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8472"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8549","parentNodeId":"ns=1;i=8472","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8472"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8548","parentNodeId":"ns=1;i=8472","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8472"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpTotalHead","dataType":"Double","description":[{"value":"Difference between the total head at the outlet side of the pump and the total head at the inlet side of the pump"}],"displayName":[{"value":"PumpTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8473","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8550"},{"referenceType":"HasProperty","target":"ns=1;i=8552"},{"referenceType":"HasProperty","target":"ns=1;i=8551"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8550","parentNodeId":"ns=1;i=8473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8473"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8552","parentNodeId":"ns=1;i=8473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8473"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8551","parentNodeId":"ns=1;i=8473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8473"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedDifferentialPressure","dataType":"Double","description":[{"value":"Differential pressure for the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedDifferentialPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8474","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8553"},{"referenceType":"HasProperty","target":"ns=1;i=8555"},{"referenceType":"HasProperty","target":"ns=1;i=8554"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8553","parentNodeId":"ns=1;i=8474","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8474"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8555","parentNodeId":"ns=1;i=8474","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8474"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8554","parentNodeId":"ns=1;i=8474","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8474"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedFlow","dataType":"Double","description":[{"value":"Rate of flow at the guarantee point"}],"displayName":[{"value":"RatedFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8475","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8556"},{"referenceType":"HasProperty","target":"ns=1;i=8558"},{"referenceType":"HasProperty","target":"ns=1;i=8557"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8556","parentNodeId":"ns=1;i=8475","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8475"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8558","parentNodeId":"ns=1;i=8475","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8475"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8557","parentNodeId":"ns=1;i=8475","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8475"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedMeanVelocityAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Rated flow at the inlet area of the installation divided by the inlet area of the installation"}],"displayName":[{"value":"RatedMeanVelocityAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8462","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8517"},{"referenceType":"HasProperty","target":"ns=1;i=8519"},{"referenceType":"HasProperty","target":"ns=1;i=8518"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8517","parentNodeId":"ns=1;i=8462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8519","parentNodeId":"ns=1;i=8462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8518","parentNodeId":"ns=1;i=8462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedMeanVelocityAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Rated flow at the outlet area of the installation divided by the inlet area of the installation"}],"displayName":[{"value":"RatedMeanVelocityAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8463","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8520"},{"referenceType":"HasProperty","target":"ns=1;i=8522"},{"referenceType":"HasProperty","target":"ns=1;i=8521"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8520","parentNodeId":"ns=1;i=8463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8522","parentNodeId":"ns=1;i=8463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8521","parentNodeId":"ns=1;i=8463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Number of revolutions of the pump in a given time required to meet the rated conditions"}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8476","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8559"},{"referenceType":"HasProperty","target":"ns=1;i=8561"},{"referenceType":"HasProperty","target":"ns=1;i=8560"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8559","parentNodeId":"ns=1;i=8476","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8476"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8561","parentNodeId":"ns=1;i=8476","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8476"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8560","parentNodeId":"ns=1;i=8476","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8476"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Head observed at inlet area of the installation, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8477","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8562"},{"referenceType":"HasProperty","target":"ns=1;i=8564"},{"referenceType":"HasProperty","target":"ns=1;i=8563"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8562","parentNodeId":"ns=1;i=8477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8564","parentNodeId":"ns=1;i=8477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8563","parentNodeId":"ns=1;i=8477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Head observed at outlet area of the installation, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8478","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8565"},{"referenceType":"HasProperty","target":"ns=1;i=8567"},{"referenceType":"HasProperty","target":"ns=1;i=8566"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8565","parentNodeId":"ns=1;i=8478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8567","parentNodeId":"ns=1;i=8478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8566","parentNodeId":"ns=1;i=8478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:UsefulLife","dataType":"Double","description":[{"value":"Time interval from first use until the instant when a limiting state is reached"}],"displayName":[{"value":"UsefulLife"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8479","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8568"},{"referenceType":"HasProperty","target":"ns=1;i=8570"},{"referenceType":"HasProperty","target":"ns=1;i=8569"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8568","parentNodeId":"ns=1;i=8479","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8479"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8570","parentNodeId":"ns=1;i=8479","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8479"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8569","parentNodeId":"ns=1;i=8479","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8479"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ValveSeatVelocity","dataType":"Double","description":[{"value":"Mean velocity of the flow through the valve seat at the specified operating conditions"}],"displayName":[{"value":"ValveSeatVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8480","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8571"},{"referenceType":"HasProperty","target":"ns=1;i=8573"},{"referenceType":"HasProperty","target":"ns=1;i=8572"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8571","parentNodeId":"ns=1;i=8480","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8480"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8573","parentNodeId":"ns=1;i=8480","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8480"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8572","parentNodeId":"ns=1;i=8480","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8480"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ValveSpillVelocity","dataType":"Double","description":[{"value":"Mean velocity of the flow through the valve spill area"}],"displayName":[{"value":"ValveSpillVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8481","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8574"},{"referenceType":"HasProperty","target":"ns=1;i=8576"},{"referenceType":"HasProperty","target":"ns=1;i=8575"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8574","parentNodeId":"ns=1;i=8481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8481"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8576","parentNodeId":"ns=1;i=8481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8481"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8575","parentNodeId":"ns=1;i=8481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8481"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:VaporPressureOfThePumpedLiquid","dataType":"Double","description":[{"value":"Absolute pressure at which the fluid vaporizes corresponding to the temperature of the liquid"}],"displayName":[{"value":"VaporPressureOfThePumpedLiquid"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8482","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8577"},{"referenceType":"HasProperty","target":"ns=1;i=8579"},{"referenceType":"HasProperty","target":"ns=1;i=8578"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8577","parentNodeId":"ns=1;i=8482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8482"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8579","parentNodeId":"ns=1;i=8482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8482"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8578","parentNodeId":"ns=1;i=8482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8482"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:VolumetricEfficiency","dataType":"Double","description":[{"value":"Ratio of the actual delivered volume at maximum pressure to the geometric displacement volume"}],"displayName":[{"value":"VolumetricEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8483","parentNodeId":"ns=1;i=5065","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8580"},{"referenceType":"HasProperty","target":"ns=1;i=8582"},{"referenceType":"HasProperty","target":"ns=1;i=8581"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5065"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8580","parentNodeId":"ns=1;i=8483","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8483"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8582","parentNodeId":"ns=1;i=8483","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8483"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8581","parentNodeId":"ns=1;i=8483","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8483"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SystemRequirements","description":[{"value":"Static system requirement properties for a pump."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5066","parentNodeId":"ns=1;i=1024","references":[{"referenceType":"HasComponent","target":"ns=1;i=8583"},{"referenceType":"HasComponent","target":"ns=1;i=8584"},{"referenceType":"HasComponent","target":"ns=1;i=8585"},{"referenceType":"HasComponent","target":"ns=1;i=8586"},{"referenceType":"HasComponent","target":"ns=1;i=8587"},{"referenceType":"HasComponent","target":"ns=1;i=8588"},{"referenceType":"HasComponent","target":"ns=1;i=8589"},{"referenceType":"HasComponent","target":"ns=1;i=8590"},{"referenceType":"HasComponent","target":"ns=1;i=8591"},{"referenceType":"HasComponent","target":"ns=1;i=8592"},{"referenceType":"HasComponent","target":"ns=1;i=8593"},{"referenceType":"HasComponent","target":"ns=1;i=8594"},{"referenceType":"HasComponent","target":"ns=1;i=8595"},{"referenceType":"HasComponent","target":"ns=1;i=8596"},{"referenceType":"HasComponent","target":"ns=1;i=8597"},{"referenceType":"HasComponent","target":"ns=1;i=8598"},{"referenceType":"HasComponent","target":"ns=1;i=8599"},{"referenceType":"HasComponent","target":"ns=1;i=8600"},{"referenceType":"HasComponent","target":"ns=1;i=8601"},{"referenceType":"HasComponent","target":"ns=1;i=8602"},{"referenceType":"HasComponent","target":"ns=1;i=8603"},{"referenceType":"HasComponent","target":"ns=1;i=8604"},{"referenceType":"HasComponent","target":"ns=1;i=8605"},{"referenceType":"HasComponent","target":"ns=1;i=8606"},{"referenceType":"HasComponent","target":"ns=1;i=8609"},{"referenceType":"HasComponent","target":"ns=1;i=8610"},{"referenceType":"HasComponent","target":"ns=1;i=8611"},{"referenceType":"HasComponent","target":"ns=1;i=8612"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=8613"},{"referenceType":"HasComponent","target":"ns=1;i=8614"},{"referenceType":"HasComponent","target":"ns=1;i=8615"},{"referenceType":"HasComponent","target":"ns=1;i=8616"},{"referenceType":"HasComponent","target":"ns=1;i=8617"},{"referenceType":"HasComponent","target":"ns=1;i=8618"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1024"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1022"},{"referenceType":"HasComponent","target":"ns=1;i=8619"},{"referenceType":"HasComponent","target":"ns=1;i=8620"},{"referenceType":"HasComponent","target":"ns=1;i=8621"}],"typeDefinition":"ns=1;i=1022"},{"accessLevel":3,"browseName":"1:CompressionRatio","dataType":"Double","description":[{"value":"Ratio of the backing pressure, p3, to the inlet pressure, p1, of the vacuum pump without throughput"}],"displayName":[{"value":"CompressionRatio"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8583","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasProperty","target":"ns=1;i=8622"},{"referenceType":"HasProperty","target":"ns=1;i=8624"},{"referenceType":"HasProperty","target":"ns=1;i=8623"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8622","parentNodeId":"ns=1;i=8583","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8583"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8624","parentNodeId":"ns=1;i=8583","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8583"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8623","parentNodeId":"ns=1;i=8583","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8583"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExplosionZone","dataType":"ExplosionZoneOptionSet","description":[{"value":"Categories of explosion zones for devices according to 2014/34/EU (ATEX)."}],"displayName":[{"value":"ExplosionZone"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8584","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8625"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8625","parentNodeId":"ns=1;i=8584","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8584"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Fieldbus","dataType":"FieldbusEnum","description":[{"value":"Selected fieldbus for the product"}],"displayName":[{"value":"Fieldbus"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8585","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8626"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8626","parentNodeId":"ns=1;i=8585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Fluid","dataType":"String","description":[{"value":"Fluid that is handled by the pump at specified operating conditions"}],"displayName":[{"value":"Fluid"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8586","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8627"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8627","parentNodeId":"ns=1;i=8586","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8586"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:GasContent","dataType":"Double","description":[{"value":"Proportion of gaseous substance in the liquid to be pumped, either as a contaminant or as vapor from the main body of liquid"}],"displayName":[{"value":"GasContent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8587","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8628"},{"referenceType":"HasProperty","target":"ns=1;i=8630"},{"referenceType":"HasProperty","target":"ns=1;i=8629"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8628","parentNodeId":"ns=1;i=8587","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8587"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8630","parentNodeId":"ns=1;i=8587","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8587"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8629","parentNodeId":"ns=1;i=8587","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8587"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheInletSideOfTheInstallation","dataType":"Double","description":[{"value":"Height of the fluid level on the inlet side of the installation, or in the center of the inlet manifold"}],"displayName":[{"value":"HeightOfTheInletSideOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8588","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8631"},{"referenceType":"HasProperty","target":"ns=1;i=8633"},{"referenceType":"HasProperty","target":"ns=1;i=8632"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8631","parentNodeId":"ns=1;i=8588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8588"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8633","parentNodeId":"ns=1;i=8588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8588"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8632","parentNodeId":"ns=1;i=8588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8588"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletSideOfTheInstallation","dataType":"Double","description":[{"value":"Height of the fluid level on the outlet side of the installation or in the center of the outlet manifold"}],"displayName":[{"value":"HeightOfTheOutletSideOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8589","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8634"},{"referenceType":"HasProperty","target":"ns=1;i=8636"},{"referenceType":"HasProperty","target":"ns=1;i=8635"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8634","parentNodeId":"ns=1;i=8589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8636","parentNodeId":"ns=1;i=8589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8635","parentNodeId":"ns=1;i=8589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfThePump","dataType":"Double","description":[{"value":"Height of the center of the pump"}],"displayName":[{"value":"HeightOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8590","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8637"},{"referenceType":"HasProperty","target":"ns=1;i=8639"},{"referenceType":"HasProperty","target":"ns=1;i=8638"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8637","parentNodeId":"ns=1;i=8590","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8590"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8639","parentNodeId":"ns=1;i=8590","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8590"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8638","parentNodeId":"ns=1;i=8590","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8590"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumAmbientTemperature","dataType":"Double","description":[{"value":"Highest ambient temperature to be expected under normal circumstances"}],"displayName":[{"value":"MaximumAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8591","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8640"},{"referenceType":"HasProperty","target":"ns=1;i=8642"},{"referenceType":"HasProperty","target":"ns=1;i=8641"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8640","parentNodeId":"ns=1;i=8591","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8591"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8642","parentNodeId":"ns=1;i=8591","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8591"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8641","parentNodeId":"ns=1;i=8591","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8591"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumFlow","dataType":"Double","description":[{"value":"Greatest rate of flow which is expected at operating conditions"}],"displayName":[{"value":"MaximumFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8592","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8643"},{"referenceType":"HasProperty","target":"ns=1;i=8645"},{"referenceType":"HasProperty","target":"ns=1;i=8644"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8643","parentNodeId":"ns=1;i=8592","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8592"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8645","parentNodeId":"ns=1;i=8592","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8592"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8644","parentNodeId":"ns=1;i=8592","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8592"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumHead","dataType":"Double","description":[{"value":"Highest total head developed by a pump at any rate of flow"}],"displayName":[{"value":"MaximumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8593","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8646"},{"referenceType":"HasProperty","target":"ns=1;i=8648"},{"referenceType":"HasProperty","target":"ns=1;i=8647"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8646","parentNodeId":"ns=1;i=8593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8648","parentNodeId":"ns=1;i=8593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8647","parentNodeId":"ns=1;i=8593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumInletPressure","dataType":"Double","description":[{"value":"Highest inlet pressure to which the pump is subjected during operation"}],"displayName":[{"value":"MaximumInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8594","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8649"},{"referenceType":"HasProperty","target":"ns=1;i=8651"},{"referenceType":"HasProperty","target":"ns=1;i=8650"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8649","parentNodeId":"ns=1;i=8594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8651","parentNodeId":"ns=1;i=8594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8650","parentNodeId":"ns=1;i=8594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumOutletPressure","dataType":"Double","description":[{"value":"Maximum possible pressure at outlet, due either to internal energy increase (rotodynamic pumps) or external downstream restrictions (volumetric pumps)"}],"displayName":[{"value":"MaximumOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8595","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8652"},{"referenceType":"HasProperty","target":"ns=1;i=8654"},{"referenceType":"HasProperty","target":"ns=1;i=8653"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8652","parentNodeId":"ns=1;i=8595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8654","parentNodeId":"ns=1;i=8595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8653","parentNodeId":"ns=1;i=8595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumRelativeHumidity","dataType":"Double","description":[{"value":"Highest relative humidity that can be expected under normal circumstances."}],"displayName":[{"value":"MaximumRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8596","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8655"},{"referenceType":"HasProperty","target":"ns=1;i=8657"},{"referenceType":"HasProperty","target":"ns=1;i=8656"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8655","parentNodeId":"ns=1;i=8596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8657","parentNodeId":"ns=1;i=8596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8656","parentNodeId":"ns=1;i=8596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumTemperature","dataType":"Double","description":[{"value":"Highest fluid temperature to be expected under operating conditions"}],"displayName":[{"value":"MaximumTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8597","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8658"},{"referenceType":"HasProperty","target":"ns=1;i=8660"},{"referenceType":"HasProperty","target":"ns=1;i=8659"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8658","parentNodeId":"ns=1;i=8597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8660","parentNodeId":"ns=1;i=8597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8659","parentNodeId":"ns=1;i=8597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanTimeBetweenFailures","dataType":"Double","description":[{"value":"Average of the times between failures"}],"displayName":[{"value":"MeanTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8598","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8661"},{"referenceType":"HasProperty","target":"ns=1;i=8663"},{"referenceType":"HasProperty","target":"ns=1;i=8662"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8661","parentNodeId":"ns=1;i=8598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8663","parentNodeId":"ns=1;i=8598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8662","parentNodeId":"ns=1;i=8598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAmbientTemperature","dataType":"Double","description":[{"value":"Lowest ambient temperature to be expected under normal circumstances"}],"displayName":[{"value":"MinimumAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8599","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8664"},{"referenceType":"HasProperty","target":"ns=1;i=8666"},{"referenceType":"HasProperty","target":"ns=1;i=8665"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8664","parentNodeId":"ns=1;i=8599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8666","parentNodeId":"ns=1;i=8599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8665","parentNodeId":"ns=1;i=8599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumFlow","dataType":"Double","description":[{"value":"Smallest rate of flow which is expected at operating conditions"}],"displayName":[{"value":"MinimumFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8600","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8667"},{"referenceType":"HasProperty","target":"ns=1;i=8669"},{"referenceType":"HasProperty","target":"ns=1;i=8668"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8667","parentNodeId":"ns=1;i=8600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8669","parentNodeId":"ns=1;i=8600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8668","parentNodeId":"ns=1;i=8600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumHead","dataType":"Double","description":[{"value":"Smallest total head developed by a pump at any rate of flow"}],"displayName":[{"value":"MinimumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8601","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8670"},{"referenceType":"HasProperty","target":"ns=1;i=8672"},{"referenceType":"HasProperty","target":"ns=1;i=8671"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8670","parentNodeId":"ns=1;i=8601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8672","parentNodeId":"ns=1;i=8601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8671","parentNodeId":"ns=1;i=8601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumInletPressure","dataType":"Double","description":[{"value":"Lowest inlet pressure that can occur during operation for the pump"}],"displayName":[{"value":"MinimumInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8602","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8673"},{"referenceType":"HasProperty","target":"ns=1;i=8675"},{"referenceType":"HasProperty","target":"ns=1;i=8674"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8673","parentNodeId":"ns=1;i=8602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8675","parentNodeId":"ns=1;i=8602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8674","parentNodeId":"ns=1;i=8602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumOutletPressure","dataType":"Double","description":[{"value":"Lowest outlet pressure that can occur during operation for the pump"}],"displayName":[{"value":"MinimumOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8603","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8676"},{"referenceType":"HasProperty","target":"ns=1;i=8678"},{"referenceType":"HasProperty","target":"ns=1;i=8677"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8676","parentNodeId":"ns=1;i=8603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8678","parentNodeId":"ns=1;i=8603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8677","parentNodeId":"ns=1;i=8603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumRelativeHumidity","dataType":"Double","description":[{"value":"Lowest relative humidity to be expected under normal circumstances."}],"displayName":[{"value":"MinimumRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8604","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8679"},{"referenceType":"HasProperty","target":"ns=1;i=8681"},{"referenceType":"HasProperty","target":"ns=1;i=8680"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8679","parentNodeId":"ns=1;i=8604","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8681","parentNodeId":"ns=1;i=8604","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8680","parentNodeId":"ns=1;i=8604","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumTemperature","dataType":"Double","description":[{"value":"Lowest fluid temperature to be expected under operating conditions"}],"displayName":[{"value":"MinimumTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8605","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8682"},{"referenceType":"HasProperty","target":"ns=1;i=8684"},{"referenceType":"HasProperty","target":"ns=1;i=8683"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8682","parentNodeId":"ns=1;i=8605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8605"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8684","parentNodeId":"ns=1;i=8605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8605"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8683","parentNodeId":"ns=1;i=8605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8605"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Multi_Phase","dataType":"Boolean","description":[{"value":"Comprising a fluid together with substances in solid or gaseous states, whether due to deliberate addition or a change of state caused by a change in conditions. A \u0022True\u0022 status means that there is a possibility of multi-phase-fluid and a \u0022False\u0022 status means that there is no possibility of multi-phase-fluid."}],"displayName":[{"value":"Multi_Phase"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8606","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasProperty","target":"ns=1;i=8685"},{"referenceType":"HasProperty","target":"ns=1;i=8607"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=8608"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8685","parentNodeId":"ns=1;i=8606","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8606"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8607","parentNodeId":"ns=1;i=8606","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8606"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8608","parentNodeId":"ns=1;i=8606","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8606"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NetPositiveInletPressureAvailable","dataType":"Double","description":[{"value":"Total pressure (including velocity pressure) at the pump inlet connection less the liquid vapor pressure at the present temperature of the liquid"}],"displayName":[{"value":"NetPositiveInletPressureAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8609","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8686"},{"referenceType":"HasProperty","target":"ns=1;i=8688"},{"referenceType":"HasProperty","target":"ns=1;i=8687"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8686","parentNodeId":"ns=1;i=8609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8609"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8688","parentNodeId":"ns=1;i=8609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8609"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8687","parentNodeId":"ns=1;i=8609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8609"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NormalFlow","dataType":"Double","description":[{"value":"Rate of flow at which usual operation is expected"}],"displayName":[{"value":"NormalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8610","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8689"},{"referenceType":"HasProperty","target":"ns=1;i=8691"},{"referenceType":"HasProperty","target":"ns=1;i=8690"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8689","parentNodeId":"ns=1;i=8610","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8610"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8691","parentNodeId":"ns=1;i=8610","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8610"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8690","parentNodeId":"ns=1;i=8610","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8610"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NpshDatumPlane","dataType":"Double","description":[{"value":"Horizontal plane through the center of the circle described by the external points of the entrance edges of the impeller blades, in the first stage in the case of multi-stage pumps"}],"displayName":[{"value":"NpshDatumPlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8611","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8692"},{"referenceType":"HasProperty","target":"ns=1;i=8694"},{"referenceType":"HasProperty","target":"ns=1;i=8693"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8692","parentNodeId":"ns=1;i=8611","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8611"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8694","parentNodeId":"ns=1;i=8611","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8611"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8693","parentNodeId":"ns=1;i=8611","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8611"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OperatingMode","dataType":"OperatingModeEnum","description":[{"value":"Specifies whether the pump is to be operated in single, parallel or series connection."}],"displayName":[{"value":"OperatingMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8612","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8695"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8695","parentNodeId":"ns=1;i=8612","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8612"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Inlet pressure of the installation for the working conditions"}],"displayName":[{"value":"RatedInletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8613","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8696"},{"referenceType":"HasProperty","target":"ns=1;i=8698"},{"referenceType":"HasProperty","target":"ns=1;i=8697"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8696","parentNodeId":"ns=1;i=8613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8698","parentNodeId":"ns=1;i=8613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8697","parentNodeId":"ns=1;i=8613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedPumpUnitTotalHead","dataType":"Double","description":[{"value":"Difference of the total head, at the outlet side of the pump unit from the total head at the inlet side of the pump unit, at which usual operation is expected"}],"displayName":[{"value":"RatedPumpUnitTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8614","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8699"},{"referenceType":"HasProperty","target":"ns=1;i=8701"},{"referenceType":"HasProperty","target":"ns=1;i=8700"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8699","parentNodeId":"ns=1;i=8614","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8614"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8701","parentNodeId":"ns=1;i=8614","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8614"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8700","parentNodeId":"ns=1;i=8614","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8614"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ReferencePlane","dataType":"Double","description":[{"value":"Any horizontal plane for use as the datum for height measurement"}],"displayName":[{"value":"ReferencePlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8615","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8702"},{"referenceType":"HasProperty","target":"ns=1;i=8704"},{"referenceType":"HasProperty","target":"ns=1;i=8703"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8702","parentNodeId":"ns=1;i=8615","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8615"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8704","parentNodeId":"ns=1;i=8615","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8615"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8703","parentNodeId":"ns=1;i=8615","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8615"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RequiredControlMode","dataType":"ControlModeEnum","description":[{"value":"Specifies which control mode is to be used for the use case."}],"displayName":[{"value":"RequiredControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8616","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8705"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8705","parentNodeId":"ns=1;i=8616","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8616"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RequiredTime","dataType":"Double","description":[{"value":"Time interval throughout which an item is required to be in an up state"}],"displayName":[{"value":"RequiredTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8617","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8706"},{"referenceType":"HasProperty","target":"ns=1;i=8708"},{"referenceType":"HasProperty","target":"ns=1;i=8707"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8706","parentNodeId":"ns=1;i=8617","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8617"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8708","parentNodeId":"ns=1;i=8617","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8617"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8707","parentNodeId":"ns=1;i=8617","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8617"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SolidContent","dataType":"Double","description":[{"value":"Proportion of solids contained in the fluid to be pumped, either as a contaminant or as a deliberate useful burden or suspension"}],"displayName":[{"value":"SolidContent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8618","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8709"},{"referenceType":"HasProperty","target":"ns=1;i=8711"},{"referenceType":"HasProperty","target":"ns=1;i=8710"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8709","parentNodeId":"ns=1;i=8618","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8618"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8711","parentNodeId":"ns=1;i=8618","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8618"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8710","parentNodeId":"ns=1;i=8618","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8618"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Throughput","dataType":"Double","description":[{"value":"Amount of fluid flowing through a duct"}],"displayName":[{"value":"Throughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8619","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8712"},{"referenceType":"HasProperty","target":"ns=1;i=8714"},{"referenceType":"HasProperty","target":"ns=1;i=8713"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8712","parentNodeId":"ns=1;i=8619","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8619"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8714","parentNodeId":"ns=1;i=8619","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8619"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8713","parentNodeId":"ns=1;i=8619","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8619"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:UltimatePressureOfAVacuumPump","dataType":"Double","description":[{"value":"The ultimate pressure is the value to which the pressure in a standardized test dome approaches asymptotically during normal operation of the vacuum pump and without gas inlet. A difference can be made between the final pressure caused by gases and the final pressure caused by gases and vapors."}],"displayName":[{"value":"UltimatePressureOfAVacuumPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8620","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8715"},{"referenceType":"HasProperty","target":"ns=1;i=8717"},{"referenceType":"HasProperty","target":"ns=1;i=8716"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8715","parentNodeId":"ns=1;i=8620","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8620"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8717","parentNodeId":"ns=1;i=8620","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8620"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8716","parentNodeId":"ns=1;i=8620","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8620"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:WorkingTemperature","dataType":"Double","description":[{"value":"Temperature determined by the given application and fluid."}],"displayName":[{"value":"WorkingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8621","parentNodeId":"ns=1;i=5066","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8718"},{"referenceType":"HasProperty","target":"ns=1;i=8720"},{"referenceType":"HasProperty","target":"ns=1;i=8719"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5066"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8718","parentNodeId":"ns=1;i=8621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8720","parentNodeId":"ns=1;i=8621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8719","parentNodeId":"ns=1;i=8621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ConnectionDesignType","displayName":[{"value":"ConnectionDesignType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.40","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1040","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9275"}],"superType":"ns=3;i=1005"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9275","parentNodeId":"ns=1;i=1040","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9276"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1040"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9276","parentNodeId":"ns=1;i=9275","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9275"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletConnectionDesignType","displayName":[{"value":"InletConnectionDesignType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.41","nodeClass":"ObjectType","nodeId":"ns=1;i=1041","references":[{"referenceType":"HasComponent","target":"ns=1;i=9305"},{"referenceType":"HasComponent","target":"ns=1;i=9309"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1040"},{"referenceType":"HasComponent","target":"ns=1;i=9310"},{"referenceType":"HasComponent","target":"ns=1;i=9311"},{"referenceType":"HasComponent","target":"ns=1;i=9312"},{"referenceType":"HasComponent","target":"ns=1;i=9313"},{"referenceType":"HasComponent","target":"ns=1;i=9314"},{"referenceType":"HasComponent","target":"ns=1;i=9315"}],"superType":"ns=1;i=1040"},{"browseName":"1:CriticalBackingPressure","dataType":"Double","description":[{"value":"Maximum backing pressure for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump."}],"displayName":[{"value":"CriticalBackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9305","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasProperty","target":"ns=1;i=9306"},{"referenceType":"HasProperty","target":"ns=1;i=9308"},{"referenceType":"HasProperty","target":"ns=1;i=9307"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9306","parentNodeId":"ns=1;i=9305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9308","parentNodeId":"ns=1;i=9305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9307","parentNodeId":"ns=1;i=9305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the entry opening in the inlet connection of the pump."}],"displayName":[{"value":"InletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9309","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9316"},{"referenceType":"HasProperty","target":"ns=1;i=9318"},{"referenceType":"HasProperty","target":"ns=1;i=9317"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9316","parentNodeId":"ns=1;i=9309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9309"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9318","parentNodeId":"ns=1;i=9309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9309"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9317","parentNodeId":"ns=1;i=9309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9309"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumAllowableInletPressure","dataType":"Double","description":[{"value":"Highest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9310","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9319"},{"referenceType":"HasProperty","target":"ns=1;i=9321"},{"referenceType":"HasProperty","target":"ns=1;i=9320"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9319","parentNodeId":"ns=1;i=9310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9310"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9321","parentNodeId":"ns=1;i=9310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9310"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9320","parentNodeId":"ns=1;i=9310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9310"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumTolerableWaterVaporInletPressure","dataType":"Double","description":[{"value":"The highest water vapor inlet pressure at which a gas ballast pump, under normal ambient conditions, can pump and exhaust pure water vapor in continuous Operation."}],"displayName":[{"value":"MaximumTolerableWaterVaporInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9311","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9322"},{"referenceType":"HasProperty","target":"ns=1;i=9324"},{"referenceType":"HasProperty","target":"ns=1;i=9323"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9322","parentNodeId":"ns=1;i=9311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9324","parentNodeId":"ns=1;i=9311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9323","parentNodeId":"ns=1;i=9311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumWorkingPressure","dataType":"Double","description":[{"value":"instantaneous inlet pressure with adequate margin above the minimum liquid vapor pressure expected."}],"displayName":[{"value":"MaximumWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9312","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9325"},{"referenceType":"HasProperty","target":"ns=1;i=9327"},{"referenceType":"HasProperty","target":"ns=1;i=9326"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9325","parentNodeId":"ns=1;i=9312","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9312"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9327","parentNodeId":"ns=1;i=9312","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9312"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9326","parentNodeId":"ns=1;i=9312","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9312"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableInletPressure","dataType":"Double","description":[{"value":"Lowest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9313","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9328"},{"referenceType":"HasProperty","target":"ns=1;i=9330"},{"referenceType":"HasProperty","target":"ns=1;i=9329"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9328","parentNodeId":"ns=1;i=9313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9313"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9330","parentNodeId":"ns=1;i=9313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9313"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9329","parentNodeId":"ns=1;i=9313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9313"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NetPositiveInletPressureRequired","dataType":"Double","description":[{"value":"Total inlet pressure required to ensure there is enough margin to maintain the minimum."}],"displayName":[{"value":"NetPositiveInletPressureRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9314","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9331"},{"referenceType":"HasProperty","target":"ns=1;i=9333"},{"referenceType":"HasProperty","target":"ns=1;i=9332"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9331","parentNodeId":"ns=1;i=9314","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9314"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9333","parentNodeId":"ns=1;i=9314","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9314"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9332","parentNodeId":"ns=1;i=9314","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9314"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:WaterVaporCapacity","dataType":"Double","description":[{"value":"Mass of water which can be conveyed by the pump without condensation per time."}],"displayName":[{"value":"WaterVaporCapacity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9315","parentNodeId":"ns=1;i=1041","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9334"},{"referenceType":"HasProperty","target":"ns=1;i=9336"},{"referenceType":"HasProperty","target":"ns=1;i=9335"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1041"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9334","parentNodeId":"ns=1;i=9315","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9315"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9336","parentNodeId":"ns=1;i=9315","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9315"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4600375\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eg/h\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Egram per hour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9335","parentNodeId":"ns=1;i=9315","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9315"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletConnectionDesignType","displayName":[{"value":"OutletConnectionDesignType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.42","nodeClass":"ObjectType","nodeId":"ns=1;i=1042","references":[{"referenceType":"HasComponent","target":"ns=1;i=9277"},{"referenceType":"HasComponent","target":"ns=1;i=9281"},{"referenceType":"HasComponent","target":"ns=1;i=9282"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1040"},{"referenceType":"HasComponent","target":"ns=1;i=9283"},{"referenceType":"HasComponent","target":"ns=1;i=9284"},{"referenceType":"HasComponent","target":"ns=1;i=9285"},{"referenceType":"HasComponent","target":"ns=1;i=9286"}],"superType":"ns=1;i=1040"},{"browseName":"1:MaximumAllowableOutletPressure","dataType":"Double","description":[{"value":"Highest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9277","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9278"},{"referenceType":"HasProperty","target":"ns=1;i=9280"},{"referenceType":"HasProperty","target":"ns=1;i=9279"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9278","parentNodeId":"ns=1;i=9277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9280","parentNodeId":"ns=1;i=9277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9279","parentNodeId":"ns=1;i=9277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableOutetPressure","dataType":"Double","description":[{"value":"Lowest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableOutetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9281","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9287"},{"referenceType":"HasProperty","target":"ns=1;i=9289"},{"referenceType":"HasProperty","target":"ns=1;i=9288"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9287","parentNodeId":"ns=1;i=9281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9289","parentNodeId":"ns=1;i=9281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9288","parentNodeId":"ns=1;i=9281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the orifice in the outlet connection of the pump."}],"displayName":[{"value":"OutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9282","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9290"},{"referenceType":"HasProperty","target":"ns=1;i=9292"},{"referenceType":"HasProperty","target":"ns=1;i=9291"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9290","parentNodeId":"ns=1;i=9282","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9282"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9292","parentNodeId":"ns=1;i=9282","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9282"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9291","parentNodeId":"ns=1;i=9282","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9282"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveAccumulationPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will pass the total pump flow."}],"displayName":[{"value":"ReliefValveAccumulationPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9283","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9293"},{"referenceType":"HasProperty","target":"ns=1;i=9295"},{"referenceType":"HasProperty","target":"ns=1;i=9294"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9293","parentNodeId":"ns=1;i=9283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9295","parentNodeId":"ns=1;i=9283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9294","parentNodeId":"ns=1;i=9283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveBackPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of the relief valve when the valve is closed."}],"displayName":[{"value":"ReliefValveBackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9284","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9296"},{"referenceType":"HasProperty","target":"ns=1;i=9298"},{"referenceType":"HasProperty","target":"ns=1;i=9297"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9296","parentNodeId":"ns=1;i=9284","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9284"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9298","parentNodeId":"ns=1;i=9284","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9284"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9297","parentNodeId":"ns=1;i=9284","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9284"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveReseatPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will close after passing the total pump flow."}],"displayName":[{"value":"ReliefValveReseatPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9285","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9299"},{"referenceType":"HasProperty","target":"ns=1;i=9301"},{"referenceType":"HasProperty","target":"ns=1;i=9300"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9299","parentNodeId":"ns=1;i=9285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9301","parentNodeId":"ns=1;i=9285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9300","parentNodeId":"ns=1;i=9285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveSetPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve begins to open."}],"displayName":[{"value":"ReliefValveSetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9286","parentNodeId":"ns=1;i=1042","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9302"},{"referenceType":"HasProperty","target":"ns=1;i=9304"},{"referenceType":"HasProperty","target":"ns=1;i=9303"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1042"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9302","parentNodeId":"ns=1;i=9286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9304","parentNodeId":"ns=1;i=9286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9303","parentNodeId":"ns=1;i=9286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ConnectionImplementationType","displayName":[{"value":"ConnectionImplementationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.46","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1046","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9389"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9389","parentNodeId":"ns=1;i=1046","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9390"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1046"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9390","parentNodeId":"ns=1;i=9389","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9389"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletConnectionImplementationType","displayName":[{"value":"InletConnectionImplementationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.47","nodeClass":"ObjectType","nodeId":"ns=1;i=1047","references":[{"referenceType":"HasComponent","target":"ns=1;i=9407"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1046"},{"referenceType":"HasComponent","target":"ns=1;i=9408"},{"referenceType":"HasComponent","target":"ns=1;i=9409"},{"referenceType":"HasComponent","target":"ns=1;i=9410"}],"superType":"ns=1;i=1046"},{"accessLevel":3,"browseName":"1:HeightOfTheInletConnection","dataType":"Double","description":[{"value":"Height of the center of the inlet connection of the pump"}],"displayName":[{"value":"HeightOfTheInletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9407","parentNodeId":"ns=1;i=1047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9411"},{"referenceType":"HasProperty","target":"ns=1;i=9413"},{"referenceType":"HasProperty","target":"ns=1;i=9412"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9411","parentNodeId":"ns=1;i=9407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9413","parentNodeId":"ns=1;i=9407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9412","parentNodeId":"ns=1;i=9407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtInlet","dataType":"Double","description":[{"value":"Rated flow at pump inlet connection divided by the inlet area of the pump"}],"displayName":[{"value":"MeanRatedVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9408","parentNodeId":"ns=1;i=1047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9414"},{"referenceType":"HasProperty","target":"ns=1;i=9416"},{"referenceType":"HasProperty","target":"ns=1;i=9415"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9414","parentNodeId":"ns=1;i=9408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9416","parentNodeId":"ns=1;i=9408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9415","parentNodeId":"ns=1;i=9408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressure","dataType":"Double","description":[{"value":"Inlet pressure of the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9409","parentNodeId":"ns=1;i=1047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9417"},{"referenceType":"HasProperty","target":"ns=1;i=9419"},{"referenceType":"HasProperty","target":"ns=1;i=9418"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1047"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9417","parentNodeId":"ns=1;i=9409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9419","parentNodeId":"ns=1;i=9409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9418","parentNodeId":"ns=1;i=9409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at inlet area of the pump, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9410","parentNodeId":"ns=1;i=1047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9420"},{"referenceType":"HasProperty","target":"ns=1;i=9422"},{"referenceType":"HasProperty","target":"ns=1;i=9421"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1047"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9420","parentNodeId":"ns=1;i=9410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9422","parentNodeId":"ns=1;i=9410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9421","parentNodeId":"ns=1;i=9410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletConnectionImplementationType","displayName":[{"value":"OutletConnectionImplementationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.48","nodeClass":"ObjectType","nodeId":"ns=1;i=1048","references":[{"referenceType":"HasComponent","target":"ns=1;i=9391"},{"referenceType":"HasComponent","target":"ns=1;i=9392"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1046"},{"referenceType":"HasComponent","target":"ns=1;i=9393"},{"referenceType":"HasComponent","target":"ns=1;i=9394"}],"superType":"ns=1;i=1046"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletConnection","dataType":"Double","description":[{"value":"Height of the center of the outlet connection of the pump."}],"displayName":[{"value":"HeightOfTheOutletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9391","parentNodeId":"ns=1;i=1048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9395"},{"referenceType":"HasProperty","target":"ns=1;i=9397"},{"referenceType":"HasProperty","target":"ns=1;i=9396"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9395","parentNodeId":"ns=1;i=9391","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9391"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9397","parentNodeId":"ns=1;i=9391","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9391"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9396","parentNodeId":"ns=1;i=9391","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9391"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtOutlet","dataType":"Double","description":[{"value":"Rated flow at pump outlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanRatedVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9392","parentNodeId":"ns=1;i=1048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9398"},{"referenceType":"HasProperty","target":"ns=1;i=9400"},{"referenceType":"HasProperty","target":"ns=1;i=9399"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9398","parentNodeId":"ns=1;i=9392","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9392"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9400","parentNodeId":"ns=1;i=9392","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9392"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9399","parentNodeId":"ns=1;i=9392","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9392"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedOutletPressure","dataType":"Double","description":[{"value":"Outlet pressure of the pump at the guarantee point with rated flow and rated speed, as well as rated inlet pressure, for rotodynamic pumps only."}],"displayName":[{"value":"RatedOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9393","parentNodeId":"ns=1;i=1048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9401"},{"referenceType":"HasProperty","target":"ns=1;i=9403"},{"referenceType":"HasProperty","target":"ns=1;i=9402"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9401","parentNodeId":"ns=1;i=9393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9403","parentNodeId":"ns=1;i=9393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9402","parentNodeId":"ns=1;i=9393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at outlet area of the pump, corresponding to the sum of the height, pressure head and velocity head."}],"displayName":[{"value":"TotalHeadAtOutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9394","parentNodeId":"ns=1;i=1048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9404"},{"referenceType":"HasProperty","target":"ns=1;i=9406"},{"referenceType":"HasProperty","target":"ns=1;i=9405"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9404","parentNodeId":"ns=1;i=9394","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9406","parentNodeId":"ns=1;i=9394","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9405","parentNodeId":"ns=1;i=9394","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlType","displayName":[{"value":"ControlType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.24","nodeClass":"ObjectType","nodeId":"ns=1;i=1021","references":[{"referenceType":"HasComponent","target":"ns=1;i=7914"},{"referenceType":"HasComponent","target":"ns=1;i=7926"},{"referenceType":"HasComponent","target":"ns=1;i=7927"},{"referenceType":"HasComponent","target":"ns=1;i=7928"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=7918"},{"referenceType":"HasComponent","target":"ns=1;i=7919"},{"referenceType":"HasComponent","target":"ns=1;i=7929"},{"referenceType":"HasComponent","target":"ns=1;i=7920"},{"referenceType":"HasComponent","target":"ns=1;i=7921"},{"referenceType":"HasComponent","target":"ns=1;i=7922"},{"referenceType":"HasComponent","target":"ns=1;i=7925"},{"referenceType":"HasComponent","target":"ns=1;i=7923"},{"referenceType":"HasComponent","target":"ns=1;i=7924"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:CommandVariable","dataType":"Double","description":[{"value":"Variable quantity, which is not influenced by the control but is introduced into the control system from outside with the aim of making the final controlled variable follow it in a given relationship"}],"displayName":[{"value":"CommandVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7914","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasProperty","target":"ns=1;i=7915"},{"referenceType":"HasProperty","target":"ns=1;i=7917"},{"referenceType":"HasProperty","target":"ns=1;i=7916"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7915","parentNodeId":"ns=1;i=7914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7917","parentNodeId":"ns=1;i=7914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7916","parentNodeId":"ns=1;i=7914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlDifferenceVariable","dataType":"Double","description":[{"value":"Difference between the reference variable and the feedback variable"}],"displayName":[{"value":"ControlDifferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7926","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasProperty","target":"ns=1;i=7930"},{"referenceType":"HasProperty","target":"ns=1;i=7932"},{"referenceType":"HasProperty","target":"ns=1;i=7931"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7930","parentNodeId":"ns=1;i=7926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7932","parentNodeId":"ns=1;i=7926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7931","parentNodeId":"ns=1;i=7926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlledVariable","dataType":"Double","description":[{"value":"Output variable of the controlled system that will be acted upon by one or more manipulated variables"}],"displayName":[{"value":"ControlledVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7927","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasProperty","target":"ns=1;i=7933"},{"referenceType":"HasProperty","target":"ns=1;i=7935"},{"referenceType":"HasProperty","target":"ns=1;i=7934"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7933","parentNodeId":"ns=1;i=7927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7935","parentNodeId":"ns=1;i=7927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7934","parentNodeId":"ns=1;i=7927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControllerOutputVariable","dataType":"Double","description":[{"value":"Output variable of the controlling element, which is deducted from the control difference variable and is also the input variable of the actuator"}],"displayName":[{"value":"ControllerOutputVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7928","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasProperty","target":"ns=1;i=7936"},{"referenceType":"HasProperty","target":"ns=1;i=7938"},{"referenceType":"HasProperty","target":"ns=1;i=7937"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7936","parentNodeId":"ns=1;i=7928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7938","parentNodeId":"ns=1;i=7928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7937","parentNodeId":"ns=1;i=7928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DeadTime","dataType":"Double","description":[{"value":"In a dead-time element the duration of the time interval by which the output variable is shifted relative to the input variable"}],"displayName":[{"value":"DeadTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7918","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasProperty","target":"ns=1;i=7939"},{"referenceType":"HasProperty","target":"ns=1;i=7941"},{"referenceType":"HasProperty","target":"ns=1;i=7940"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7939","parentNodeId":"ns=1;i=7918","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7918"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7941","parentNodeId":"ns=1;i=7918","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7918"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7940","parentNodeId":"ns=1;i=7918","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7918"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DerivativeActionCoefficient","dataType":"Double","description":[{"value":"For a derivative element, the quotient of the value of the output variable to the value of the time derivative of the input variable"}],"displayName":[{"value":"DerivativeActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7919","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7942"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasProperty","target":"ns=1;i=7944"},{"referenceType":"HasProperty","target":"ns=1;i=7943"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7942","parentNodeId":"ns=1;i=7919","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7919"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7944","parentNodeId":"ns=1;i=7919","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7919"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7943","parentNodeId":"ns=1;i=7919","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7919"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7929","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7945"},{"referenceType":"HasProperty","target":"ns=1;i=7947"},{"referenceType":"HasProperty","target":"ns=1;i=7946"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7945","parentNodeId":"ns=1;i=7929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7947","parentNodeId":"ns=1;i=7929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7946","parentNodeId":"ns=1;i=7929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FinalControlledVariable","dataType":"Double","description":[{"value":"Variable quantity which has, or combination of variable quantities which have, to be influenced by the control"}],"displayName":[{"value":"FinalControlledVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7920","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7948"},{"referenceType":"HasProperty","target":"ns=1;i=7950"},{"referenceType":"HasProperty","target":"ns=1;i=7949"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7948","parentNodeId":"ns=1;i=7920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7920"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7950","parentNodeId":"ns=1;i=7920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7920"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7949","parentNodeId":"ns=1;i=7920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7920"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IntegralActionCoefficient","dataType":"Double","description":[{"value":"For an integral element, the quotient of the time derivative of the output variable to the fixed value of the input variable"}],"displayName":[{"value":"IntegralActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7921","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7951"},{"referenceType":"HasProperty","target":"ns=1;i=7953"},{"referenceType":"HasProperty","target":"ns=1;i=7952"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7951","parentNodeId":"ns=1;i=7921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7953","parentNodeId":"ns=1;i=7921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7952","parentNodeId":"ns=1;i=7921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedVariable","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7922","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7954"},{"referenceType":"HasProperty","target":"ns=1;i=7956"},{"referenceType":"HasProperty","target":"ns=1;i=7955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7954","parentNodeId":"ns=1;i=7922","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7956","parentNodeId":"ns=1;i=7922","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7955","parentNodeId":"ns=1;i=7922","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OperatingMode","dataType":"String","description":[{"value":"Characterization of the way and the extent to which the human operator intervenes in the control equipment"}],"displayName":[{"value":"OperatingMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7925","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=7957"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7957","parentNodeId":"ns=1;i=7925","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7925"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ProportionalActionCoefficient","dataType":"Double","description":[{"value":"For a proportional element, the quotient of the variation of the output variable to the corresponding variation of the input variable"}],"displayName":[{"value":"ProportionalActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7923","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7958"},{"referenceType":"HasProperty","target":"ns=1;i=7960"},{"referenceType":"HasProperty","target":"ns=1;i=7959"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7958","parentNodeId":"ns=1;i=7923","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7923"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7960","parentNodeId":"ns=1;i=7923","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7923"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7959","parentNodeId":"ns=1;i=7923","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7923"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7924","parentNodeId":"ns=1;i=1021","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7961"},{"referenceType":"HasProperty","target":"ns=1;i=7963"},{"referenceType":"HasProperty","target":"ns=1;i=7962"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1021"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7961","parentNodeId":"ns=1;i=7924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7963","parentNodeId":"ns=1;i=7924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7962","parentNodeId":"ns=1;i=7924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DesignType","displayName":[{"value":"DesignType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.20","nodeClass":"ObjectType","nodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7777"},{"referenceType":"HasComponent","target":"ns=1;i=7697"},{"referenceType":"HasComponent","target":"ns=1;i=7701"},{"referenceType":"HasComponent","target":"ns=1;i=7702"},{"referenceType":"HasComponent","target":"ns=1;i=7759"},{"referenceType":"HasComponent","target":"ns=1;i=7762"},{"referenceType":"HasComponent","target":"ns=1;i=7771"},{"referenceType":"HasComponent","target":"ns=1;i=7765"},{"referenceType":"HasComponent","target":"ns=1;i=7703"},{"referenceType":"HasComponent","target":"ns=1;i=7772"},{"referenceType":"HasComponent","target":"ns=1;i=7768"},{"referenceType":"HasComponent","target":"ns=1;i=7704"},{"referenceType":"HasComponent","target":"ns=1;i=7705"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=7773"},{"referenceType":"HasComponent","target":"ns=1;i=7706"},{"referenceType":"HasComponent","target":"ns=1;i=7774"},{"referenceType":"HasComponent","target":"ns=1;i=7707"},{"referenceType":"HasComponent","target":"ns=1;i=7708"},{"referenceType":"HasComponent","target":"ns=1;i=7709"},{"referenceType":"HasComponent","target":"ns=1;i=5057"},{"referenceType":"HasComponent","target":"ns=1;i=7710"},{"referenceType":"HasComponent","target":"ns=1;i=7711"},{"referenceType":"HasComponent","target":"ns=1;i=7712"},{"referenceType":"HasComponent","target":"ns=1;i=7713"},{"referenceType":"HasComponent","target":"ns=1;i=7714"},{"referenceType":"HasComponent","target":"ns=1;i=7715"},{"referenceType":"HasComponent","target":"ns=1;i=7716"},{"referenceType":"HasComponent","target":"ns=1;i=7717"},{"referenceType":"HasComponent","target":"ns=1;i=7718"},{"referenceType":"HasComponent","target":"ns=1;i=7719"},{"referenceType":"HasComponent","target":"ns=1;i=7720"},{"referenceType":"HasComponent","target":"ns=1;i=7721"},{"referenceType":"HasComponent","target":"ns=1;i=7722"},{"referenceType":"HasComponent","target":"ns=1;i=7723"},{"referenceType":"HasComponent","target":"ns=1;i=7724"},{"referenceType":"HasComponent","target":"ns=1;i=7725"},{"referenceType":"HasComponent","target":"ns=1;i=7726"},{"referenceType":"HasComponent","target":"ns=1;i=7727"},{"referenceType":"HasComponent","target":"ns=1;i=7728"},{"referenceType":"HasComponent","target":"ns=1;i=7729"},{"referenceType":"HasComponent","target":"ns=1;i=7730"},{"referenceType":"HasComponent","target":"ns=1;i=7731"},{"referenceType":"HasComponent","target":"ns=1;i=7732"},{"referenceType":"HasComponent","target":"ns=1;i=7733"},{"referenceType":"HasComponent","target":"ns=1;i=7775"},{"referenceType":"HasComponent","target":"ns=1;i=7776"},{"referenceType":"HasComponent","target":"ns=1;i=7734"},{"referenceType":"HasComponent","target":"ns=1;i=7735"},{"referenceType":"HasComponent","target":"ns=1;i=7736"},{"referenceType":"HasComponent","target":"ns=1;i=7737"},{"referenceType":"HasComponent","target":"ns=1;i=7778"},{"referenceType":"HasComponent","target":"ns=1;i=7738"},{"referenceType":"HasComponent","target":"ns=1;i=7779"},{"referenceType":"HasComponent","target":"ns=1;i=5058"},{"referenceType":"HasComponent","target":"ns=1;i=5059"},{"referenceType":"HasComponent","target":"ns=1;i=5060"},{"referenceType":"HasComponent","target":"ns=1;i=5061"},{"referenceType":"HasComponent","target":"ns=1;i=5062"},{"referenceType":"HasComponent","target":"ns=1;i=7739"},{"referenceType":"HasComponent","target":"ns=1;i=7740"},{"referenceType":"HasComponent","target":"ns=1;i=7741"},{"referenceType":"HasComponent","target":"ns=1;i=7742"},{"referenceType":"HasComponent","target":"ns=1;i=7743"},{"referenceType":"HasComponent","target":"ns=1;i=7744"},{"referenceType":"HasComponent","target":"ns=1;i=7745"},{"referenceType":"HasComponent","target":"ns=1;i=7746"},{"referenceType":"HasComponent","target":"ns=1;i=7747"},{"referenceType":"HasComponent","target":"ns=1;i=7748"},{"referenceType":"HasComponent","target":"ns=1;i=5063"},{"referenceType":"HasComponent","target":"ns=1;i=7749"},{"referenceType":"HasComponent","target":"ns=1;i=7750"},{"referenceType":"HasComponent","target":"ns=1;i=7751"},{"referenceType":"HasComponent","target":"ns=1;i=7752"},{"referenceType":"HasComponent","target":"ns=1;i=7753"},{"referenceType":"HasComponent","target":"ns=1;i=7780"},{"referenceType":"HasComponent","target":"ns=1;i=7754"},{"referenceType":"HasComponent","target":"ns=1;i=7755"},{"referenceType":"HasComponent","target":"ns=1;i=7756"},{"referenceType":"HasComponent","target":"ns=1;i=7757"},{"referenceType":"HasComponent","target":"ns=1;i=7758"}],"superType":"ns=3;i=1005"},{"browseName":"1:AdditionalFieldbuses","dataType":"String","description":[{"value":"Additional fieldbuses supported by the product."}],"displayName":[{"value":"AdditionalFieldbuses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7777","parentNodeId":"ns=1;i=1020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13499"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13499","parentNodeId":"ns=1;i=7777","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7777"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:BalancingRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow which is extracted to activate a balance device"}],"displayName":[{"value":"BalancingRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7697","parentNodeId":"ns=1;i=1020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=7698"},{"referenceType":"HasProperty","target":"ns=1;i=7700"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7698","parentNodeId":"ns=1;i=7697","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7697"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7700","parentNodeId":"ns=1;i=7697","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7697"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:BasePressure","dataType":"Double","description":[{"value":"Pressure obtained in the test dome after conditioning the vacuum pump and the test dome"}],"displayName":[{"value":"BasePressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7701","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13265"},{"referenceType":"HasProperty","target":"ns=1;i=13266"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13265","parentNodeId":"ns=1;i=7701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7701"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13266","parentNodeId":"ns=1;i=7701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7701"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ClearanceVolume","dataType":"Double","description":[{"value":"Volume remaining unswept at the end of the discharge stroke."}],"displayName":[{"value":"ClearanceVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7702","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=7699"},{"referenceType":"HasProperty","target":"ns=1;i=8449"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7699","parentNodeId":"ns=1;i=7702","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7702"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8449","parentNodeId":"ns=1;i=7702","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7702"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ClockwiseRotation","dataType":"Boolean","description":[{"value":"Direction of rotation in which the shaft is seen to be turning in a clockwise direction when viewing the drive end of the shaft. A \u0022True\u0022 status means that the rotation of pump is clockwise and a \u0022False\u0022 status means that the rotation of pump is anticlockwise."}],"displayName":[{"value":"ClockwiseRotation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7759","parentNodeId":"ns=1;i=1020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13274"},{"referenceType":"HasProperty","target":"ns=1;i=7760"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7761"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13274","parentNodeId":"ns=1;i=7759","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7759"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7760","parentNodeId":"ns=1;i=7759","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7759"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7761","parentNodeId":"ns=1;i=7759","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7759"}],"typeDefinition":"i=68"},{"browseName":"1:Controllable","dataType":"Boolean","description":[{"value":"Indicates whether the product is a controllable pump or a self-controlling pump. A \u0022True\u0022 status means that the pump is controllable and a \u0022False\u0022 status means that the pump is not controllable."}],"displayName":[{"value":"Controllable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7762","parentNodeId":"ns=1;i=1020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13277"},{"referenceType":"HasProperty","target":"ns=1;i=7763"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7764"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13277","parentNodeId":"ns=1;i=7762","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7762"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7763","parentNodeId":"ns=1;i=7762","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7762"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7764","parentNodeId":"ns=1;i=7762","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7762"}],"typeDefinition":"i=68"},{"browseName":"1:Cool_DownTimeForAVaporJetPumpOrADiffusionPump","dataType":"Double","description":[{"value":"The cool-down time is the time required to cool the propellant from the working temperature to a temperature at which the propellant can be exposed to atmospheric air without risk after the heating has been switched off."}],"displayName":[{"value":"Cool_DownTimeForAVaporJetPumpOrADiffusionPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7771","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13280"},{"referenceType":"HasProperty","target":"ns=1;i=13281"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13280","parentNodeId":"ns=1;i=7771","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7771"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13281","parentNodeId":"ns=1;i=7771","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7771"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Counter_ClockwiseRotation","dataType":"Boolean","description":[{"value":"Direction of rotation in which the shaft is seen to be turning in an anticlockwise direction, when viewing the drive end of the shaft. A \u0022True\u0022 status means that the rotation of pump is anticlockwise and a \u0022False\u0022 status means that the rotation of pump is clockwise."}],"displayName":[{"value":"Counter_ClockwiseRotation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7765","parentNodeId":"ns=1;i=1020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13286"},{"referenceType":"HasProperty","target":"ns=1;i=7766"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7767"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13286","parentNodeId":"ns=1;i=7765","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7765"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7766","parentNodeId":"ns=1;i=7765","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7765"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7767","parentNodeId":"ns=1;i=7765","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7765"}],"typeDefinition":"i=68"},{"browseName":"1:CriticalSpeed","dataType":"Double","description":[{"value":"Speed of rotation at which the frequency of vibration (or its multiples) corresponds to the rotor resonant (lateral or torsional)"}],"displayName":[{"value":"CriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7703","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13289"},{"referenceType":"HasProperty","target":"ns=1;i=13290"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13289","parentNodeId":"ns=1;i=7703","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7703"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13290","parentNodeId":"ns=1;i=7703","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7703"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DeclarationOfConformity","dataType":"String","description":[{"value":"Publicly accessible attestation of conformity, commonly available on websites."}],"displayName":[{"value":"DeclarationOfConformity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7772","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13295"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13295","parentNodeId":"ns=1;i=7772","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7772"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DeclarationOfConformityAvailable","dataType":"Boolean","description":[{"value":"Whether or not a declaration of conformity exists. A \u0022True\u0022 status means that the declaration exists and a \u0022False\u0022 status means that there is no declaration available."}],"displayName":[{"value":"DeclarationOfConformityAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7768","parentNodeId":"ns=1;i=1020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13298"},{"referenceType":"HasProperty","target":"ns=1;i=7769"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7770"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13298","parentNodeId":"ns=1;i=7768","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7768"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7769","parentNodeId":"ns=1;i=7768","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7768"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7770","parentNodeId":"ns=1;i=7768","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7768"}],"typeDefinition":"i=68"},{"browseName":"1:DesignAxialLoad","dataType":"Double","description":[{"value":"Residual axial thrust on the pump rotor on which the thrust-bearing selection is based."}],"displayName":[{"value":"DesignAxialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7704","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13301"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13302"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13301","parentNodeId":"ns=1;i=7704","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7704"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13302","parentNodeId":"ns=1;i=7704","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7704"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DesignRadialLoad","dataType":"Double","description":[{"value":"Radial load of the pump rotor for which the bearing system is selected."}],"displayName":[{"value":"DesignRadialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7705","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13307"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13308"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13307","parentNodeId":"ns=1;i=7705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13308","parentNodeId":"ns=1;i=7705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DirectivesOfEUDeclarationOfConformity","dataType":"DeclarationOfConformityOptionSet","description":[{"value":"Set of directives on the basis of which conformity was determined."}],"displayName":[{"value":"DirectivesOfEUDeclarationOfConformity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7773","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13316"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13316","parentNodeId":"ns=1;i=7773","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7773"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DryCriticalSpeed","dataType":"Double","description":[{"value":"Rotor resonant frequency calculated assuming that the rotor is supported only at its bearings and that the bearings are of infinite stiffness"}],"displayName":[{"value":"DryCriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7706","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13319"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13320"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13319","parentNodeId":"ns=1;i=7706","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7706"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13320","parentNodeId":"ns=1;i=7706","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7706"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ExplosionProtection","dataType":"ExplosionProtectionOptionSet","description":[{"value":"Device category for explosion protection according to 2014/34/EU (ATEX)."}],"displayName":[{"value":"ExplosionProtection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7774","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13325"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13325","parentNodeId":"ns=1;i=7774","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7774"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GeometricalFlow","dataType":"Double","description":[{"value":"Product of geometrical displacement volume and speed of rotation or stroke frequency"}],"displayName":[{"value":"GeometricalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7707","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13328"},{"referenceType":"HasProperty","target":"ns=1;i=13329"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13328","parentNodeId":"ns=1;i=7707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13329","parentNodeId":"ns=1;i=7707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:GeometricDisplacementVolume","dataType":"Double","description":[{"value":"Displacement volume for one stroke or one cycle."}],"displayName":[{"value":"GeometricDisplacementVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7708","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13334"},{"referenceType":"HasProperty","target":"ns=1;i=13335"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13334","parentNodeId":"ns=1;i=7708","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7708"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13335","parentNodeId":"ns=1;i=7708","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7708"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:HeadAtPeakPoint","dataType":"Double","description":[{"value":"Highest total head developed by a pump when this does not occur at a zero rate of flow"}],"displayName":[{"value":"HeadAtPeakPoint"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7709","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13340"},{"referenceType":"HasProperty","target":"ns=1;i=13341"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13340","parentNodeId":"ns=1;i=7709","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7709"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13341","parentNodeId":"ns=1;i=7709","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7709"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:InstallationNpshCurve","description":[{"value":"Relationship between the net positive suction head available and the rate of flow at given operating conditions for a given liquid"}],"displayName":[{"value":"InstallationNpshCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5057","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7781"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7783"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=13346"},{"referenceType":"HasComponent","target":"ns=1;i=7786"},{"referenceType":"HasProperty","target":"ns=1;i=7789"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7790"},{"referenceType":"HasComponent","target":"ns=1;i=7793"},{"referenceType":"HasProperty","target":"ns=1;i=7795"},{"referenceType":"HasProperty","target":"ns=1;i=7796"},{"referenceType":"HasProperty","target":"ns=1;i=7797"},{"referenceType":"HasComponent","target":"ns=1;i=7798"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7781","parentNodeId":"ns=1;i=5057","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5057"},{"referenceType":"HasProperty","target":"ns=1;i=7782"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7782","parentNodeId":"ns=1;i=7781","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7781"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7783","parentNodeId":"ns=1;i=5057","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5057"},{"referenceType":"HasProperty","target":"ns=1;i=7784"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7785"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7784","parentNodeId":"ns=1;i=7783","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7783"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7785","parentNodeId":"ns=1;i=7783","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7783"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13346","parentNodeId":"ns=1;i=5057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7786","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasProperty","target":"ns=1;i=7787"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5057"},{"referenceType":"HasProperty","target":"ns=1;i=7788"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7787","parentNodeId":"ns=1;i=7786","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7786"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7788","parentNodeId":"ns=1;i=7786","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7786"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7789","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5057"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7790","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasProperty","target":"ns=1;i=7791"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7792"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5057"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7791","parentNodeId":"ns=1;i=7790","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7790"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7792","parentNodeId":"ns=1;i=7790","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7790"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7793","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasProperty","target":"ns=1;i=7794"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5057"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7794","parentNodeId":"ns=1;i=7793","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7793"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7795","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5057"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7796","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5057"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7797","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5057"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7798","parentNodeId":"ns=1;i=5057","references":[{"referenceType":"HasProperty","target":"ns=1;i=7799"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5057"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7799","parentNodeId":"ns=1;i=7798","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7798"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LeakageRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow leaking from shaft seals"}],"displayName":[{"value":"LeakageRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7710","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13349"},{"referenceType":"HasProperty","target":"ns=1;i=13350"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13349","parentNodeId":"ns=1;i=7710","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7710"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13350","parentNodeId":"ns=1;i=7710","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7710"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableAmbientTemperature","dataType":"Double","description":[{"value":"Highest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MaximumAllowableAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7711","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13355"},{"referenceType":"HasProperty","target":"ns=1;i=13356"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13355","parentNodeId":"ns=1;i=7711","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13356","parentNodeId":"ns=1;i=7711","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableCasingWorkingPressure","dataType":"Double","description":[{"value":"Greatest outlet pressure at the specified operating temperature at which the pump casing can be used"}],"displayName":[{"value":"MaximumAllowableCasingWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7712","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13361"},{"referenceType":"HasProperty","target":"ns=1;i=13362"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13361","parentNodeId":"ns=1;i=7712","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7712"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13362","parentNodeId":"ns=1;i=7712","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7712"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableContinuousSpeed","dataType":"Double","description":[{"value":"Highest rotational speed for continuous operation recommended by the manufacturer"}],"displayName":[{"value":"MaximumAllowableContinuousSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7713","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13367"},{"referenceType":"HasProperty","target":"ns=1;i=13368"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13367","parentNodeId":"ns=1;i=7713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13368","parentNodeId":"ns=1;i=7713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableHead","dataType":"Double","description":[{"value":"Maximum permissible head at which the pump can be continuously operated without suffering damage"}],"displayName":[{"value":"MaximumAllowableHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7714","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13373"},{"referenceType":"HasProperty","target":"ns=1;i=13374"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13373","parentNodeId":"ns=1;i=7714","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7714"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13374","parentNodeId":"ns=1;i=7714","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7714"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableRelativeHumidity","dataType":"Double","description":[{"value":"Highest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MaximumAllowableRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7715","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13379"},{"referenceType":"HasProperty","target":"ns=1;i=13380"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13379","parentNodeId":"ns=1;i=7715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13380","parentNodeId":"ns=1;i=7715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableTemperature","dataType":"Double","description":[{"value":"Highest allowable continuous fluid temperature for which the equipment (or any part to which the term refers) is suitable when handling the specified operating fluid at the specified operating pressure"}],"displayName":[{"value":"MaximumAllowableTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7716","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13385"},{"referenceType":"HasProperty","target":"ns=1;i=13386"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13385","parentNodeId":"ns=1;i=7716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13386","parentNodeId":"ns=1;i=7716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableThroughput","dataType":"Double","description":[{"value":"Maximum pV flow the pump can withstand without damage"}],"displayName":[{"value":"MaximumAllowableThroughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7717","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13391"},{"referenceType":"HasProperty","target":"ns=1;i=13392"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13391","parentNodeId":"ns=1;i=7717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13392","parentNodeId":"ns=1;i=7717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableWorkingPressure","dataType":"Double","description":[{"value":"Pressure for a component on the basis of materials used and on the basis of calculation rules at the specified operating temperature"}],"displayName":[{"value":"MaximumAllowableWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7718","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13397"},{"referenceType":"HasProperty","target":"ns=1;i=13398"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13397","parentNodeId":"ns=1;i=7718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13398","parentNodeId":"ns=1;i=7718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAxialLoad","dataType":"Double","description":[{"value":"Greatest value of the residual axial thrust on the pump rotor resulting from operating the pump at any condition within its allowable operating range."}],"displayName":[{"value":"MaximumAxialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7719","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13403"},{"referenceType":"HasProperty","target":"ns=1;i=13404"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13403","parentNodeId":"ns=1;i=7719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13404","parentNodeId":"ns=1;i=7719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumPumpPowerInput","dataType":"Double","description":[{"value":"Highest value of the pump power input at any rate of flow at any allowable operating condition"}],"displayName":[{"value":"MaximumPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7720","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13409"},{"referenceType":"HasProperty","target":"ns=1;i=13410"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13409","parentNodeId":"ns=1;i=7720","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13410","parentNodeId":"ns=1;i=7720","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumRadialLoad","dataType":"Double","description":[{"value":"Greatest radial load of the pump rotor resulting from operating the pump at any condition within its allowable operating range."}],"displayName":[{"value":"MaximumRadialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7721","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13415"},{"referenceType":"HasProperty","target":"ns=1;i=13416"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13415","parentNodeId":"ns=1;i=7721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13416","parentNodeId":"ns=1;i=7721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumStaticSealingPressure","dataType":"Double","description":[{"value":"Highest pressure, excluding hydrostatic testing, to which the seal can be subjected while the pump is shut down"}],"displayName":[{"value":"MaximumStaticSealingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7722","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13421"},{"referenceType":"HasProperty","target":"ns=1;i=13422"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13421","parentNodeId":"ns=1;i=7722","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7722"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13422","parentNodeId":"ns=1;i=7722","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7722"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MeanTimebetweenFailures","dataType":"Double","description":[{"value":"Average of the times between failures."}],"displayName":[{"value":"MeanTimebetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7723","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13427"},{"referenceType":"HasProperty","target":"ns=1;i=13428"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13427","parentNodeId":"ns=1;i=7723","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13428","parentNodeId":"ns=1;i=7723","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableAmbientTemperature","dataType":"Double","description":[{"value":"Lowest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MinimumAllowableAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7724","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13433"},{"referenceType":"HasProperty","target":"ns=1;i=13434"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13433","parentNodeId":"ns=1;i=7724","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7724"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13434","parentNodeId":"ns=1;i=7724","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7724"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableContinuousSpeed","dataType":"Double","description":[{"value":"Lowest speed for continuous operation recommended by the manufacturer"}],"displayName":[{"value":"MinimumAllowableContinuousSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7725","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13439"},{"referenceType":"HasProperty","target":"ns=1;i=13440"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13439","parentNodeId":"ns=1;i=7725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13440","parentNodeId":"ns=1;i=7725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableHead","dataType":"Double","description":[{"value":"Minimum permissible head at which the pump can be operated without suffering damage"}],"displayName":[{"value":"MinimumAllowableHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7726","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13445"},{"referenceType":"HasProperty","target":"ns=1;i=13446"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13445","parentNodeId":"ns=1;i=7726","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7726"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13446","parentNodeId":"ns=1;i=7726","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7726"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableRelativeHumidity","dataType":"Double","description":[{"value":"Lowest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MinimumAllowableRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7727","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13451"},{"referenceType":"HasProperty","target":"ns=1;i=13452"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13451","parentNodeId":"ns=1;i=7727","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7727"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13452","parentNodeId":"ns=1;i=7727","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7727"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableTemperature","dataType":"Double","description":[{"value":"Lowest allowable continuous temperature for which the equipment (or any part to which the term refers) is suitable when handling the specified operating fluid at the specified operating pressure"}],"displayName":[{"value":"MinimumAllowableTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7728","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13457"},{"referenceType":"HasProperty","target":"ns=1;i=13458"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13457","parentNodeId":"ns=1;i=7728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7728"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13458","parentNodeId":"ns=1;i=7728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7728"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableThermalFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without its operation being impaired by the temperature rise of the pumped liquid"}],"displayName":[{"value":"MinimumAllowableThermalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7729","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13463"},{"referenceType":"HasProperty","target":"ns=1;i=13464"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13463","parentNodeId":"ns=1;i=7729","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7729"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13464","parentNodeId":"ns=1;i=7729","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7729"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumContinuousStableFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can be operated without it adversely affecting its performance in terms of life expectancy, noise and vibrations"}],"displayName":[{"value":"MinimumContinuousStableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7730","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13469"},{"referenceType":"HasProperty","target":"ns=1;i=13470"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13469","parentNodeId":"ns=1;i=7730","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7730"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13470","parentNodeId":"ns=1;i=7730","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7730"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumContinuousThermalFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without its operation being impaired by the temperature rise of the pumped liquid"}],"displayName":[{"value":"MinimumContinuousThermalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7731","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13475"},{"referenceType":"HasProperty","target":"ns=1;i=13476"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13475","parentNodeId":"ns=1;i=7731","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7731"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13476","parentNodeId":"ns=1;i=7731","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7731"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:NetPositiveSuctionHeadRequired","dataType":"Double","description":[{"value":"Minimum NPSH at the pump inlet connection required to give the rated or operating performance at the specified conditions"}],"displayName":[{"value":"NetPositiveSuctionHeadRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7732","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13481"},{"referenceType":"HasProperty","target":"ns=1;i=13482"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13481","parentNodeId":"ns=1;i=7732","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7732"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13482","parentNodeId":"ns=1;i=7732","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7732"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:NetPositiveSuctionHeadRequiredForADropOf3Percent","dataType":"Double","description":[{"value":"NPSH required for a drop of 3 % in the total head of the first stage of the pump as a standard basis for use in performance curves"}],"displayName":[{"value":"NetPositiveSuctionHeadRequiredForADropOf3Percent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7733","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13487"},{"referenceType":"HasProperty","target":"ns=1;i=13488"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"NetPositiveSuctionHeadRequiredForADropOf3_","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13487","parentNodeId":"ns=1;i=7733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13488","parentNodeId":"ns=1;i=7733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OfferedControlModes","dataType":"OfferedControlModesOptionSet","description":[{"value":"Control modes supported by the manufacturer for the product."}],"displayName":[{"value":"OfferedControlModes"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7775","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13493"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13493","parentNodeId":"ns=1;i=7775","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7775"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OfferedFieldbuses","dataType":"OfferedFieldbusesOptionSet","description":[{"value":"Fieldbuses supported by the manufacturer for the product."}],"displayName":[{"value":"OfferedFieldbuses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7776","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13496"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13496","parentNodeId":"ns=1;i=7776","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7776"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OptimumHead","dataType":"Double","description":[{"value":"Total head developed by the pump at a rate of flow corresponding to the best efficiency"}],"displayName":[{"value":"OptimumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7734","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13502"},{"referenceType":"HasProperty","target":"ns=1;i=13503"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13502","parentNodeId":"ns=1;i=7734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7734"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13503","parentNodeId":"ns=1;i=7734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7734"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OptimumPumpPowerInput","dataType":"Double","description":[{"value":"Pump power input at the rate of flow corresponding to the best efficiency"}],"displayName":[{"value":"OptimumPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7735","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13508"},{"referenceType":"HasProperty","target":"ns=1;i=13509"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13508","parentNodeId":"ns=1;i=7735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13509","parentNodeId":"ns=1;i=7735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OptimumRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow at the point of best efficiency"}],"displayName":[{"value":"OptimumRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7736","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13514"},{"referenceType":"HasProperty","target":"ns=1;i=13515"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13514","parentNodeId":"ns=1;i=7736","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7736"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13515","parentNodeId":"ns=1;i=7736","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7736"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:PistonVelocity","dataType":"Double","description":[{"value":"Average speed given by the stroke length multiplied with the number of complete pumping cycles of the piston, plunger or piston attached to the diaphragm per minute (stroke per minute or pump crank speed)"}],"displayName":[{"value":"PistonVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7737","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13520"},{"referenceType":"HasProperty","target":"ns=1;i=13521"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13520","parentNodeId":"ns=1;i=7737","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7737"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13521","parentNodeId":"ns=1;i=7737","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7737"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"1:PossibleFluids","dataType":"String","description":[{"value":"Fluids that can be pumped by the pump."}],"displayName":[{"value":"PossibleFluids"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7778","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13526"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13526","parentNodeId":"ns=1;i=7778","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7778"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Pre_ChargePressure","dataType":"Double","description":[{"value":"Pressure to which the pulsation dampener is charged with dry gas prior to start of operation"}],"displayName":[{"value":"Pre_ChargePressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7738","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13529"},{"referenceType":"HasProperty","target":"ns=1;i=13530"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13529","parentNodeId":"ns=1;i=7738","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7738"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13530","parentNodeId":"ns=1;i=7738","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7738"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:PumpClass","dataType":"PumpClassEnum","description":[{"value":"Pump type according to functional principle and pumped fluid"}],"displayName":[{"value":"PumpClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7779","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13313"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13313","parentNodeId":"ns=1;i=7779","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7779"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PumpCurve","description":[{"value":"Representation of the pump head plotted against the flow rate"}],"displayName":[{"value":"PumpCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5058","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7800"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7802"},{"referenceType":"HasProperty","target":"ns=1;i=13535"},{"referenceType":"HasComponent","target":"ns=1;i=7805"},{"referenceType":"HasProperty","target":"ns=1;i=7808"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=7809"},{"referenceType":"HasComponent","target":"ns=1;i=7812"},{"referenceType":"HasProperty","target":"ns=1;i=7814"},{"referenceType":"HasProperty","target":"ns=1;i=7815"},{"referenceType":"HasProperty","target":"ns=1;i=7816"},{"referenceType":"HasComponent","target":"ns=1;i=7817"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7800","parentNodeId":"ns=1;i=5058","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5058"},{"referenceType":"HasProperty","target":"ns=1;i=7801"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7801","parentNodeId":"ns=1;i=7800","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7800"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7802","parentNodeId":"ns=1;i=5058","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5058"},{"referenceType":"HasProperty","target":"ns=1;i=7803"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7804"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7803","parentNodeId":"ns=1;i=7802","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7802"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7804","parentNodeId":"ns=1;i=7802","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7802"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13535","parentNodeId":"ns=1;i=5058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7805","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasProperty","target":"ns=1;i=7806"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5058"},{"referenceType":"HasProperty","target":"ns=1;i=7807"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7806","parentNodeId":"ns=1;i=7805","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7805"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7807","parentNodeId":"ns=1;i=7805","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7805"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7808","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5058"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7809","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasProperty","target":"ns=1;i=7810"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7811"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5058"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7810","parentNodeId":"ns=1;i=7809","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7809"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7811","parentNodeId":"ns=1;i=7809","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7809"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7812","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasProperty","target":"ns=1;i=7813"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5058"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7813","parentNodeId":"ns=1;i=7812","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7812"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7814","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5058"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7815","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5058"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7816","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5058"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7817","parentNodeId":"ns=1;i=5058","references":[{"referenceType":"HasProperty","target":"ns=1;i=7818"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5058"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7818","parentNodeId":"ns=1;i=7817","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7817"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpEfficiencyCurve","description":[{"value":"Relationship between the pump efficiency and the rate of flow at given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpEfficiencyCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5059","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7819"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7821"},{"referenceType":"HasProperty","target":"ns=1;i=13538"},{"referenceType":"HasComponent","target":"ns=1;i=7824"},{"referenceType":"HasProperty","target":"ns=1;i=7827"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=7828"},{"referenceType":"HasComponent","target":"ns=1;i=7831"},{"referenceType":"HasProperty","target":"ns=1;i=7833"},{"referenceType":"HasProperty","target":"ns=1;i=7834"},{"referenceType":"HasProperty","target":"ns=1;i=7835"},{"referenceType":"HasComponent","target":"ns=1;i=7836"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7819","parentNodeId":"ns=1;i=5059","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5059"},{"referenceType":"HasProperty","target":"ns=1;i=7820"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7820","parentNodeId":"ns=1;i=7819","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7819"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7821","parentNodeId":"ns=1;i=5059","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5059"},{"referenceType":"HasProperty","target":"ns=1;i=7822"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7823"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7822","parentNodeId":"ns=1;i=7821","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7821"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7823","parentNodeId":"ns=1;i=7821","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7821"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13538","parentNodeId":"ns=1;i=5059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7824","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasProperty","target":"ns=1;i=7825"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5059"},{"referenceType":"HasProperty","target":"ns=1;i=7826"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7825","parentNodeId":"ns=1;i=7824","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7824"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7826","parentNodeId":"ns=1;i=7824","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7824"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7827","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5059"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7828","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasProperty","target":"ns=1;i=7829"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7830"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5059"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7829","parentNodeId":"ns=1;i=7828","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7828"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7830","parentNodeId":"ns=1;i=7828","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7828"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7831","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasProperty","target":"ns=1;i=7832"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5059"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7832","parentNodeId":"ns=1;i=7831","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7831"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7833","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5059"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7834","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5059"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7835","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5059"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7836","parentNodeId":"ns=1;i=5059","references":[{"referenceType":"HasProperty","target":"ns=1;i=7837"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5059"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7837","parentNodeId":"ns=1;i=7836","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7836"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpH_Q_Curve","description":[{"value":"Relationship between the total head of the pump and the rate of flow at given operating conditions /rated conditions of speed and liquid"}],"displayName":[{"value":"PumpH(Q)Curve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5060","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7838"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7840"},{"referenceType":"HasProperty","target":"ns=1;i=13541"},{"referenceType":"HasComponent","target":"ns=1;i=7843"},{"referenceType":"HasProperty","target":"ns=1;i=7846"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=7847"},{"referenceType":"HasComponent","target":"ns=1;i=7850"},{"referenceType":"HasProperty","target":"ns=1;i=7852"},{"referenceType":"HasProperty","target":"ns=1;i=7853"},{"referenceType":"HasProperty","target":"ns=1;i=7854"},{"referenceType":"HasComponent","target":"ns=1;i=7855"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7838","parentNodeId":"ns=1;i=5060","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5060"},{"referenceType":"HasProperty","target":"ns=1;i=7839"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7839","parentNodeId":"ns=1;i=7838","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7838"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7840","parentNodeId":"ns=1;i=5060","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5060"},{"referenceType":"HasProperty","target":"ns=1;i=7841"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7842"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7841","parentNodeId":"ns=1;i=7840","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7840"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7842","parentNodeId":"ns=1;i=7840","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7840"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13541","parentNodeId":"ns=1;i=5060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7843","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasProperty","target":"ns=1;i=7844"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5060"},{"referenceType":"HasProperty","target":"ns=1;i=7845"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7844","parentNodeId":"ns=1;i=7843","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7843"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7845","parentNodeId":"ns=1;i=7843","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7843"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7846","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5060"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7847","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasProperty","target":"ns=1;i=7848"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7849"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5060"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7848","parentNodeId":"ns=1;i=7847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7847"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7849","parentNodeId":"ns=1;i=7847","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7847"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7850","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasProperty","target":"ns=1;i=7851"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5060"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7851","parentNodeId":"ns=1;i=7850","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7850"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7852","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5060"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7853","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5060"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7854","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5060"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7855","parentNodeId":"ns=1;i=5060","references":[{"referenceType":"HasProperty","target":"ns=1;i=7856"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5060"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7856","parentNodeId":"ns=1;i=7855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7855"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpNpshCurve","description":[{"value":"Relationship between the net positive suction head required and the rate of flow at given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpNpshCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5061","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7857"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7859"},{"referenceType":"HasProperty","target":"ns=1;i=13544"},{"referenceType":"HasComponent","target":"ns=1;i=7862"},{"referenceType":"HasProperty","target":"ns=1;i=7865"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=7866"},{"referenceType":"HasComponent","target":"ns=1;i=7869"},{"referenceType":"HasProperty","target":"ns=1;i=7871"},{"referenceType":"HasProperty","target":"ns=1;i=7872"},{"referenceType":"HasProperty","target":"ns=1;i=7873"},{"referenceType":"HasComponent","target":"ns=1;i=7874"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7857","parentNodeId":"ns=1;i=5061","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5061"},{"referenceType":"HasProperty","target":"ns=1;i=7858"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7858","parentNodeId":"ns=1;i=7857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7857"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7859","parentNodeId":"ns=1;i=5061","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5061"},{"referenceType":"HasProperty","target":"ns=1;i=7860"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7861"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7860","parentNodeId":"ns=1;i=7859","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7859"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7861","parentNodeId":"ns=1;i=7859","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7859"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13544","parentNodeId":"ns=1;i=5061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7862","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasProperty","target":"ns=1;i=7863"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5061"},{"referenceType":"HasProperty","target":"ns=1;i=7864"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7863","parentNodeId":"ns=1;i=7862","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7862"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7864","parentNodeId":"ns=1;i=7862","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7862"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7865","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5061"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7866","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasProperty","target":"ns=1;i=7867"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7868"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5061"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7867","parentNodeId":"ns=1;i=7866","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7866"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7868","parentNodeId":"ns=1;i=7866","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7866"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7869","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasProperty","target":"ns=1;i=7870"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5061"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7870","parentNodeId":"ns=1;i=7869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7869"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7871","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5061"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7872","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5061"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7873","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5061"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7874","parentNodeId":"ns=1;i=5061","references":[{"referenceType":"HasProperty","target":"ns=1;i=7875"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5061"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7875","parentNodeId":"ns=1;i=7874","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7874"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpPowerInputCurve","description":[{"value":"Relationship between the pump power input and the rate of flow given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpPowerInputCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5062","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7876"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7878"},{"referenceType":"HasProperty","target":"ns=1;i=13547"},{"referenceType":"HasComponent","target":"ns=1;i=7881"},{"referenceType":"HasProperty","target":"ns=1;i=7884"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=7885"},{"referenceType":"HasComponent","target":"ns=1;i=7888"},{"referenceType":"HasProperty","target":"ns=1;i=7890"},{"referenceType":"HasProperty","target":"ns=1;i=7891"},{"referenceType":"HasProperty","target":"ns=1;i=7892"},{"referenceType":"HasComponent","target":"ns=1;i=7893"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7876","parentNodeId":"ns=1;i=5062","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5062"},{"referenceType":"HasProperty","target":"ns=1;i=7877"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7877","parentNodeId":"ns=1;i=7876","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7876"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7878","parentNodeId":"ns=1;i=5062","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5062"},{"referenceType":"HasProperty","target":"ns=1;i=7879"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7880"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7879","parentNodeId":"ns=1;i=7878","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7878"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7880","parentNodeId":"ns=1;i=7878","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7878"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13547","parentNodeId":"ns=1;i=5062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7881","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasProperty","target":"ns=1;i=7882"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5062"},{"referenceType":"HasProperty","target":"ns=1;i=7883"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7882","parentNodeId":"ns=1;i=7881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7881"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7883","parentNodeId":"ns=1;i=7881","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7881"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7884","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5062"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7885","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasProperty","target":"ns=1;i=7886"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7887"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5062"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7886","parentNodeId":"ns=1;i=7885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7885"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7887","parentNodeId":"ns=1;i=7885","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7885"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7888","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasProperty","target":"ns=1;i=7889"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5062"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7889","parentNodeId":"ns=1;i=7888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7888"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7890","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5062"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7891","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5062"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7892","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5062"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7893","parentNodeId":"ns=1;i=5062","references":[{"referenceType":"HasProperty","target":"ns=1;i=7894"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5062"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7894","parentNodeId":"ns=1;i=7893","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7893"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:Shut_OffHead","dataType":"Double","description":[{"value":"Total head developed by the pump in a zero rate of flow"}],"displayName":[{"value":"Shut_OffHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7739","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13550"},{"referenceType":"HasProperty","target":"ns=1;i=13551"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13550","parentNodeId":"ns=1;i=7739","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7739"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13551","parentNodeId":"ns=1;i=7739","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7739"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Shut_OffPumpPowerInput","dataType":"Double","description":[{"value":"Pump power input at zero rate of flow"}],"displayName":[{"value":"Shut_OffPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7740","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13556"},{"referenceType":"HasProperty","target":"ns=1;i=13557"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13556","parentNodeId":"ns=1;i=7740","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7740"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13557","parentNodeId":"ns=1;i=7740","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7740"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SlipFlow","dataType":"Double","description":[{"value":"Flow lost internally through clearances"}],"displayName":[{"value":"SlipFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7741","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13562"},{"referenceType":"HasProperty","target":"ns=1;i=13563"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13562","parentNodeId":"ns=1;i=7741","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7741"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13563","parentNodeId":"ns=1;i=7741","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7741"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundEnergy","dataType":"Double","description":[{"value":"Integral of the sound power, P, over a stated time interval of duration T (starting at t1 and ending at t2)."}],"displayName":[{"value":"SoundEnergy"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7742","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13568"},{"referenceType":"HasProperty","target":"ns=1;i=13569"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13568","parentNodeId":"ns=1;i=7742","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7742"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13569","parentNodeId":"ns=1;i=7742","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7742"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundEnergyLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the sound energy, J, to a reference value, J0, expressed in decibels."}],"displayName":[{"value":"SoundEnergyLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7743","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13574"},{"referenceType":"HasProperty","target":"ns=1;i=13575"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13574","parentNodeId":"ns=1;i=7743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13575","parentNodeId":"ns=1;i=7743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPower","dataType":"Double","description":[{"value":"Through a surface, product of the sound pressure, p, and the component of the particle velocity, un, at a point on the surface in the direction normal to the surface, integrated over that surface."}],"displayName":[{"value":"SoundPower"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7744","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13580"},{"referenceType":"HasProperty","target":"ns=1;i=13581"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13580","parentNodeId":"ns=1;i=7744","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7744"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13581","parentNodeId":"ns=1;i=7744","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7744"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPowerLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the sound power of a source, P, to a reference value, P0, expressed in decibels."}],"displayName":[{"value":"SoundPowerLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7745","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13586"},{"referenceType":"HasProperty","target":"ns=1;i=13587"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13586","parentNodeId":"ns=1;i=7745","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7745"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13587","parentNodeId":"ns=1;i=7745","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7745"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPressure","dataType":"Double","description":[{"value":"Difference between instantaneous pressure and static pressure."}],"displayName":[{"value":"SoundPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7746","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13592"},{"referenceType":"HasProperty","target":"ns=1;i=13593"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13592","parentNodeId":"ns=1;i=7746","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7746"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13593","parentNodeId":"ns=1;i=7746","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7746"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPressureLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the square of the sound pressure, p, to the square of a reference value, p0, expressed in decibels."}],"displayName":[{"value":"SoundPressureLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7747","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13598"},{"referenceType":"HasProperty","target":"ns=1;i=13599"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13598","parentNodeId":"ns=1;i=7747","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7747"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13599","parentNodeId":"ns=1;i=7747","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7747"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SpecificSpeed","dataType":"Double","description":[{"value":"Speed that characterizes a pump in terms of its speed, flow rate per impeller eye, i.e. total flow for single-flow impeller, half flow for double-flow impeller, at the best efficiency point and head per stage at maximum impeller diameter"}],"displayName":[{"value":"SpecificSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7748","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13604"},{"referenceType":"HasProperty","target":"ns=1;i=13605"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13604","parentNodeId":"ns=1;i=7748","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7748"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13605","parentNodeId":"ns=1;i=7748","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7748"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:StablePumpH_Q_Curve","description":[{"value":"Pump H(Q) curve where the maximum head and shut-off head are coincidental, and the total head declines continuously as the rate of flow increases"}],"displayName":[{"value":"StablePumpH(Q)Curve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5063","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasComponent","target":"ns=1;i=7895"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7897"},{"referenceType":"HasProperty","target":"ns=1;i=13610"},{"referenceType":"HasComponent","target":"ns=1;i=7900"},{"referenceType":"HasProperty","target":"ns=1;i=7903"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7904"},{"referenceType":"HasComponent","target":"ns=1;i=7907"},{"referenceType":"HasProperty","target":"ns=1;i=7909"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"},{"referenceType":"HasProperty","target":"ns=1;i=7910"},{"referenceType":"HasProperty","target":"ns=1;i=7911"},{"referenceType":"HasComponent","target":"ns=1;i=7912"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7895","parentNodeId":"ns=1;i=5063","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5063"},{"referenceType":"HasProperty","target":"ns=1;i=7896"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7896","parentNodeId":"ns=1;i=7895","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7895"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7897","parentNodeId":"ns=1;i=5063","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5063"},{"referenceType":"HasProperty","target":"ns=1;i=7898"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7899"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7898","parentNodeId":"ns=1;i=7897","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7897"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7899","parentNodeId":"ns=1;i=7897","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7897"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13610","parentNodeId":"ns=1;i=5063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7900","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasProperty","target":"ns=1;i=7901"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5063"},{"referenceType":"HasProperty","target":"ns=1;i=7902"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7901","parentNodeId":"ns=1;i=7900","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7900"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7902","parentNodeId":"ns=1;i=7900","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7900"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7903","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5063"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7904","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasProperty","target":"ns=1;i=7905"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=7906"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5063"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7905","parentNodeId":"ns=1;i=7904","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7904"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7906","parentNodeId":"ns=1;i=7904","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7904"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7907","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasProperty","target":"ns=1;i=7908"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5063"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7908","parentNodeId":"ns=1;i=7907","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7907"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7909","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5063"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7910","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5063"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7911","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5063"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7912","parentNodeId":"ns=1;i=5063","references":[{"referenceType":"HasProperty","target":"ns=1;i=7913"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5063"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7913","parentNodeId":"ns=1;i=7912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7912"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:StandardGasFlowrate","dataType":"Double","description":[{"value":"Volume flow rate at standard reference conditions, i.e. 0 \u00B0C and 101 325 Pa"}],"displayName":[{"value":"StandardGasFlowrate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7749","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13613"},{"referenceType":"HasProperty","target":"ns=1;i=13614"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13613","parentNodeId":"ns=1;i=7749","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7749"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13614","parentNodeId":"ns=1;i=7749","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7749"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:StartingPressure","dataType":"Double","description":[{"value":"The starting pressure is the pressure at which a vacuum pump can be switched on and a pumping effect is achieved without damage occurring."}],"displayName":[{"value":"StartingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7750","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13619"},{"referenceType":"HasProperty","target":"ns=1;i=13620"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13619","parentNodeId":"ns=1;i=7750","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7750"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13620","parentNodeId":"ns=1;i=7750","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7750"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Suction_SpecificSpeed","dataType":"Double","description":[{"value":"Speed that characterizes a pump\u0027s cavitation performance in terms of its speed, optimum rate of flow per impeller eye at best efficiency point and NPSH3 at best efficiency point for the first stage at maximum impeller diameter"}],"displayName":[{"value":"Suction_SpecificSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7751","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13625"},{"referenceType":"HasProperty","target":"ns=1;i=13626"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13625","parentNodeId":"ns=1;i=7751","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7751"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13626","parentNodeId":"ns=1;i=7751","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7751"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SweptVolume","dataType":"Double","description":[{"value":"Volume traversed by a single stroke of piston, plunger or diaphragm."}],"displayName":[{"value":"SweptVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7752","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13631"},{"referenceType":"HasProperty","target":"ns=1;i=13632"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13631","parentNodeId":"ns=1;i=7752","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7752"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13632","parentNodeId":"ns=1;i=7752","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7752"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:TripSpeed","dataType":"Double","description":[{"value":"Speed at which the independent emergency overspeed devices operate to shut down a prime mover"}],"displayName":[{"value":"TripSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7753","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13637"},{"referenceType":"HasProperty","target":"ns=1;i=13638"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13637","parentNodeId":"ns=1;i=7753","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7753"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13638","parentNodeId":"ns=1;i=7753","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7753"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:TypeNumber","dataType":"Double","description":[{"value":"Pure number calculated at the point of best efficiency"}],"displayName":[{"value":"TypeNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7780","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13643"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13643","parentNodeId":"ns=1;i=7780","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7780"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:VolumeFlowRate","dataType":"Double","description":[{"value":"Volume flow rate of the gas removed by the pump from the gas phase within the evacuated chamber."}],"displayName":[{"value":"VolumeFlowRate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7754","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13646"},{"referenceType":"HasProperty","target":"ns=1;i=13647"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13646","parentNodeId":"ns=1;i=7754","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7754"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13647","parentNodeId":"ns=1;i=7754","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7754"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:VolumeFlowRateOfBackingPump","dataType":"Double","description":[{"value":"Maximum volume flow rate for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump"}],"displayName":[{"value":"VolumeFlowRateOfBackingPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7755","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13652"},{"referenceType":"HasProperty","target":"ns=1;i=13653"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13652","parentNodeId":"ns=1;i=7755","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7755"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13653","parentNodeId":"ns=1;i=7755","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7755"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WarmUpTimeForAVaporJetPumpOrADiffusionPump","dataType":"Double","description":[{"value":"The warm-up time is the time required to heat the blowing agent in the boiling vessel to its working temperature. The initial temperature can either be equal to the ambient temperature or equal to the temperature at which the blowing agent of the vacuum pump can be exposed to atmospheric air without risk."}],"displayName":[{"value":"WarmUpTimeForAVaporJetPumpOrADiffusionPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7756","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13658"},{"referenceType":"HasProperty","target":"ns=1;i=13659"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13658","parentNodeId":"ns=1;i=7756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7756"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13659","parentNodeId":"ns=1;i=7756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7756"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WaterVaporTolerableLoad","dataType":"Double","description":[{"value":"The mass flow rate for water vapor, in a gas ballast pump, in continuous operation and under normal ambient conditions, if the pumped gas is pure water vapor."}],"displayName":[{"value":"WaterVaporTolerableLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7757","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13664"},{"referenceType":"HasProperty","target":"ns=1;i=13665"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13664","parentNodeId":"ns=1;i=7757","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7757"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13665","parentNodeId":"ns=1;i=7757","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7757"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WetCriticalSpeed","dataType":"Double","description":[{"value":"Rotor resonant frequency calculated considering the additional support and damping produced by the action of the pumped fluid within rotor"}],"displayName":[{"value":"WetCriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7758","parentNodeId":"ns=1;i=1020","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13670"},{"referenceType":"HasProperty","target":"ns=1;i=13671"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1020"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13670","parentNodeId":"ns=1;i=7758","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7758"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13671","parentNodeId":"ns=1;i=7758","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7758"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DocumentationType","displayName":[{"value":"DocumentationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.5","nodeClass":"ObjectType","nodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=5024"},{"referenceType":"HasComponent","target":"ns=1;i=6109"},{"referenceType":"HasComponent","target":"ns=1;i=5025"},{"referenceType":"HasComponent","target":"ns=1;i=6110"},{"referenceType":"HasComponent","target":"ns=1;i=5026"},{"referenceType":"HasComponent","target":"ns=1;i=6406"},{"referenceType":"HasComponent","target":"ns=1;i=5027"},{"referenceType":"HasComponent","target":"ns=1;i=6407"},{"referenceType":"HasComponent","target":"ns=1;i=5028"},{"referenceType":"HasComponent","target":"ns=1;i=6408"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=5040"},{"referenceType":"HasComponent","target":"ns=1;i=6409"},{"referenceType":"HasComponent","target":"ns=1;i=5043"},{"referenceType":"HasComponent","target":"ns=1;i=6410"},{"referenceType":"HasComponent","target":"ns=1;i=5029"},{"referenceType":"HasComponent","target":"ns=1;i=6411"},{"referenceType":"HasComponent","target":"ns=1;i=5030"},{"referenceType":"HasComponent","target":"ns=1;i=6412"},{"referenceType":"HasComponent","target":"ns=1;i=5031"},{"referenceType":"HasComponent","target":"ns=1;i=6413"},{"referenceType":"HasComponent","target":"ns=1;i=5032"},{"referenceType":"HasComponent","target":"ns=1;i=6414"},{"referenceType":"HasComponent","target":"ns=1;i=5033"},{"referenceType":"HasComponent","target":"ns=1;i=6415"},{"referenceType":"HasComponent","target":"ns=1;i=5034"},{"referenceType":"HasComponent","target":"ns=1;i=6416"},{"referenceType":"HasComponent","target":"ns=1;i=5041"},{"referenceType":"HasComponent","target":"ns=1;i=6417"},{"referenceType":"HasComponent","target":"ns=1;i=5035"},{"referenceType":"HasComponent","target":"ns=1;i=6418"},{"referenceType":"HasComponent","target":"ns=1;i=5044"},{"referenceType":"HasComponent","target":"ns=1;i=6419"},{"referenceType":"HasComponent","target":"ns=1;i=5036"},{"referenceType":"HasComponent","target":"ns=1;i=6420"},{"referenceType":"HasComponent","target":"ns=1;i=5045"},{"referenceType":"HasComponent","target":"ns=1;i=6421"},{"referenceType":"HasComponent","target":"ns=1;i=5042"},{"referenceType":"HasComponent","target":"ns=1;i=6422"},{"referenceType":"HasComponent","target":"ns=1;i=5037"},{"referenceType":"HasComponent","target":"ns=1;i=6423"},{"referenceType":"HasComponent","target":"ns=1;i=5038"},{"referenceType":"HasComponent","target":"ns=1;i=6424"},{"referenceType":"HasComponent","target":"ns=1;i=5039"},{"referenceType":"HasComponent","target":"ns=1;i=6425"}],"superType":"ns=3;i=1005"},{"browseName":"1:Arrangements","description":[{"value":"Drawing showing replacement components layout for an item."}],"displayName":[{"value":"Arrangements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5024","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=7019"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7020"},{"referenceType":"HasProperty","target":"ns=1;i=6111"},{"referenceType":"HasComponent","target":"ns=1;i=7021"},{"referenceType":"HasProperty","target":"ns=1;i=6101"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7022"},{"referenceType":"HasComponent","target":"ns=1;i=7023"},{"referenceType":"HasProperty","target":"ns=1;i=6105"},{"referenceType":"HasProperty","target":"ns=1;i=6106"},{"referenceType":"HasProperty","target":"ns=1;i=6107"},{"referenceType":"HasComponent","target":"ns=1;i=7024"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7019","parentNodeId":"ns=1;i=5024","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5024"},{"referenceType":"HasProperty","target":"ns=1;i=6096"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6096","parentNodeId":"ns=1;i=7019","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7019"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7020","parentNodeId":"ns=1;i=5024","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5024"},{"referenceType":"HasProperty","target":"ns=1;i=6097"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6098"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6097","parentNodeId":"ns=1;i=7020","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7020"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6098","parentNodeId":"ns=1;i=7020","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7020"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6111","parentNodeId":"ns=1;i=5024","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5024"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7021","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasProperty","target":"ns=1;i=6099"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5024"},{"referenceType":"HasProperty","target":"ns=1;i=6100"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6099","parentNodeId":"ns=1;i=7021","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7021"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6100","parentNodeId":"ns=1;i=7021","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7021"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6101","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5024"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7022","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasProperty","target":"ns=1;i=6102"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6103"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5024"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6102","parentNodeId":"ns=1;i=7022","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7022"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6103","parentNodeId":"ns=1;i=7022","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7022"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7023","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasProperty","target":"ns=1;i=6104"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5024"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6104","parentNodeId":"ns=1;i=7023","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7023"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6105","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5024"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6106","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5024"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6107","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5024"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7024","parentNodeId":"ns=1;i=5024","references":[{"referenceType":"HasProperty","target":"ns=1;i=6108"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5024"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6108","parentNodeId":"ns=1;i=7024","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7024"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ArrangementsLink","dataType":"String","description":[{"value":"Drawing showing replacement components layout for an item."}],"displayName":[{"value":"ArrangementsLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6109","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6426"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6426","parentNodeId":"ns=1;i=6109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Certificates","description":[{"value":"Specific safety and statutory regulations certificates for items (lifting equipment, steam boilers, pressure vessels,...)."}],"displayName":[{"value":"Certificates"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5025","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=7025"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7026"},{"referenceType":"HasProperty","target":"ns=1;i=6385"},{"referenceType":"HasComponent","target":"ns=1;i=7027"},{"referenceType":"HasProperty","target":"ns=1;i=6117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7028"},{"referenceType":"HasComponent","target":"ns=1;i=7029"},{"referenceType":"HasProperty","target":"ns=1;i=6121"},{"referenceType":"HasProperty","target":"ns=1;i=6122"},{"referenceType":"HasProperty","target":"ns=1;i=6123"},{"referenceType":"HasComponent","target":"ns=1;i=7030"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7025","parentNodeId":"ns=1;i=5025","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5025"},{"referenceType":"HasProperty","target":"ns=1;i=6112"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6112","parentNodeId":"ns=1;i=7025","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7025"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7026","parentNodeId":"ns=1;i=5025","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5025"},{"referenceType":"HasProperty","target":"ns=1;i=6113"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6114"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6113","parentNodeId":"ns=1;i=7026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7026"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6114","parentNodeId":"ns=1;i=7026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7026"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6385","parentNodeId":"ns=1;i=5025","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5025"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7027","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasProperty","target":"ns=1;i=6115"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5025"},{"referenceType":"HasProperty","target":"ns=1;i=6116"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6115","parentNodeId":"ns=1;i=7027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7027"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6116","parentNodeId":"ns=1;i=7027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7027"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6117","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5025"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7028","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasProperty","target":"ns=1;i=6118"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6119"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5025"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6118","parentNodeId":"ns=1;i=7028","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7028"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6119","parentNodeId":"ns=1;i=7028","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7028"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7029","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasProperty","target":"ns=1;i=6120"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5025"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6120","parentNodeId":"ns=1;i=7029","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7029"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6121","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5025"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6122","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5025"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6123","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5025"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7030","parentNodeId":"ns=1;i=5025","references":[{"referenceType":"HasProperty","target":"ns=1;i=6124"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5025"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6124","parentNodeId":"ns=1;i=7030","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7030"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:CertificatesLink","dataType":"String","description":[{"value":"Specific safety and statutory regulations certificates for items (lifting equipment, steam boilers, pressure vessels,...)."}],"displayName":[{"value":"CertificatesLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6110","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6427"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6427","parentNodeId":"ns=1;i=6110","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6110"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:CircuitDiagram","description":[{"value":"Overall feeder and control circuits diagram."}],"displayName":[{"value":"CircuitDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5026","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=7031"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7032"},{"referenceType":"HasProperty","target":"ns=1;i=6387"},{"referenceType":"HasComponent","target":"ns=1;i=7033"},{"referenceType":"HasProperty","target":"ns=1;i=6130"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7034"},{"referenceType":"HasComponent","target":"ns=1;i=7035"},{"referenceType":"HasProperty","target":"ns=1;i=6134"},{"referenceType":"HasProperty","target":"ns=1;i=6135"},{"referenceType":"HasProperty","target":"ns=1;i=6136"},{"referenceType":"HasComponent","target":"ns=1;i=7036"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7031","parentNodeId":"ns=1;i=5026","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5026"},{"referenceType":"HasProperty","target":"ns=1;i=6125"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6125","parentNodeId":"ns=1;i=7031","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7031"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7032","parentNodeId":"ns=1;i=5026","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5026"},{"referenceType":"HasProperty","target":"ns=1;i=6126"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6127"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6126","parentNodeId":"ns=1;i=7032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7032"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6127","parentNodeId":"ns=1;i=7032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7032"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6387","parentNodeId":"ns=1;i=5026","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5026"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7033","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasProperty","target":"ns=1;i=6128"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5026"},{"referenceType":"HasProperty","target":"ns=1;i=6129"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6128","parentNodeId":"ns=1;i=7033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7033"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6129","parentNodeId":"ns=1;i=7033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7033"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6130","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5026"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7034","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasProperty","target":"ns=1;i=6131"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6132"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5026"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6131","parentNodeId":"ns=1;i=7034","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7034"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6132","parentNodeId":"ns=1;i=7034","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7034"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7035","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasProperty","target":"ns=1;i=6133"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5026"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6133","parentNodeId":"ns=1;i=7035","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7035"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6134","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5026"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6135","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5026"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6136","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5026"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7036","parentNodeId":"ns=1;i=5026","references":[{"referenceType":"HasProperty","target":"ns=1;i=6137"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5026"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6137","parentNodeId":"ns=1;i=7036","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7036"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:CircuitDiagramLink","dataType":"String","description":[{"value":"Overall feeder and control circuits diagram."}],"displayName":[{"value":"CircuitDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6406","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6428"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6428","parentNodeId":"ns=1;i=6406","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6406"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ComponentsList","description":[{"value":"Comprehensive list of items which constitute part of another one."}],"displayName":[{"value":"ComponentsList"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5027","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7037"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7038"},{"referenceType":"HasProperty","target":"ns=1;i=6386"},{"referenceType":"HasComponent","target":"ns=1;i=7039"},{"referenceType":"HasProperty","target":"ns=1;i=6143"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7040"},{"referenceType":"HasComponent","target":"ns=1;i=7041"},{"referenceType":"HasProperty","target":"ns=1;i=6147"},{"referenceType":"HasProperty","target":"ns=1;i=6148"},{"referenceType":"HasProperty","target":"ns=1;i=6149"},{"referenceType":"HasComponent","target":"ns=1;i=7042"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7037","parentNodeId":"ns=1;i=5027","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5027"},{"referenceType":"HasProperty","target":"ns=1;i=6138"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6138","parentNodeId":"ns=1;i=7037","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7037"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7038","parentNodeId":"ns=1;i=5027","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5027"},{"referenceType":"HasProperty","target":"ns=1;i=6139"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6140"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6139","parentNodeId":"ns=1;i=7038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7038"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6140","parentNodeId":"ns=1;i=7038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7038"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6386","parentNodeId":"ns=1;i=5027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5027"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7039","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasProperty","target":"ns=1;i=6141"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5027"},{"referenceType":"HasProperty","target":"ns=1;i=6142"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6141","parentNodeId":"ns=1;i=7039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7039"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6142","parentNodeId":"ns=1;i=7039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7039"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6143","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5027"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7040","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasProperty","target":"ns=1;i=6144"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6145"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5027"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6144","parentNodeId":"ns=1;i=7040","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7040"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6145","parentNodeId":"ns=1;i=7040","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7040"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7041","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasProperty","target":"ns=1;i=6146"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5027"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6146","parentNodeId":"ns=1;i=7041","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7041"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6147","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5027"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6148","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5027"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6149","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5027"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7042","parentNodeId":"ns=1;i=5027","references":[{"referenceType":"HasProperty","target":"ns=1;i=6150"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5027"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6150","parentNodeId":"ns=1;i=7042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7042"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ComponentsListLink","dataType":"String","description":[{"value":"Comprehensive list of items which constitute part of another one."}],"displayName":[{"value":"ComponentsListLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6407","parentNodeId":"ns=1;i=1006","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6429"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6429","parentNodeId":"ns=1;i=6407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Detail","description":[{"value":"Drawing with part list to ensure dismantling, repair and assembly of items."}],"displayName":[{"value":"Detail"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5028","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7043"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7044"},{"referenceType":"HasProperty","target":"ns=1;i=6388"},{"referenceType":"HasComponent","target":"ns=1;i=7045"},{"referenceType":"HasProperty","target":"ns=1;i=6156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7046"},{"referenceType":"HasComponent","target":"ns=1;i=7047"},{"referenceType":"HasProperty","target":"ns=1;i=6160"},{"referenceType":"HasProperty","target":"ns=1;i=6161"},{"referenceType":"HasProperty","target":"ns=1;i=6162"},{"referenceType":"HasComponent","target":"ns=1;i=7048"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7043","parentNodeId":"ns=1;i=5028","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5028"},{"referenceType":"HasProperty","target":"ns=1;i=6151"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6151","parentNodeId":"ns=1;i=7043","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7043"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7044","parentNodeId":"ns=1;i=5028","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5028"},{"referenceType":"HasProperty","target":"ns=1;i=6152"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6153"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6152","parentNodeId":"ns=1;i=7044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7044"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6153","parentNodeId":"ns=1;i=7044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7044"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6388","parentNodeId":"ns=1;i=5028","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5028"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7045","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasProperty","target":"ns=1;i=6154"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5028"},{"referenceType":"HasProperty","target":"ns=1;i=6155"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6154","parentNodeId":"ns=1;i=7045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7045"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6155","parentNodeId":"ns=1;i=7045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7045"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6156","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5028"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7046","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasProperty","target":"ns=1;i=6157"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6158"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5028"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6157","parentNodeId":"ns=1;i=7046","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7046"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6158","parentNodeId":"ns=1;i=7046","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7046"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7047","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasProperty","target":"ns=1;i=6159"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5028"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6159","parentNodeId":"ns=1;i=7047","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7047"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6160","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5028"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6161","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5028"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6162","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5028"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7048","parentNodeId":"ns=1;i=5028","references":[{"referenceType":"HasProperty","target":"ns=1;i=6163"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5028"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6163","parentNodeId":"ns=1;i=7048","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7048"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:DetailLink","dataType":"String","description":[{"value":"Drawing with part list to ensure dismantling, repair and assembly of items."}],"displayName":[{"value":"DetailLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6408","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6430"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6430","parentNodeId":"ns=1;i=6408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DuringMaintenanceServicesRendered","description":[{"value":"Final and/or interim report on services provided"}],"displayName":[{"value":"DuringMaintenanceServicesRendered"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5040","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7115"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7116"},{"referenceType":"HasProperty","target":"ns=1;i=6389"},{"referenceType":"HasComponent","target":"ns=1;i=7117"},{"referenceType":"HasProperty","target":"ns=1;i=6312"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7118"},{"referenceType":"HasComponent","target":"ns=1;i=7119"},{"referenceType":"HasProperty","target":"ns=1;i=6316"},{"referenceType":"HasProperty","target":"ns=1;i=6317"},{"referenceType":"HasProperty","target":"ns=1;i=6318"},{"referenceType":"HasComponent","target":"ns=1;i=7120"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7115","parentNodeId":"ns=1;i=5040","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5040"},{"referenceType":"HasProperty","target":"ns=1;i=6307"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6307","parentNodeId":"ns=1;i=7115","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7115"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7116","parentNodeId":"ns=1;i=5040","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5040"},{"referenceType":"HasProperty","target":"ns=1;i=6308"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6309"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6308","parentNodeId":"ns=1;i=7116","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7116"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6309","parentNodeId":"ns=1;i=7116","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7116"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6389","parentNodeId":"ns=1;i=5040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7117","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasProperty","target":"ns=1;i=6310"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5040"},{"referenceType":"HasProperty","target":"ns=1;i=6311"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6310","parentNodeId":"ns=1;i=7117","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7117"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6311","parentNodeId":"ns=1;i=7117","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7117"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6312","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5040"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7118","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasProperty","target":"ns=1;i=6313"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6314"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5040"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6313","parentNodeId":"ns=1;i=7118","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7118"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6314","parentNodeId":"ns=1;i=7118","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7118"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7119","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasProperty","target":"ns=1;i=6315"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5040"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6315","parentNodeId":"ns=1;i=7119","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7119"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6316","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5040"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6317","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5040"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6318","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5040"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7120","parentNodeId":"ns=1;i=5040","references":[{"referenceType":"HasProperty","target":"ns=1;i=6319"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5040"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6319","parentNodeId":"ns=1;i=7120","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7120"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:DuringMaintenanceServicesRenderedLink","dataType":"String","description":[{"value":"Final and/or interim report on services provided"}],"displayName":[{"value":"DuringMaintenanceServicesRenderedLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6409","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6431"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6431","parentNodeId":"ns=1;i=6409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ImplementationDescription","description":[{"value":"Explanation of the work carried out"}],"displayName":[{"value":"ImplementationDescription"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5043","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7133"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7134"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6390"},{"referenceType":"HasComponent","target":"ns=1;i=7135"},{"referenceType":"HasProperty","target":"ns=1;i=6351"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7136"},{"referenceType":"HasComponent","target":"ns=1;i=7137"},{"referenceType":"HasProperty","target":"ns=1;i=6355"},{"referenceType":"HasProperty","target":"ns=1;i=6356"},{"referenceType":"HasProperty","target":"ns=1;i=6357"},{"referenceType":"HasComponent","target":"ns=1;i=7138"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7133","parentNodeId":"ns=1;i=5043","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5043"},{"referenceType":"HasProperty","target":"ns=1;i=6346"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6346","parentNodeId":"ns=1;i=7133","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7133"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7134","parentNodeId":"ns=1;i=5043","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5043"},{"referenceType":"HasProperty","target":"ns=1;i=6347"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6348"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6347","parentNodeId":"ns=1;i=7134","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7134"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6348","parentNodeId":"ns=1;i=7134","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7134"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6390","parentNodeId":"ns=1;i=5043","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5043"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7135","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasProperty","target":"ns=1;i=6349"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5043"},{"referenceType":"HasProperty","target":"ns=1;i=6350"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6349","parentNodeId":"ns=1;i=7135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7135"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6350","parentNodeId":"ns=1;i=7135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7135"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6351","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5043"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7136","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasProperty","target":"ns=1;i=6352"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6353"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5043"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6352","parentNodeId":"ns=1;i=7136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7136"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6353","parentNodeId":"ns=1;i=7136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7136"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7137","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasProperty","target":"ns=1;i=6354"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5043"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6354","parentNodeId":"ns=1;i=7137","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7137"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6355","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5043"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6356","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5043"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6357","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5043"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7138","parentNodeId":"ns=1;i=5043","references":[{"referenceType":"HasProperty","target":"ns=1;i=6358"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5043"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6358","parentNodeId":"ns=1;i=7138","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7138"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ImplementationDescriptionLink","dataType":"String","description":[{"value":"Explanation of the work carried out"}],"displayName":[{"value":"ImplementationDescriptionLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6410","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6432"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6432","parentNodeId":"ns=1;i=6410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Layout","description":[{"value":"Drawing showing all areas of a particular plant."}],"displayName":[{"value":"Layout"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5029","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7049"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7050"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6391"},{"referenceType":"HasComponent","target":"ns=1;i=7051"},{"referenceType":"HasProperty","target":"ns=1;i=6169"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7052"},{"referenceType":"HasComponent","target":"ns=1;i=7053"},{"referenceType":"HasProperty","target":"ns=1;i=6173"},{"referenceType":"HasProperty","target":"ns=1;i=6174"},{"referenceType":"HasProperty","target":"ns=1;i=6175"},{"referenceType":"HasComponent","target":"ns=1;i=7054"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7049","parentNodeId":"ns=1;i=5029","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5029"},{"referenceType":"HasProperty","target":"ns=1;i=6164"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6164","parentNodeId":"ns=1;i=7049","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7049"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7050","parentNodeId":"ns=1;i=5029","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5029"},{"referenceType":"HasProperty","target":"ns=1;i=6165"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6166"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6165","parentNodeId":"ns=1;i=7050","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7050"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6166","parentNodeId":"ns=1;i=7050","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7050"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6391","parentNodeId":"ns=1;i=5029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7051","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasProperty","target":"ns=1;i=6167"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5029"},{"referenceType":"HasProperty","target":"ns=1;i=6168"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6167","parentNodeId":"ns=1;i=7051","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7051"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6168","parentNodeId":"ns=1;i=7051","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7051"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6169","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5029"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7052","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasProperty","target":"ns=1;i=6170"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6171"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5029"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6170","parentNodeId":"ns=1;i=7052","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7052"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6171","parentNodeId":"ns=1;i=7052","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7052"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7053","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasProperty","target":"ns=1;i=6172"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5029"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6172","parentNodeId":"ns=1;i=7053","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7053"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6173","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5029"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6174","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5029"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6175","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5029"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7054","parentNodeId":"ns=1;i=5029","references":[{"referenceType":"HasProperty","target":"ns=1;i=6176"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5029"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6176","parentNodeId":"ns=1;i=7054","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7054"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LayoutLink","dataType":"String","description":[{"value":"Drawing showing all areas of a particular plant."}],"displayName":[{"value":"LayoutLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6411","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6433"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6433","parentNodeId":"ns=1;i=6411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Location","description":[{"value":"Drawing showing the position of all field items within the considered area."}],"displayName":[{"value":"Location"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5030","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7055"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7056"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6392"},{"referenceType":"HasComponent","target":"ns=1;i=7057"},{"referenceType":"HasProperty","target":"ns=1;i=6182"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7058"},{"referenceType":"HasComponent","target":"ns=1;i=7059"},{"referenceType":"HasProperty","target":"ns=1;i=6186"},{"referenceType":"HasProperty","target":"ns=1;i=6187"},{"referenceType":"HasProperty","target":"ns=1;i=6188"},{"referenceType":"HasComponent","target":"ns=1;i=7060"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7055","parentNodeId":"ns=1;i=5030","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5030"},{"referenceType":"HasProperty","target":"ns=1;i=6177"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6177","parentNodeId":"ns=1;i=7055","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7055"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7056","parentNodeId":"ns=1;i=5030","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5030"},{"referenceType":"HasProperty","target":"ns=1;i=6178"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6179"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6178","parentNodeId":"ns=1;i=7056","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7056"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6179","parentNodeId":"ns=1;i=7056","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7056"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6392","parentNodeId":"ns=1;i=5030","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5030"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7057","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasProperty","target":"ns=1;i=6180"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5030"},{"referenceType":"HasProperty","target":"ns=1;i=6181"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6180","parentNodeId":"ns=1;i=7057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7057"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6181","parentNodeId":"ns=1;i=7057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7057"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6182","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5030"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7058","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasProperty","target":"ns=1;i=6183"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6184"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5030"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6183","parentNodeId":"ns=1;i=7058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7058"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6184","parentNodeId":"ns=1;i=7058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7058"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7059","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasProperty","target":"ns=1;i=6185"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5030"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6185","parentNodeId":"ns=1;i=7059","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7059"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6186","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5030"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6187","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5030"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6188","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5030"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7060","parentNodeId":"ns=1;i=5030","references":[{"referenceType":"HasProperty","target":"ns=1;i=6189"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5030"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6189","parentNodeId":"ns=1;i=7060","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7060"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LocationLink","dataType":"String","description":[{"value":"Drawing showing the position of all field items within the considered area."}],"displayName":[{"value":"LocationLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6412","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6434"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6434","parentNodeId":"ns=1;i=6412","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6412"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:LogicDiagram","description":[{"value":"System control diagram to clarify the overall system logic."}],"displayName":[{"value":"LogicDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5031","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7061"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7062"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6393"},{"referenceType":"HasComponent","target":"ns=1;i=7063"},{"referenceType":"HasProperty","target":"ns=1;i=6195"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7064"},{"referenceType":"HasComponent","target":"ns=1;i=7065"},{"referenceType":"HasProperty","target":"ns=1;i=6199"},{"referenceType":"HasProperty","target":"ns=1;i=6200"},{"referenceType":"HasProperty","target":"ns=1;i=6201"},{"referenceType":"HasComponent","target":"ns=1;i=7066"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7061","parentNodeId":"ns=1;i=5031","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5031"},{"referenceType":"HasProperty","target":"ns=1;i=6190"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6190","parentNodeId":"ns=1;i=7061","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7061"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7062","parentNodeId":"ns=1;i=5031","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5031"},{"referenceType":"HasProperty","target":"ns=1;i=6191"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6192"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6191","parentNodeId":"ns=1;i=7062","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7062"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6192","parentNodeId":"ns=1;i=7062","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7062"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6393","parentNodeId":"ns=1;i=5031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7063","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasProperty","target":"ns=1;i=6193"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5031"},{"referenceType":"HasProperty","target":"ns=1;i=6194"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6193","parentNodeId":"ns=1;i=7063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7063"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6194","parentNodeId":"ns=1;i=7063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7063"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6195","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5031"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7064","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasProperty","target":"ns=1;i=6196"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6197"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5031"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6196","parentNodeId":"ns=1;i=7064","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7064"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6197","parentNodeId":"ns=1;i=7064","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7064"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7065","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasProperty","target":"ns=1;i=6198"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5031"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6198","parentNodeId":"ns=1;i=7065","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7065"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6199","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5031"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6200","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5031"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6201","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5031"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7066","parentNodeId":"ns=1;i=5031","references":[{"referenceType":"HasProperty","target":"ns=1;i=6202"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5031"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6202","parentNodeId":"ns=1;i=7066","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7066"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LogicDiagramLink","dataType":"String","description":[{"value":"System control diagram to clarify the overall system logic."}],"displayName":[{"value":"LogicDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6413","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6435"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6435","parentNodeId":"ns=1;i=6413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:LubricationMap","description":[{"value":"Drawing showing position of each item lubrication point, with lubrication data and specifications."}],"displayName":[{"value":"LubricationMap"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5032","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7067"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7068"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6394"},{"referenceType":"HasComponent","target":"ns=1;i=7069"},{"referenceType":"HasProperty","target":"ns=1;i=6208"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7070"},{"referenceType":"HasComponent","target":"ns=1;i=7071"},{"referenceType":"HasProperty","target":"ns=1;i=6212"},{"referenceType":"HasProperty","target":"ns=1;i=6213"},{"referenceType":"HasProperty","target":"ns=1;i=6214"},{"referenceType":"HasComponent","target":"ns=1;i=7072"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7067","parentNodeId":"ns=1;i=5032","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5032"},{"referenceType":"HasProperty","target":"ns=1;i=6203"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6203","parentNodeId":"ns=1;i=7067","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7067"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7068","parentNodeId":"ns=1;i=5032","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5032"},{"referenceType":"HasProperty","target":"ns=1;i=6204"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6205"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6204","parentNodeId":"ns=1;i=7068","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7068"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6205","parentNodeId":"ns=1;i=7068","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7068"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6394","parentNodeId":"ns=1;i=5032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7069","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasProperty","target":"ns=1;i=6206"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5032"},{"referenceType":"HasProperty","target":"ns=1;i=6207"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6206","parentNodeId":"ns=1;i=7069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7069"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6207","parentNodeId":"ns=1;i=7069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7069"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6208","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5032"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7070","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasProperty","target":"ns=1;i=6209"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6210"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5032"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6209","parentNodeId":"ns=1;i=7070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7070"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6210","parentNodeId":"ns=1;i=7070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7070"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7071","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasProperty","target":"ns=1;i=6211"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5032"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6211","parentNodeId":"ns=1;i=7071","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7071"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6212","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5032"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6213","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5032"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6214","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5032"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7072","parentNodeId":"ns=1;i=5032","references":[{"referenceType":"HasProperty","target":"ns=1;i=6215"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5032"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6215","parentNodeId":"ns=1;i=7072","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7072"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LubricationMapLink","dataType":"String","description":[{"value":"Drawing showing position of each item lubrication point, with lubrication data and specifications."}],"displayName":[{"value":"LubricationMapLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6414","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6436"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6436","parentNodeId":"ns=1;i=6414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceManual","description":[{"value":"Technical instructions intended to preserve an item in, or restore it to, a state in which it can perform a required function."}],"displayName":[{"value":"MaintenanceManual"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5033","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7073"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7074"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6395"},{"referenceType":"HasComponent","target":"ns=1;i=7075"},{"referenceType":"HasProperty","target":"ns=1;i=6221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7076"},{"referenceType":"HasComponent","target":"ns=1;i=7077"},{"referenceType":"HasProperty","target":"ns=1;i=6225"},{"referenceType":"HasProperty","target":"ns=1;i=6226"},{"referenceType":"HasProperty","target":"ns=1;i=6227"},{"referenceType":"HasComponent","target":"ns=1;i=7078"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7073","parentNodeId":"ns=1;i=5033","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5033"},{"referenceType":"HasProperty","target":"ns=1;i=6216"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6216","parentNodeId":"ns=1;i=7073","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7073"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7074","parentNodeId":"ns=1;i=5033","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5033"},{"referenceType":"HasProperty","target":"ns=1;i=6217"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6218"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6217","parentNodeId":"ns=1;i=7074","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7074"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6218","parentNodeId":"ns=1;i=7074","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7074"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6395","parentNodeId":"ns=1;i=5033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7075","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasProperty","target":"ns=1;i=6219"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5033"},{"referenceType":"HasProperty","target":"ns=1;i=6220"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6219","parentNodeId":"ns=1;i=7075","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7075"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6220","parentNodeId":"ns=1;i=7075","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7075"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6221","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5033"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7076","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasProperty","target":"ns=1;i=6222"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6223"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5033"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6222","parentNodeId":"ns=1;i=7076","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7076"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6223","parentNodeId":"ns=1;i=7076","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7076"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7077","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasProperty","target":"ns=1;i=6224"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5033"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6224","parentNodeId":"ns=1;i=7077","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7077"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6225","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5033"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6226","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5033"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6227","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5033"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7078","parentNodeId":"ns=1;i=5033","references":[{"referenceType":"HasProperty","target":"ns=1;i=6228"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5033"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6228","parentNodeId":"ns=1;i=7078","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7078"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:MaintenanceManualLink","dataType":"String","description":[{"value":"Technical instructions intended to preserve an item in, or restore it to, a state in which it can perform a required function."}],"displayName":[{"value":"MaintenanceManualLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6415","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6437"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6437","parentNodeId":"ns=1;i=6415","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperationManual","description":[{"value":"Technical instructions to reach a proper item function performance according to its technical specifications and safety conditions."}],"displayName":[{"value":"OperationManual"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5034","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7079"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7080"},{"referenceType":"HasProperty","target":"ns=1;i=6396"},{"referenceType":"HasComponent","target":"ns=1;i=7081"},{"referenceType":"HasProperty","target":"ns=1;i=6234"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7082"},{"referenceType":"HasComponent","target":"ns=1;i=7083"},{"referenceType":"HasProperty","target":"ns=1;i=6238"},{"referenceType":"HasProperty","target":"ns=1;i=6239"},{"referenceType":"HasProperty","target":"ns=1;i=6240"},{"referenceType":"HasComponent","target":"ns=1;i=7084"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7079","parentNodeId":"ns=1;i=5034","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5034"},{"referenceType":"HasProperty","target":"ns=1;i=6229"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6229","parentNodeId":"ns=1;i=7079","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7079"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7080","parentNodeId":"ns=1;i=5034","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5034"},{"referenceType":"HasProperty","target":"ns=1;i=6230"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6231"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6230","parentNodeId":"ns=1;i=7080","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7080"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6231","parentNodeId":"ns=1;i=7080","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7080"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6396","parentNodeId":"ns=1;i=5034","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5034"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7081","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasProperty","target":"ns=1;i=6232"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5034"},{"referenceType":"HasProperty","target":"ns=1;i=6233"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6232","parentNodeId":"ns=1;i=7081","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7081"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6233","parentNodeId":"ns=1;i=7081","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7081"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6234","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5034"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7082","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasProperty","target":"ns=1;i=6235"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6236"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5034"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6235","parentNodeId":"ns=1;i=7082","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7082"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6236","parentNodeId":"ns=1;i=7082","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7082"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7083","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasProperty","target":"ns=1;i=6237"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5034"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6237","parentNodeId":"ns=1;i=7083","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7083"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6238","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5034"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6239","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5034"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6240","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5034"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7084","parentNodeId":"ns=1;i=5034","references":[{"referenceType":"HasProperty","target":"ns=1;i=6241"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5034"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6241","parentNodeId":"ns=1;i=7084","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7084"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:OperationManualLink","dataType":"String","description":[{"value":"Technical instructions to reach a proper item function performance according to its technical specifications and safety conditions."}],"displayName":[{"value":"OperationManualLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6416","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6438"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6438","parentNodeId":"ns=1;i=6416","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6416"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PersonnelRecording","description":[{"value":"List of all activities (work order) performed by a technician. This list includes a predefined time period"}],"displayName":[{"value":"PersonnelRecording"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5041","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7121"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7122"},{"referenceType":"HasProperty","target":"ns=1;i=6398"},{"referenceType":"HasComponent","target":"ns=1;i=7123"},{"referenceType":"HasProperty","target":"ns=1;i=6325"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=7124"},{"referenceType":"HasComponent","target":"ns=1;i=7125"},{"referenceType":"HasProperty","target":"ns=1;i=6329"},{"referenceType":"HasProperty","target":"ns=1;i=6330"},{"referenceType":"HasProperty","target":"ns=1;i=6331"},{"referenceType":"HasComponent","target":"ns=1;i=7126"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7121","parentNodeId":"ns=1;i=5041","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5041"},{"referenceType":"HasProperty","target":"ns=1;i=6320"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6320","parentNodeId":"ns=1;i=7121","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7121"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7122","parentNodeId":"ns=1;i=5041","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5041"},{"referenceType":"HasProperty","target":"ns=1;i=6321"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6322"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6321","parentNodeId":"ns=1;i=7122","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7122"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6322","parentNodeId":"ns=1;i=7122","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7122"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6398","parentNodeId":"ns=1;i=5041","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5041"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7123","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasProperty","target":"ns=1;i=6323"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5041"},{"referenceType":"HasProperty","target":"ns=1;i=6324"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6323","parentNodeId":"ns=1;i=7123","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7123"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6324","parentNodeId":"ns=1;i=7123","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7123"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6325","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5041"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7124","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasProperty","target":"ns=1;i=6326"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6327"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5041"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6326","parentNodeId":"ns=1;i=7124","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7124"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6327","parentNodeId":"ns=1;i=7124","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7124"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7125","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasProperty","target":"ns=1;i=6328"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5041"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6328","parentNodeId":"ns=1;i=7125","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7125"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6329","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5041"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6330","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5041"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6331","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5041"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7126","parentNodeId":"ns=1;i=5041","references":[{"referenceType":"HasProperty","target":"ns=1;i=6332"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5041"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6332","parentNodeId":"ns=1;i=7126","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7126"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PersonnelRecordingLink","dataType":"String","description":[{"value":"List of all activities (work order) performed by a technician. This list includes a predefined time period"}],"displayName":[{"value":"PersonnelRecordingLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6417","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6439"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6439","parentNodeId":"ns=1;i=6417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PipeAndInstrumentDiagram","description":[{"value":"Overall fluid conduction (air, steam, oil, fuel ...), and control diagram."}],"displayName":[{"value":"PipeAndInstrumentDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5035","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7085"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7086"},{"referenceType":"HasProperty","target":"ns=1;i=6397"},{"referenceType":"HasComponent","target":"ns=1;i=7087"},{"referenceType":"HasProperty","target":"ns=1;i=6247"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=7088"},{"referenceType":"HasComponent","target":"ns=1;i=7089"},{"referenceType":"HasProperty","target":"ns=1;i=6251"},{"referenceType":"HasProperty","target":"ns=1;i=6252"},{"referenceType":"HasProperty","target":"ns=1;i=6253"},{"referenceType":"HasComponent","target":"ns=1;i=7090"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7085","parentNodeId":"ns=1;i=5035","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5035"},{"referenceType":"HasProperty","target":"ns=1;i=6242"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6242","parentNodeId":"ns=1;i=7085","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7085"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7086","parentNodeId":"ns=1;i=5035","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5035"},{"referenceType":"HasProperty","target":"ns=1;i=6243"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6244"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6243","parentNodeId":"ns=1;i=7086","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7086"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6244","parentNodeId":"ns=1;i=7086","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7086"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6397","parentNodeId":"ns=1;i=5035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5035"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7087","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasProperty","target":"ns=1;i=6245"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5035"},{"referenceType":"HasProperty","target":"ns=1;i=6246"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6245","parentNodeId":"ns=1;i=7087","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7087"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6246","parentNodeId":"ns=1;i=7087","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7087"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6247","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5035"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7088","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasProperty","target":"ns=1;i=6248"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6249"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5035"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6248","parentNodeId":"ns=1;i=7088","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7088"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6249","parentNodeId":"ns=1;i=7088","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7088"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7089","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasProperty","target":"ns=1;i=6250"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5035"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6250","parentNodeId":"ns=1;i=7089","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7089"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6251","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5035"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6252","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5035"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6253","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5035"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7090","parentNodeId":"ns=1;i=5035","references":[{"referenceType":"HasProperty","target":"ns=1;i=6254"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5035"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6254","parentNodeId":"ns=1;i=7090","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7090"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PipeAndInstrumentDiagramLink","dataType":"String","description":[{"value":"Overall fluid conduction (air, steam, oil, fuel ...), and control diagram."}],"displayName":[{"value":"PipeAndInstrumentDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6418","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6440"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6440","parentNodeId":"ns=1;i=6418","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6418"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ScopeOfWork","description":[{"value":"The hours worked in the execution of the work order. The type of hours worked should be indicated: normal, in shifts, at night, overtime, etc."}],"displayName":[{"value":"ScopeOfWork"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5044","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7139"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7140"},{"referenceType":"HasProperty","target":"ns=1;i=6400"},{"referenceType":"HasComponent","target":"ns=1;i=7141"},{"referenceType":"HasProperty","target":"ns=1;i=6364"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7142"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=7143"},{"referenceType":"HasProperty","target":"ns=1;i=6368"},{"referenceType":"HasProperty","target":"ns=1;i=6369"},{"referenceType":"HasProperty","target":"ns=1;i=6370"},{"referenceType":"HasComponent","target":"ns=1;i=7144"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7139","parentNodeId":"ns=1;i=5044","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5044"},{"referenceType":"HasProperty","target":"ns=1;i=6359"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6359","parentNodeId":"ns=1;i=7139","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7139"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7140","parentNodeId":"ns=1;i=5044","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5044"},{"referenceType":"HasProperty","target":"ns=1;i=6360"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6361"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6360","parentNodeId":"ns=1;i=7140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7140"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6361","parentNodeId":"ns=1;i=7140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7140"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6400","parentNodeId":"ns=1;i=5044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7141","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasProperty","target":"ns=1;i=6362"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5044"},{"referenceType":"HasProperty","target":"ns=1;i=6363"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6362","parentNodeId":"ns=1;i=7141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7141"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6363","parentNodeId":"ns=1;i=7141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7141"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6364","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5044"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7142","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasProperty","target":"ns=1;i=6365"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6366"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5044"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6365","parentNodeId":"ns=1;i=7142","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7142"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6366","parentNodeId":"ns=1;i=7142","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7142"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7143","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasProperty","target":"ns=1;i=6367"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5044"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6367","parentNodeId":"ns=1;i=7143","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7143"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6368","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5044"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6369","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5044"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6370","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5044"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7144","parentNodeId":"ns=1;i=5044","references":[{"referenceType":"HasProperty","target":"ns=1;i=6371"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5044"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6371","parentNodeId":"ns=1;i=7144","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7144"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ScopeOfWorkLink","dataType":"String","description":[{"value":"The hours worked in the execution of the work order. The type of hours worked should be indicated: normal, in shifts, at night, overtime, etc."}],"displayName":[{"value":"ScopeOfWorkLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6419","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6441"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6441","parentNodeId":"ns=1;i=6419","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6419"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SingleLineDiagram","description":[{"value":"Overall power distribution diagram (electrical, pneumatic, hydraulic). This kind of diagram includes switchboard circuits."}],"displayName":[{"value":"SingleLineDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5036","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7091"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7092"},{"referenceType":"HasProperty","target":"ns=1;i=6399"},{"referenceType":"HasComponent","target":"ns=1;i=7093"},{"referenceType":"HasProperty","target":"ns=1;i=6260"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7094"},{"referenceType":"HasComponent","target":"ns=1;i=7095"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6264"},{"referenceType":"HasProperty","target":"ns=1;i=6265"},{"referenceType":"HasProperty","target":"ns=1;i=6266"},{"referenceType":"HasComponent","target":"ns=1;i=7096"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7091","parentNodeId":"ns=1;i=5036","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5036"},{"referenceType":"HasProperty","target":"ns=1;i=6255"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6255","parentNodeId":"ns=1;i=7091","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7091"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7092","parentNodeId":"ns=1;i=5036","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5036"},{"referenceType":"HasProperty","target":"ns=1;i=6256"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6257"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6256","parentNodeId":"ns=1;i=7092","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7092"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6257","parentNodeId":"ns=1;i=7092","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7092"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6399","parentNodeId":"ns=1;i=5036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7093","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasProperty","target":"ns=1;i=6258"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5036"},{"referenceType":"HasProperty","target":"ns=1;i=6259"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6258","parentNodeId":"ns=1;i=7093","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7093"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6259","parentNodeId":"ns=1;i=7093","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7093"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6260","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5036"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7094","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasProperty","target":"ns=1;i=6261"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6262"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5036"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6261","parentNodeId":"ns=1;i=7094","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7094"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6262","parentNodeId":"ns=1;i=7094","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7094"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7095","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasProperty","target":"ns=1;i=6263"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5036"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6263","parentNodeId":"ns=1;i=7095","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7095"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6264","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5036"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6265","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5036"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6266","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5036"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7096","parentNodeId":"ns=1;i=5036","references":[{"referenceType":"HasProperty","target":"ns=1;i=6267"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5036"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6267","parentNodeId":"ns=1;i=7096","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7096"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:SingleLineDiagramLink","dataType":"String","description":[{"value":"Overall power distribution diagram (electrical, pneumatic, hydraulic). This kind of diagram includes switchboard circuits."}],"displayName":[{"value":"SingleLineDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6420","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6442"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6442","parentNodeId":"ns=1;i=6420","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6420"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SparePartReference","description":[{"value":"List of all spare parts used within the scope of the work order"}],"displayName":[{"value":"SparePartReference"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5045","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7145"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7146"},{"referenceType":"HasProperty","target":"ns=1;i=6401"},{"referenceType":"HasComponent","target":"ns=1;i=7147"},{"referenceType":"HasProperty","target":"ns=1;i=6377"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7148"},{"referenceType":"HasComponent","target":"ns=1;i=7149"},{"referenceType":"HasProperty","target":"ns=1;i=6381"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6382"},{"referenceType":"HasProperty","target":"ns=1;i=6383"},{"referenceType":"HasComponent","target":"ns=1;i=7150"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7145","parentNodeId":"ns=1;i=5045","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5045"},{"referenceType":"HasProperty","target":"ns=1;i=6372"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6372","parentNodeId":"ns=1;i=7145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7145"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7146","parentNodeId":"ns=1;i=5045","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5045"},{"referenceType":"HasProperty","target":"ns=1;i=6373"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6374"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6373","parentNodeId":"ns=1;i=7146","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7146"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6374","parentNodeId":"ns=1;i=7146","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7146"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6401","parentNodeId":"ns=1;i=5045","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5045"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7147","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasProperty","target":"ns=1;i=6375"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5045"},{"referenceType":"HasProperty","target":"ns=1;i=6376"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6375","parentNodeId":"ns=1;i=7147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7147"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6376","parentNodeId":"ns=1;i=7147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7147"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6377","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5045"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7148","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasProperty","target":"ns=1;i=6378"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6379"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5045"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6378","parentNodeId":"ns=1;i=7148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7148"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6379","parentNodeId":"ns=1;i=7148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7148"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7149","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasProperty","target":"ns=1;i=6380"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5045"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6380","parentNodeId":"ns=1;i=7149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7149"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6381","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5045"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6382","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5045"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6383","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5045"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7150","parentNodeId":"ns=1;i=5045","references":[{"referenceType":"HasProperty","target":"ns=1;i=6384"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5045"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6384","parentNodeId":"ns=1;i=7150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7150"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:SparePartReferenceLink","dataType":"String","description":[{"value":"List of all spare parts used within the scope of the work order"}],"displayName":[{"value":"SparePartReferenceLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6421","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6443"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6443","parentNodeId":"ns=1;i=6421","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6421"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Staff","description":[{"value":"List of all maintenance workers involved in the execution of the work order"}],"displayName":[{"value":"Staff"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5042","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7127"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7128"},{"referenceType":"HasProperty","target":"ns=1;i=6402"},{"referenceType":"HasComponent","target":"ns=1;i=7129"},{"referenceType":"HasProperty","target":"ns=1;i=6338"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7130"},{"referenceType":"HasComponent","target":"ns=1;i=7131"},{"referenceType":"HasProperty","target":"ns=1;i=6342"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6343"},{"referenceType":"HasProperty","target":"ns=1;i=6344"},{"referenceType":"HasComponent","target":"ns=1;i=7132"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7127","parentNodeId":"ns=1;i=5042","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5042"},{"referenceType":"HasProperty","target":"ns=1;i=6333"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6333","parentNodeId":"ns=1;i=7127","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7127"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7128","parentNodeId":"ns=1;i=5042","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5042"},{"referenceType":"HasProperty","target":"ns=1;i=6334"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6335"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6334","parentNodeId":"ns=1;i=7128","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7128"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6335","parentNodeId":"ns=1;i=7128","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7128"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6402","parentNodeId":"ns=1;i=5042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5042"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7129","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasProperty","target":"ns=1;i=6336"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5042"},{"referenceType":"HasProperty","target":"ns=1;i=6337"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6336","parentNodeId":"ns=1;i=7129","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7129"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6337","parentNodeId":"ns=1;i=7129","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7129"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6338","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5042"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7130","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasProperty","target":"ns=1;i=6339"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6340"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5042"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6339","parentNodeId":"ns=1;i=7130","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7130"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6340","parentNodeId":"ns=1;i=7130","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7130"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7131","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasProperty","target":"ns=1;i=6341"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5042"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6341","parentNodeId":"ns=1;i=7131","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7131"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6342","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5042"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6343","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5042"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6344","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5042"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7132","parentNodeId":"ns=1;i=5042","references":[{"referenceType":"HasProperty","target":"ns=1;i=6345"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5042"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6345","parentNodeId":"ns=1;i=7132","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7132"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:StaffLink","dataType":"String","description":[{"value":"List of all maintenance workers involved in the execution of the work order"}],"displayName":[{"value":"StaffLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6422","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6444"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6444","parentNodeId":"ns=1;i=6422","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6422"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TechnicalData","description":[{"value":"Manufacturer\u0060s specification of the item."}],"displayName":[{"value":"TechnicalData"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5037","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7097"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7098"},{"referenceType":"HasProperty","target":"ns=1;i=6403"},{"referenceType":"HasComponent","target":"ns=1;i=7099"},{"referenceType":"HasProperty","target":"ns=1;i=6273"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7100"},{"referenceType":"HasComponent","target":"ns=1;i=7101"},{"referenceType":"HasProperty","target":"ns=1;i=6277"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6278"},{"referenceType":"HasProperty","target":"ns=1;i=6279"},{"referenceType":"HasComponent","target":"ns=1;i=7102"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7097","parentNodeId":"ns=1;i=5037","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5037"},{"referenceType":"HasProperty","target":"ns=1;i=6268"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6268","parentNodeId":"ns=1;i=7097","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7097"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7098","parentNodeId":"ns=1;i=5037","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5037"},{"referenceType":"HasProperty","target":"ns=1;i=6269"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6270"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6269","parentNodeId":"ns=1;i=7098","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7098"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6270","parentNodeId":"ns=1;i=7098","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7098"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6403","parentNodeId":"ns=1;i=5037","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5037"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7099","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasProperty","target":"ns=1;i=6271"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5037"},{"referenceType":"HasProperty","target":"ns=1;i=6272"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6271","parentNodeId":"ns=1;i=7099","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7099"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6272","parentNodeId":"ns=1;i=7099","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7099"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6273","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5037"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7100","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasProperty","target":"ns=1;i=6274"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6275"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5037"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6274","parentNodeId":"ns=1;i=7100","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7100"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6275","parentNodeId":"ns=1;i=7100","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7100"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7101","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasProperty","target":"ns=1;i=6276"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5037"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6276","parentNodeId":"ns=1;i=7101","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7101"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6277","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5037"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6278","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5037"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6279","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5037"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7102","parentNodeId":"ns=1;i=5037","references":[{"referenceType":"HasProperty","target":"ns=1;i=6280"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5037"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6280","parentNodeId":"ns=1;i=7102","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7102"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:TechnicalDataLink","dataType":"String","description":[{"value":"Manufacturer\u0060s specification of the item."}],"displayName":[{"value":"TechnicalDataLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6423","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6445"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6445","parentNodeId":"ns=1;i=6423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TestProgramReport","description":[{"value":"Commissioning report which demonstrates that an item is in compliance with specifications."}],"displayName":[{"value":"TestProgramReport"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5038","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7103"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7104"},{"referenceType":"HasProperty","target":"ns=1;i=6404"},{"referenceType":"HasComponent","target":"ns=1;i=7105"},{"referenceType":"HasProperty","target":"ns=1;i=6286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7106"},{"referenceType":"HasComponent","target":"ns=1;i=7107"},{"referenceType":"HasProperty","target":"ns=1;i=6290"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6291"},{"referenceType":"HasProperty","target":"ns=1;i=6292"},{"referenceType":"HasComponent","target":"ns=1;i=7108"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7103","parentNodeId":"ns=1;i=5038","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5038"},{"referenceType":"HasProperty","target":"ns=1;i=6281"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6281","parentNodeId":"ns=1;i=7103","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7103"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7104","parentNodeId":"ns=1;i=5038","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5038"},{"referenceType":"HasProperty","target":"ns=1;i=6282"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6283"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6282","parentNodeId":"ns=1;i=7104","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7104"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6283","parentNodeId":"ns=1;i=7104","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7104"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6404","parentNodeId":"ns=1;i=5038","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5038"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7105","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasProperty","target":"ns=1;i=6284"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5038"},{"referenceType":"HasProperty","target":"ns=1;i=6285"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6284","parentNodeId":"ns=1;i=7105","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7105"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6285","parentNodeId":"ns=1;i=7105","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7105"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6286","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5038"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7106","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasProperty","target":"ns=1;i=6287"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6288"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5038"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6287","parentNodeId":"ns=1;i=7106","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7106"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6288","parentNodeId":"ns=1;i=7106","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7106"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7107","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasProperty","target":"ns=1;i=6289"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5038"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6289","parentNodeId":"ns=1;i=7107","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7107"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6290","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5038"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6291","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5038"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6292","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5038"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7108","parentNodeId":"ns=1;i=5038","references":[{"referenceType":"HasProperty","target":"ns=1;i=6293"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5038"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6293","parentNodeId":"ns=1;i=7108","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7108"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:TestProgramReportLink","dataType":"String","description":[{"value":"Commissioning report which demonstrates that an item is in compliance with specifications."}],"displayName":[{"value":"TestProgramReportLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6424","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6446"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6446","parentNodeId":"ns=1;i=6424","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6424"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:UnitMaintenanceReport","description":[{"value":"List of work orders for a particular unit. The list is created for a specified period of time"}],"displayName":[{"value":"UnitMaintenanceReport"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5039","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasComponent","target":"ns=1;i=7109"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7110"},{"referenceType":"HasProperty","target":"ns=1;i=6405"},{"referenceType":"HasComponent","target":"ns=1;i=7111"},{"referenceType":"HasProperty","target":"ns=1;i=6299"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7112"},{"referenceType":"HasComponent","target":"ns=1;i=7113"},{"referenceType":"HasProperty","target":"ns=1;i=6303"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"},{"referenceType":"HasProperty","target":"ns=1;i=6304"},{"referenceType":"HasProperty","target":"ns=1;i=6305"},{"referenceType":"HasComponent","target":"ns=1;i=7114"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7109","parentNodeId":"ns=1;i=5039","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5039"},{"referenceType":"HasProperty","target":"ns=1;i=6294"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6294","parentNodeId":"ns=1;i=7109","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7109"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7110","parentNodeId":"ns=1;i=5039","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5039"},{"referenceType":"HasProperty","target":"ns=1;i=6295"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6296"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6295","parentNodeId":"ns=1;i=7110","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7110"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6296","parentNodeId":"ns=1;i=7110","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7110"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6405","parentNodeId":"ns=1;i=5039","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5039"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7111","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasProperty","target":"ns=1;i=6297"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5039"},{"referenceType":"HasProperty","target":"ns=1;i=6298"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6297","parentNodeId":"ns=1;i=7111","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7111"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6298","parentNodeId":"ns=1;i=7111","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7111"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6299","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5039"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7112","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasProperty","target":"ns=1;i=6300"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6301"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5039"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6300","parentNodeId":"ns=1;i=7112","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7112"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6301","parentNodeId":"ns=1;i=7112","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7112"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7113","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasProperty","target":"ns=1;i=6302"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5039"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6302","parentNodeId":"ns=1;i=7113","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7113"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6303","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5039"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6304","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5039"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6305","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5039"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7114","parentNodeId":"ns=1;i=5039","references":[{"referenceType":"HasProperty","target":"ns=1;i=6306"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5039"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6306","parentNodeId":"ns=1;i=7114","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7114"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:UnitMaintenanceReportLink","dataType":"String","description":[{"value":"List of work orders for a particular unit. The list is created for a specified period of time"}],"displayName":[{"value":"UnitMaintenanceReportLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6425","parentNodeId":"ns=1;i=1006","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6447"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1006"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6447","parentNodeId":"ns=1;i=6425","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6425"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DriveDesignType","displayName":[{"value":"DriveDesignType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.43","nodeClass":"ObjectType","nodeId":"ns=1;i=1043","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9338"},{"referenceType":"HasComponent","target":"ns=1;i=9339"},{"referenceType":"HasComponent","target":"ns=1;i=9340"},{"referenceType":"HasComponent","target":"ns=1;i=9341"},{"referenceType":"HasComponent","target":"ns=1;i=9342"},{"referenceType":"HasComponent","target":"ns=1;i=9343"},{"referenceType":"HasComponent","target":"ns=1;i=9344"},{"referenceType":"HasComponent","target":"ns=1;i=9345"},{"referenceType":"HasComponent","target":"ns=1;i=9337"},{"referenceType":"HasComponent","target":"ns=1;i=9346"},{"referenceType":"HasComponent","target":"ns=1;i=9347"},{"referenceType":"HasComponent","target":"ns=1;i=9348"}],"superType":"ns=3;i=1005"},{"browseName":"1:EnergyEfficiencyClassOfMotor","dataType":"String","description":[{"value":"Characterization of the energy efficiency of electric motors according to international standards."}],"displayName":[{"value":"EnergyEfficiencyClassOfMotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9338","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9350"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9350","parentNodeId":"ns=1;i=9338","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9338"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaxNominalFrequency","dataType":"Double","description":[{"value":"A suitable, maximum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MaxNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9339","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9351"},{"referenceType":"HasProperty","target":"ns=1;i=9353"},{"referenceType":"HasProperty","target":"ns=1;i=9352"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9351","parentNodeId":"ns=1;i=9339","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9339"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9353","parentNodeId":"ns=1;i=9339","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9339"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9352","parentNodeId":"ns=1;i=9339","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9339"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinNominalFrequency","dataType":"Double","description":[{"value":"A suitable minimum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MinNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9340","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9354"},{"referenceType":"HasProperty","target":"ns=1;i=9356"},{"referenceType":"HasProperty","target":"ns=1;i=9355"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9354","parentNodeId":"ns=1;i=9340","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9340"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9356","parentNodeId":"ns=1;i=9340","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9340"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9355","parentNodeId":"ns=1;i=9340","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9340"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Proportion of the motor power input P_mot delivered as pump power input P_mot, u."}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9341","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9357"},{"referenceType":"HasProperty","target":"ns=1;i=9359"},{"referenceType":"HasProperty","target":"ns=1;i=9358"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9357","parentNodeId":"ns=1;i=9341","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9341"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9359","parentNodeId":"ns=1;i=9341","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9341"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9358","parentNodeId":"ns=1;i=9341","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9341"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalFrequency","dataType":"Double","description":[{"value":"Design of the object at a certain frequency, which is repeated regularly."}],"displayName":[{"value":"NominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9342","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9360"},{"referenceType":"HasProperty","target":"ns=1;i=9362"},{"referenceType":"HasProperty","target":"ns=1;i=9361"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9360","parentNodeId":"ns=1;i=9342","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9342"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9362","parentNodeId":"ns=1;i=9342","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9342"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9361","parentNodeId":"ns=1;i=9342","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9342"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPowerConsumption","dataType":"Double","description":[{"value":"Indication of the rated power consumption in watts."}],"displayName":[{"value":"NominalPowerConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9343","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9363"},{"referenceType":"HasProperty","target":"ns=1;i=9365"},{"referenceType":"HasProperty","target":"ns=1;i=9364"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9363","parentNodeId":"ns=1;i=9343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9343"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9365","parentNodeId":"ns=1;i=9343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9343"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9364","parentNodeId":"ns=1;i=9343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9343"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalVoltage","dataType":"Double","description":[{"value":"Rated voltage is the value of the electrical voltage in normal operation specified by the manufacturer or supplier."}],"displayName":[{"value":"NominalVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9344","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9366"},{"referenceType":"HasProperty","target":"ns=1;i=9368"},{"referenceType":"HasProperty","target":"ns=1;i=9367"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9366","parentNodeId":"ns=1;i=9344","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9344"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9368","parentNodeId":"ns=1;i=9344","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9344"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9367","parentNodeId":"ns=1;i=9344","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9344"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Ratio of the amount of active power to apparent power."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9345","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9369"},{"referenceType":"HasProperty","target":"ns=1;i=9371"},{"referenceType":"HasProperty","target":"ns=1;i=9370"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9369","parentNodeId":"ns=1;i=9345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9371","parentNodeId":"ns=1;i=9345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9370","parentNodeId":"ns=1;i=9345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProtectionClass","dataType":"String","description":[{"value":"Protection class of an enclosure, expressed as NEMA or IP rating."}],"displayName":[{"value":"ProtectionClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9337","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9349"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9349","parentNodeId":"ns=1;i=9337","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9337"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedCurrent","dataType":"Double","description":[{"value":"Appropriate (usually rounded) value of a current to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"RatedCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9346","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9372"},{"referenceType":"HasProperty","target":"ns=1;i=9374"},{"referenceType":"HasProperty","target":"ns=1;i=9373"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9372","parentNodeId":"ns=1;i=9346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9346"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9374","parentNodeId":"ns=1;i=9346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9346"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9373","parentNodeId":"ns=1;i=9346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9346"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Speed corresponding to the rated data of the motor used."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9347","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9375"},{"referenceType":"HasProperty","target":"ns=1;i=9377"},{"referenceType":"HasProperty","target":"ns=1;i=9376"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9375","parentNodeId":"ns=1;i=9347","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9347"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9377","parentNodeId":"ns=1;i=9347","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9347"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9376","parentNodeId":"ns=1;i=9347","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9347"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TorqueAtNominalSpeedOfDrive","dataType":"Double","description":[{"value":"The torque transmittable by the equipment."}],"displayName":[{"value":"TorqueAtNominalSpeedOfDrive"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9348","parentNodeId":"ns=1;i=1043","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9378"},{"referenceType":"HasProperty","target":"ns=1;i=9380"},{"referenceType":"HasProperty","target":"ns=1;i=9379"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1043"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9378","parentNodeId":"ns=1;i=9348","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9348"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9380","parentNodeId":"ns=1;i=9348","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9348"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9379","parentNodeId":"ns=1;i=9348","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9348"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DriveMeasurementsType","displayName":[{"value":"DriveMeasurementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.49","nodeClass":"ObjectType","nodeId":"ns=1;i=1051","references":[{"referenceType":"HasComponent","target":"ns=1;i=9443"},{"referenceType":"HasComponent","target":"ns=1;i=9445"},{"referenceType":"HasComponent","target":"ns=1;i=9447"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9449"},{"referenceType":"HasComponent","target":"ns=1;i=9451"},{"referenceType":"HasComponent","target":"ns=1;i=9453"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasComponent","target":"ns=1;i=9455"},{"referenceType":"HasComponent","target":"ns=1;i=9457"},{"referenceType":"HasComponent","target":"ns=1;i=9459"},{"referenceType":"HasComponent","target":"ns=1;i=9461"},{"referenceType":"HasComponent","target":"ns=1;i=9463"},{"referenceType":"HasComponent","target":"ns=1;i=9465"},{"referenceType":"HasComponent","target":"ns=1;i=9467"}],"superType":"ns=3;i=1005"},{"browseName":"1:Current","dataType":"Double","description":[{"value":"Measured consumed mains current of the whole unit of the motor."}],"displayName":[{"value":"Current"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9443","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasProperty","target":"ns=1;i=9469"},{"referenceType":"HasProperty","target":"ns=1;i=9471"},{"referenceType":"HasProperty","target":"ns=1;i=9470"},{"referenceType":"HasProperty","target":"ns=1;i=14880"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9469","parentNodeId":"ns=1;i=9443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9471","parentNodeId":"ns=1;i=9443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9470","parentNodeId":"ns=1;i=9443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14880","parentNodeId":"ns=1;i=9443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkCurrent","dataType":"Double","description":[{"value":"Measured actual electrical dc current of the converter."}],"displayName":[{"value":"DCLinkCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9445","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasProperty","target":"ns=1;i=9472"},{"referenceType":"HasProperty","target":"ns=1;i=9474"},{"referenceType":"HasProperty","target":"ns=1;i=9473"},{"referenceType":"HasProperty","target":"ns=1;i=14884"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9472","parentNodeId":"ns=1;i=9445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9474","parentNodeId":"ns=1;i=9445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9473","parentNodeId":"ns=1;i=9445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14884","parentNodeId":"ns=1;i=9445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkVoltage","dataType":"Double","description":[{"value":"Measured actual electrical dc voltage of the converter."}],"displayName":[{"value":"DCLinkVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9447","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasProperty","target":"ns=1;i=9475"},{"referenceType":"HasProperty","target":"ns=1;i=9477"},{"referenceType":"HasProperty","target":"ns=1;i=9476"},{"referenceType":"HasProperty","target":"ns=1;i=14888"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9475","parentNodeId":"ns=1;i=9447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9477","parentNodeId":"ns=1;i=9447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9476","parentNodeId":"ns=1;i=9447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14888","parentNodeId":"ns=1;i=9447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:DriverPowerInput","dataType":"Double","description":[{"value":"Measured power absorbed by the motor."}],"displayName":[{"value":"DriverPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9449","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9478"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasProperty","target":"ns=1;i=9480"},{"referenceType":"HasProperty","target":"ns=1;i=9479"},{"referenceType":"HasProperty","target":"ns=1;i=14892"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9478","parentNodeId":"ns=1;i=9449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9480","parentNodeId":"ns=1;i=9449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9479","parentNodeId":"ns=1;i=9449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14892","parentNodeId":"ns=1;i=9449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:EnergyConsumption","dataType":"Double","description":[{"value":"Measured energy consumption of the unit of the motor."}],"displayName":[{"value":"EnergyConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9451","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9481"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasProperty","target":"ns=1;i=9483"},{"referenceType":"HasProperty","target":"ns=1;i=9482"},{"referenceType":"HasProperty","target":"ns=1;i=14896"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9481","parentNodeId":"ns=1;i=9451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9483","parentNodeId":"ns=1;i=9451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9482","parentNodeId":"ns=1;i=9451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14896","parentNodeId":"ns=1;i=9451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:Frequency","dataType":"Double","description":[{"value":"Measured output frequency of the frequency converter."}],"displayName":[{"value":"Frequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9453","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9484"},{"referenceType":"HasProperty","target":"ns=1;i=9486"},{"referenceType":"HasProperty","target":"ns=1;i=9485"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasProperty","target":"ns=1;i=14900"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9484","parentNodeId":"ns=1;i=9453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9486","parentNodeId":"ns=1;i=9453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9485","parentNodeId":"ns=1;i=9453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14900","parentNodeId":"ns=1;i=9453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:MotorCurrent","dataType":"Double","description":[{"value":"Measured actual motor current."}],"displayName":[{"value":"MotorCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9455","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9487"},{"referenceType":"HasProperty","target":"ns=1;i=9489"},{"referenceType":"HasProperty","target":"ns=1;i=9488"},{"referenceType":"HasProperty","target":"ns=1;i=14904"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9487","parentNodeId":"ns=1;i=9455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9489","parentNodeId":"ns=1;i=9455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9488","parentNodeId":"ns=1;i=9455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14904","parentNodeId":"ns=1;i=9455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the motor power input P_mot delivered as pump power input P_mot, u"}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9457","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9490"},{"referenceType":"HasProperty","target":"ns=1;i=9492"},{"referenceType":"HasProperty","target":"ns=1;i=9491"},{"referenceType":"HasProperty","target":"ns=1;i=14908"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9490","parentNodeId":"ns=1;i=9457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9492","parentNodeId":"ns=1;i=9457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9491","parentNodeId":"ns=1;i=9457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14908","parentNodeId":"ns=1;i=9457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MotorTemperature","dataType":"Double","description":[{"value":"Measured temperature of the motor."}],"displayName":[{"value":"MotorTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9459","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9493"},{"referenceType":"HasProperty","target":"ns=1;i=9495"},{"referenceType":"HasProperty","target":"ns=1;i=9494"},{"referenceType":"HasProperty","target":"ns=1;i=14912"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9493","parentNodeId":"ns=1;i=9459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9495","parentNodeId":"ns=1;i=9459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9494","parentNodeId":"ns=1;i=9459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14912","parentNodeId":"ns=1;i=9459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MotorVoltage","dataType":"Double","description":[{"value":"Measured actual motor voltage."}],"displayName":[{"value":"MotorVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9461","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9496"},{"referenceType":"HasProperty","target":"ns=1;i=9498"},{"referenceType":"HasProperty","target":"ns=1;i=9497"},{"referenceType":"HasProperty","target":"ns=1;i=14916"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9496","parentNodeId":"ns=1;i=9461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9498","parentNodeId":"ns=1;i=9461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9497","parentNodeId":"ns=1;i=9461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14916","parentNodeId":"ns=1;i=9461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Determined power factor of the motor."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9463","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9499"},{"referenceType":"HasProperty","target":"ns=1;i=9501"},{"referenceType":"HasProperty","target":"ns=1;i=9500"},{"referenceType":"HasProperty","target":"ns=1;i=14920"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9499","parentNodeId":"ns=1;i=9463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9501","parentNodeId":"ns=1;i=9463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9500","parentNodeId":"ns=1;i=9463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14920","parentNodeId":"ns=1;i=9463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:Torque","dataType":"Double","description":[{"value":"Measured torque of the motor."}],"displayName":[{"value":"Torque"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9465","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9502"},{"referenceType":"HasProperty","target":"ns=1;i=9504"},{"referenceType":"HasProperty","target":"ns=1;i=9503"},{"referenceType":"HasProperty","target":"ns=1;i=14927"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9502","parentNodeId":"ns=1;i=9465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9504","parentNodeId":"ns=1;i=9465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20053\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u00B7m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9503","parentNodeId":"ns=1;i=9465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity described by the vector product M=r * F where r is position vector with respect to the axis of rotation and F is force"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14927","parentNodeId":"ns=1;i=9465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emoment of force\u003C/uax:String\u003E"},{"browseName":"1:Voltage","dataType":"Double","description":[{"value":"Measured actual mains voltage of the motor."}],"displayName":[{"value":"Voltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9467","parentNodeId":"ns=1;i=1051","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9505"},{"referenceType":"HasProperty","target":"ns=1;i=9507"},{"referenceType":"HasProperty","target":"ns=1;i=9506"},{"referenceType":"HasProperty","target":"ns=1;i=14935"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1051"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9505","parentNodeId":"ns=1;i=9467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9507","parentNodeId":"ns=1;i=9467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9506","parentNodeId":"ns=1;i=9467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14935","parentNodeId":"ns=1;i=9467","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9467"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:GeneralMaintenanceType","displayName":[{"value":"GeneralMaintenanceType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.7","nodeClass":"ObjectType","nodeId":"ns=1;i=1007","references":[{"referenceType":"HasComponent","target":"ns=1;i=6452"},{"referenceType":"HasComponent","target":"ns=1;i=13057"},{"referenceType":"HasComponent","target":"ns=1;i=13058"},{"referenceType":"HasComponent","target":"ns=1;i=6456"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=13059"},{"referenceType":"HasComponent","target":"ns=1;i=6450"},{"referenceType":"HasComponent","target":"ns=1;i=6457"},{"referenceType":"HasComponent","target":"ns=1;i=6458"},{"referenceType":"HasComponent","target":"ns=1;i=6459"},{"referenceType":"HasComponent","target":"ns=1;i=6460"},{"referenceType":"HasComponent","target":"ns=1;i=6466"},{"referenceType":"HasComponent","target":"ns=1;i=12949"},{"referenceType":"HasComponent","target":"ns=1;i=6461"},{"referenceType":"HasComponent","target":"ns=1;i=6462"},{"referenceType":"HasComponent","target":"ns=1;i=6463"},{"referenceType":"HasComponent","target":"ns=1;i=13060"},{"referenceType":"HasComponent","target":"ns=1;i=6448"},{"referenceType":"HasComponent","target":"ns=1;i=6464"},{"referenceType":"HasComponent","target":"ns=1;i=6465"},{"referenceType":"HasComponent","target":"ns=1;i=13061"}],"superType":"ns=3;i=1005"},{"browseName":"1:ActiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the maintenance time when active maintenance is carried out on an item."}],"displayName":[{"value":"ActiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6452","parentNodeId":"ns=1;i=1007","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6453"},{"referenceType":"HasProperty","target":"ns=1;i=6455"},{"referenceType":"HasProperty","target":"ns=1;i=6454"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6453","parentNodeId":"ns=1;i=6452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6455","parentNodeId":"ns=1;i=6452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6454","parentNodeId":"ns=1;i=6452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DownTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in a down state"}],"displayName":[{"value":"DownTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13057","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13062"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasProperty","target":"ns=1;i=13064"},{"referenceType":"HasProperty","target":"ns=1;i=13063"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13062","parentNodeId":"ns=1;i=13057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13064","parentNodeId":"ns=1;i=13057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13063","parentNodeId":"ns=1;i=13057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ExternalDisabledTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an external disabled state"}],"displayName":[{"value":"ExternalDisabledTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13058","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13065"},{"referenceType":"HasProperty","target":"ns=1;i=13067"},{"referenceType":"HasProperty","target":"ns=1;i=13066"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13065","parentNodeId":"ns=1;i=13058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13067","parentNodeId":"ns=1;i=13058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13066","parentNodeId":"ns=1;i=13058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FailureRate","dataType":"Double","description":[{"value":"Number of failures within a population divided by the number of life units used by that population"}],"displayName":[{"value":"FailureRate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6456","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6469"},{"referenceType":"HasProperty","target":"ns=1;i=6471"},{"referenceType":"HasProperty","target":"ns=1;i=6470"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6469","parentNodeId":"ns=1;i=6456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6471","parentNodeId":"ns=1;i=6456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6470","parentNodeId":"ns=1;i=6456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IdleTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an idle state"}],"displayName":[{"value":"IdleTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13059","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13068"},{"referenceType":"HasProperty","target":"ns=1;i=13070"},{"referenceType":"HasProperty","target":"ns=1;i=13069"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13068","parentNodeId":"ns=1;i=13059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13070","parentNodeId":"ns=1;i=13059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13069","parentNodeId":"ns=1;i=13059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceLevel","dataType":"MaintenanceLevelEnum","description":[{"value":"Maintenance task categorization by complexity"}],"displayName":[{"value":"MaintenanceLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6450","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6451"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6451","parentNodeId":"ns=1;i=6450","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6450"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceTime","dataType":"Double","description":[{"value":"Time interval when maintenance is carried out on an item including technical, logistic and internal administrative delays"}],"displayName":[{"value":"MaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6457","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6472"},{"referenceType":"HasProperty","target":"ns=1;i=6474"},{"referenceType":"HasProperty","target":"ns=1;i=6473"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6472","parentNodeId":"ns=1;i=6457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6474","parentNodeId":"ns=1;i=6457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6473","parentNodeId":"ns=1;i=6457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanOperatingTimeBetweenFailures","dataType":"Double","description":[{"value":"Average of the operating times between failures"}],"displayName":[{"value":"MeanOperatingTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6458","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6475"},{"referenceType":"HasProperty","target":"ns=1;i=6477"},{"referenceType":"HasProperty","target":"ns=1;i=6476"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6475","parentNodeId":"ns=1;i=6458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6458"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6477","parentNodeId":"ns=1;i=6458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6458"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6476","parentNodeId":"ns=1;i=6458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6458"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanRepairTime","dataType":"Double","description":[{"value":"Average of the repair times"}],"displayName":[{"value":"MeanRepairTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6459","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6478"},{"referenceType":"HasProperty","target":"ns=1;i=6480"},{"referenceType":"HasProperty","target":"ns=1;i=6479"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6478","parentNodeId":"ns=1;i=6459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6480","parentNodeId":"ns=1;i=6459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6479","parentNodeId":"ns=1;i=6459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanTimeToRestauration","dataType":"Double","description":[{"value":"Average of the time to restauration"}],"displayName":[{"value":"MeanTimeToRestauration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6460","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6481"},{"referenceType":"HasProperty","target":"ns=1;i=6483"},{"referenceType":"HasProperty","target":"ns=1;i=6482"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6481","parentNodeId":"ns=1;i=6460","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6460"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6483","parentNodeId":"ns=1;i=6460","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6460"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6482","parentNodeId":"ns=1;i=6460","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6460"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Obsolescence","dataType":"Boolean","description":[{"value":"Inability of an item to be maintained due to the unavailability on the market of the necessary resources at acceptable technical and/or economic conditions. A \u0022True\u0022 status means that the pump is obsolete and a \u0022False\u0022 status means that the pump is not obsolete."}],"displayName":[{"value":"Obsolescence"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6466","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasProperty","target":"ns=1;i=6486"},{"referenceType":"HasProperty","target":"ns=1;i=6467"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6468"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6486","parentNodeId":"ns=1;i=6466","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6466"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6467","parentNodeId":"ns=1;i=6466","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6466"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6468","parentNodeId":"ns=1;i=6466","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6466"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in operating state"}],"displayName":[{"value":"OperatingTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12949","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12986"},{"referenceType":"HasProperty","target":"ns=1;i=12988"},{"referenceType":"HasProperty","target":"ns=1;i=12987"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12986","parentNodeId":"ns=1;i=12949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12988","parentNodeId":"ns=1;i=12949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12987","parentNodeId":"ns=1;i=12949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTimeBetweenFailures","dataType":"Double","description":[{"value":"Operating time between consecutive failures"}],"displayName":[{"value":"OperatingTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6461","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6484"},{"referenceType":"HasProperty","target":"ns=1;i=6499"},{"referenceType":"HasProperty","target":"ns=1;i=6485"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6484","parentNodeId":"ns=1;i=6461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6499","parentNodeId":"ns=1;i=6461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6485","parentNodeId":"ns=1;i=6461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTimeToFailure","dataType":"Double","description":[{"value":"Operating time accumulated from the first use, or from restoration, until failure"}],"displayName":[{"value":"OperatingTimeToFailure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6462","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6487"},{"referenceType":"HasProperty","target":"ns=1;i=6489"},{"referenceType":"HasProperty","target":"ns=1;i=6488"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6487","parentNodeId":"ns=1;i=6462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6489","parentNodeId":"ns=1;i=6462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6488","parentNodeId":"ns=1;i=6462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RepairTime","dataType":"Double","description":[{"value":"Part of corrective maintenance time when repair is carried out on an item."}],"displayName":[{"value":"RepairTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6463","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6490"},{"referenceType":"HasProperty","target":"ns=1;i=6492"},{"referenceType":"HasProperty","target":"ns=1;i=6491"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6490","parentNodeId":"ns=1;i=6463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6492","parentNodeId":"ns=1;i=6463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6491","parentNodeId":"ns=1;i=6463","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6463"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:StandbyTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in a standby state"}],"displayName":[{"value":"StandbyTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13060","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13071"},{"referenceType":"HasProperty","target":"ns=1;i=13073"},{"referenceType":"HasProperty","target":"ns=1;i=13072"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13071","parentNodeId":"ns=1;i=13060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13073","parentNodeId":"ns=1;i=13060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13072","parentNodeId":"ns=1;i=13060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:StateOfTheItem","dataType":"StateOfTheItemEnum","description":[{"value":"Current state of the item"}],"displayName":[{"value":"StateOfTheItem"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6448","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6449"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6449","parentNodeId":"ns=1;i=6448","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6448"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeBetweenFailures","dataType":"Double","description":[{"value":"Duration between consecutive failures"}],"displayName":[{"value":"TimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6464","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6493"},{"referenceType":"HasProperty","target":"ns=1;i=6495"},{"referenceType":"HasProperty","target":"ns=1;i=6494"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6493","parentNodeId":"ns=1;i=6464","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6495","parentNodeId":"ns=1;i=6464","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6494","parentNodeId":"ns=1;i=6464","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeToRestoration","dataType":"Double","description":[{"value":"Time interval, from the instant of failure, until restoration"}],"displayName":[{"value":"TimeToRestoration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6465","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6496"},{"referenceType":"HasProperty","target":"ns=1;i=6498"},{"referenceType":"HasProperty","target":"ns=1;i=6497"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6496","parentNodeId":"ns=1;i=6465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6498","parentNodeId":"ns=1;i=6465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6497","parentNodeId":"ns=1;i=6465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:UpTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an up state"}],"displayName":[{"value":"UpTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13061","parentNodeId":"ns=1;i=1007","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13074"},{"referenceType":"HasProperty","target":"ns=1;i=13076"},{"referenceType":"HasProperty","target":"ns=1;i=13075"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1007"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13074","parentNodeId":"ns=1;i=13061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13076","parentNodeId":"ns=1;i=13061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13075","parentNodeId":"ns=1;i=13061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ImplementationType","displayName":[{"value":"ImplementationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.22","nodeClass":"ObjectType","nodeId":"ns=1;i=1023","references":[{"referenceType":"HasComponent","target":"ns=1;i=8102"},{"referenceType":"HasComponent","target":"ns=1;i=8103"},{"referenceType":"HasComponent","target":"ns=1;i=8104"},{"referenceType":"HasComponent","target":"ns=1;i=8105"},{"referenceType":"HasComponent","target":"ns=1;i=8106"},{"referenceType":"HasComponent","target":"ns=1;i=8107"},{"referenceType":"HasComponent","target":"ns=1;i=8108"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=8109"},{"referenceType":"HasComponent","target":"ns=1;i=8110"},{"referenceType":"HasComponent","target":"ns=1;i=8111"},{"referenceType":"HasComponent","target":"ns=1;i=8112"},{"referenceType":"HasComponent","target":"ns=1;i=8115"},{"referenceType":"HasComponent","target":"ns=1;i=8116"},{"referenceType":"HasComponent","target":"ns=1;i=8117"},{"referenceType":"HasComponent","target":"ns=1;i=8118"},{"referenceType":"HasComponent","target":"ns=1;i=8119"},{"referenceType":"HasComponent","target":"ns=1;i=8120"},{"referenceType":"HasComponent","target":"ns=1;i=8121"},{"referenceType":"HasComponent","target":"ns=1;i=8122"},{"referenceType":"HasComponent","target":"ns=1;i=8123"},{"referenceType":"HasComponent","target":"ns=1;i=8124"},{"referenceType":"HasComponent","target":"ns=1;i=8125"},{"referenceType":"HasComponent","target":"ns=1;i=8126"},{"referenceType":"HasComponent","target":"ns=1;i=8113"},{"referenceType":"HasComponent","target":"ns=1;i=8114"},{"referenceType":"HasComponent","target":"ns=1;i=8127"},{"referenceType":"HasComponent","target":"ns=1;i=8128"},{"referenceType":"HasComponent","target":"ns=1;i=8129"},{"referenceType":"HasComponent","target":"ns=1;i=8130"},{"referenceType":"HasComponent","target":"ns=1;i=8131"},{"referenceType":"HasComponent","target":"ns=1;i=8132"},{"referenceType":"HasComponent","target":"ns=1;i=8133"},{"referenceType":"HasComponent","target":"ns=1;i=8134"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:AtmosphericPressure","dataType":"Double","description":[{"value":"Mean absolute pressure of the atmosphere measured at the place of installation (2.1.1.3) of the pump"}],"displayName":[{"value":"AtmosphericPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8102","parentNodeId":"ns=1;i=1023","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8135"},{"referenceType":"HasProperty","target":"ns=1;i=8137"},{"referenceType":"HasProperty","target":"ns=1;i=8136"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8135","parentNodeId":"ns=1;i=8102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8137","parentNodeId":"ns=1;i=8102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8136","parentNodeId":"ns=1;i=8102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Density","dataType":"Double","description":[{"value":"Volumetric mass at a stated temperature"}],"displayName":[{"value":"Density"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8103","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8138"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasProperty","target":"ns=1;i=8140"},{"referenceType":"HasProperty","target":"ns=1;i=8139"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8138","parentNodeId":"ns=1;i=8103","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8103"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8140","parentNodeId":"ns=1;i=8103","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8103"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4934993\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/m\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per cubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8139","parentNodeId":"ns=1;i=8103","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8103"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DynamicViscosity","dataType":"Double","description":[{"value":"Ratio of the shear stress to the shear velocity acting in a liquid subjected to a plane shear motion"}],"displayName":[{"value":"DynamicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8104","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8141"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasProperty","target":"ns=1;i=8143"},{"referenceType":"HasProperty","target":"ns=1;i=8142"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8141","parentNodeId":"ns=1;i=8104","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8104"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8143","parentNodeId":"ns=1;i=8104","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8104"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4404789\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8142","parentNodeId":"ns=1;i=8104","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8104"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheInletManometer","dataType":"Double","description":[{"value":"Height of the zero or center position of the inlet manometer, or other point as defined by the manometer calibration"}],"displayName":[{"value":"HeightOfTheInletManometer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8105","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8144"},{"referenceType":"HasProperty","target":"ns=1;i=8146"},{"referenceType":"HasProperty","target":"ns=1;i=8145"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8144","parentNodeId":"ns=1;i=8105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8146","parentNodeId":"ns=1;i=8105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8145","parentNodeId":"ns=1;i=8105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheNpshDatumPlane","dataType":"Double","description":[{"value":"Difference between the NPSH datum plane and the reference plane"}],"displayName":[{"value":"HeightOfTheNpshDatumPlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8106","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8147"},{"referenceType":"HasProperty","target":"ns=1;i=8149"},{"referenceType":"HasProperty","target":"ns=1;i=8148"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8147","parentNodeId":"ns=1;i=8106","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8149","parentNodeId":"ns=1;i=8106","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8148","parentNodeId":"ns=1;i=8106","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletManometer","dataType":"Double","description":[{"value":"Height of the zero or center position of the outlet manometer, or other point as defined by the manometer calibration"}],"displayName":[{"value":"HeightOfTheOutletManometer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8107","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8150"},{"referenceType":"HasProperty","target":"ns=1;i=8152"},{"referenceType":"HasProperty","target":"ns=1;i=8151"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8150","parentNodeId":"ns=1;i=8107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8152","parentNodeId":"ns=1;i=8107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8151","parentNodeId":"ns=1;i=8107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HydraulicEfficiency","dataType":"Double","description":[{"value":"Proportion of pump available power input, Pa, which is delivered as pump power output, Pu, after satisfying the losses resulting from friction due to the relative motion of internal surfaces and internal leakage"}],"displayName":[{"value":"HydraulicEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8108","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8153"},{"referenceType":"HasProperty","target":"ns=1;i=8155"},{"referenceType":"HasProperty","target":"ns=1;i=8154"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8153","parentNodeId":"ns=1;i=8108","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8108"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8155","parentNodeId":"ns=1;i=8108","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8108"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8154","parentNodeId":"ns=1;i=8108","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8108"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:InstallationTotalHead","dataType":"Double","description":[{"value":"Difference between the total head at the outlet side of the installation and the total head at the inlet side of the installation"}],"displayName":[{"value":"InstallationTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8109","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8156"},{"referenceType":"HasProperty","target":"ns=1;i=8158"},{"referenceType":"HasProperty","target":"ns=1;i=8157"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8156","parentNodeId":"ns=1;i=8109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8158","parentNodeId":"ns=1;i=8109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8157","parentNodeId":"ns=1;i=8109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:KinematicViscosity","dataType":"Double","description":[{"value":"Ratio of the dynamic viscosity to the density of the pumped liquid"}],"displayName":[{"value":"KinematicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8110","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8159"},{"referenceType":"HasProperty","target":"ns=1;i=8161"},{"referenceType":"HasProperty","target":"ns=1;i=8160"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8159","parentNodeId":"ns=1;i=8110","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8110"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8161","parentNodeId":"ns=1;i=8110","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8110"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E21300\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8160","parentNodeId":"ns=1;i=8110","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8110"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumAllowableFlow","dataType":"Double","description":[{"value":"Greatest rate of flow that the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied"}],"displayName":[{"value":"MaximumAllowableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8111","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8162"},{"referenceType":"HasProperty","target":"ns=1;i=8164"},{"referenceType":"HasProperty","target":"ns=1;i=8163"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8162","parentNodeId":"ns=1;i=8111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8164","parentNodeId":"ns=1;i=8111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8163","parentNodeId":"ns=1;i=8111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumDynamicSealingPressure","dataType":"Double","description":[{"value":"Highest pressure expected at the shaft seals during any specified operating condition and during startup and shutdown"}],"displayName":[{"value":"MaximumDynamicSealingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8112","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8165"},{"referenceType":"HasProperty","target":"ns=1;i=8167"},{"referenceType":"HasProperty","target":"ns=1;i=8166"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8165","parentNodeId":"ns=1;i=8112","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8112"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8167","parentNodeId":"ns=1;i=8112","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8112"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8166","parentNodeId":"ns=1;i=8112","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8112"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MechanicalEfficiency","dataType":"Double","description":[{"value":"Proportion of the pump power input, P, available after satisfying the mechanical power losses, PJ,ab, at given operating conditions"}],"displayName":[{"value":"MechanicalEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8115","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8174"},{"referenceType":"HasProperty","target":"ns=1;i=8176"},{"referenceType":"HasProperty","target":"ns=1;i=8175"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8174","parentNodeId":"ns=1;i=8115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8176","parentNodeId":"ns=1;i=8115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8175","parentNodeId":"ns=1;i=8115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAllowableFlow","dataType":"Double","description":[{"value":"Smallest rate of flow that the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied"}],"displayName":[{"value":"MinimumAllowableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8116","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8177"},{"referenceType":"HasProperty","target":"ns=1;i=8179"},{"referenceType":"HasProperty","target":"ns=1;i=8178"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8177","parentNodeId":"ns=1;i=8116","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8116"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8179","parentNodeId":"ns=1;i=8116","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8116"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8178","parentNodeId":"ns=1;i=8116","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8116"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAllowableStableFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without exceeding the noise and vibration limits imposed in the order"}],"displayName":[{"value":"MinimumAllowableStableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8117","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8180"},{"referenceType":"HasProperty","target":"ns=1;i=8182"},{"referenceType":"HasProperty","target":"ns=1;i=8181"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8180","parentNodeId":"ns=1;i=8117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8182","parentNodeId":"ns=1;i=8117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8181","parentNodeId":"ns=1;i=8117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NetPositiveSuctionHeadAvailable","dataType":"Double","description":[{"value":"Minimum NPSH available at the inlet area of the pump as determined by the conditions of the installation for a specified rate of flow"}],"displayName":[{"value":"NetPositiveSuctionHeadAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8118","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8183"},{"referenceType":"HasProperty","target":"ns=1;i=8185"},{"referenceType":"HasProperty","target":"ns=1;i=8184"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8183","parentNodeId":"ns=1;i=8118","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8118"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8185","parentNodeId":"ns=1;i=8118","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8118"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8184","parentNodeId":"ns=1;i=8118","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8118"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OverallEfficiency","dataType":"Double","description":[{"value":"Proportion of the driver power input, Pmot, delivered as pump power output, Pu"}],"displayName":[{"value":"OverallEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8119","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8186"},{"referenceType":"HasProperty","target":"ns=1;i=8188"},{"referenceType":"HasProperty","target":"ns=1;i=8187"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8186","parentNodeId":"ns=1;i=8119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8188","parentNodeId":"ns=1;i=8119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8187","parentNodeId":"ns=1;i=8119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpBestEfficiency","dataType":"Double","description":[{"value":"Greatest value of pump efficiency obtained at given operating conditions"}],"displayName":[{"value":"PumpBestEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8120","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8189"},{"referenceType":"HasProperty","target":"ns=1;i=8191"},{"referenceType":"HasProperty","target":"ns=1;i=8190"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8189","parentNodeId":"ns=1;i=8120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8191","parentNodeId":"ns=1;i=8120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8190","parentNodeId":"ns=1;i=8120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpEfficiency","dataType":"Double","description":[{"value":"Proportion of the pump power input, P, delivered as pump power output, Pu, at given operating conditions"}],"displayName":[{"value":"PumpEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8121","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8192"},{"referenceType":"HasProperty","target":"ns=1;i=8194"},{"referenceType":"HasProperty","target":"ns=1;i=8193"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8192","parentNodeId":"ns=1;i=8121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8194","parentNodeId":"ns=1;i=8121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8193","parentNodeId":"ns=1;i=8121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpMechanicalPowerLosses","dataType":"Double","description":[{"value":"Power absorbed by friction in bearings and shaft seal at given operating conditions of the pump"}],"displayName":[{"value":"PumpMechanicalPowerLosses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8122","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8195"},{"referenceType":"HasProperty","target":"ns=1;i=8197"},{"referenceType":"HasProperty","target":"ns=1;i=8196"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8195","parentNodeId":"ns=1;i=8122","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8122"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8197","parentNodeId":"ns=1;i=8122","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8122"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8196","parentNodeId":"ns=1;i=8122","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8122"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpRatedPowerInput","dataType":"Double","description":[{"value":"Power required by the pump at the rated conditions"}],"displayName":[{"value":"PumpRatedPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8123","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8198"},{"referenceType":"HasProperty","target":"ns=1;i=8200"},{"referenceType":"HasProperty","target":"ns=1;i=8199"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8198","parentNodeId":"ns=1;i=8123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8200","parentNodeId":"ns=1;i=8123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8199","parentNodeId":"ns=1;i=8123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpTotalHead","dataType":"Double","description":[{"value":"Difference between the total head at the outlet side of the pump and the total head at the inlet side of the pump"}],"displayName":[{"value":"PumpTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8124","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8201"},{"referenceType":"HasProperty","target":"ns=1;i=8203"},{"referenceType":"HasProperty","target":"ns=1;i=8202"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8201","parentNodeId":"ns=1;i=8124","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8203","parentNodeId":"ns=1;i=8124","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8202","parentNodeId":"ns=1;i=8124","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedDifferentialPressure","dataType":"Double","description":[{"value":"Differential pressure for the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedDifferentialPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8125","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8204"},{"referenceType":"HasProperty","target":"ns=1;i=8206"},{"referenceType":"HasProperty","target":"ns=1;i=8205"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8204","parentNodeId":"ns=1;i=8125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8206","parentNodeId":"ns=1;i=8125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8205","parentNodeId":"ns=1;i=8125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedFlow","dataType":"Double","description":[{"value":"Rate of flow at the guarantee point"}],"displayName":[{"value":"RatedFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8126","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8207"},{"referenceType":"HasProperty","target":"ns=1;i=8209"},{"referenceType":"HasProperty","target":"ns=1;i=8208"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8207","parentNodeId":"ns=1;i=8126","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8209","parentNodeId":"ns=1;i=8126","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8208","parentNodeId":"ns=1;i=8126","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedMeanVelocityAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Rated flow at the inlet area of the installation divided by the inlet area of the installation"}],"displayName":[{"value":"RatedMeanVelocityAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8113","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8168"},{"referenceType":"HasProperty","target":"ns=1;i=8170"},{"referenceType":"HasProperty","target":"ns=1;i=8169"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"symbolicName":"MeanRatedVelocityAtInletAreaOfTheInstallation","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8168","parentNodeId":"ns=1;i=8113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8170","parentNodeId":"ns=1;i=8113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8169","parentNodeId":"ns=1;i=8113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedMeanVelocityAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Rated flow at the outlet area of the installation divided by the inlet area of the installation"}],"displayName":[{"value":"RatedMeanVelocityAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8114","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8171"},{"referenceType":"HasProperty","target":"ns=1;i=8173"},{"referenceType":"HasProperty","target":"ns=1;i=8172"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"symbolicName":"MeanRatedVelocityAtOutletAreaOfTheInstallation","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8171","parentNodeId":"ns=1;i=8114","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8114"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8173","parentNodeId":"ns=1;i=8114","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8114"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8172","parentNodeId":"ns=1;i=8114","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8114"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Number of revolutions of the pump in a given time required to meet the rated conditions"}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8127","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8210"},{"referenceType":"HasProperty","target":"ns=1;i=8212"},{"referenceType":"HasProperty","target":"ns=1;i=8211"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8210","parentNodeId":"ns=1;i=8127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8212","parentNodeId":"ns=1;i=8127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8211","parentNodeId":"ns=1;i=8127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Head observed at inlet area of the installation, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8128","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8213"},{"referenceType":"HasProperty","target":"ns=1;i=8215"},{"referenceType":"HasProperty","target":"ns=1;i=8214"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8213","parentNodeId":"ns=1;i=8128","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8128"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8215","parentNodeId":"ns=1;i=8128","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8128"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8214","parentNodeId":"ns=1;i=8128","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8128"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Head observed at outlet area of the installation, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8129","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8216"},{"referenceType":"HasProperty","target":"ns=1;i=8218"},{"referenceType":"HasProperty","target":"ns=1;i=8217"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8216","parentNodeId":"ns=1;i=8129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8218","parentNodeId":"ns=1;i=8129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8217","parentNodeId":"ns=1;i=8129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:UsefulLife","dataType":"Double","description":[{"value":"Time interval from first use until the instant when a limiting state is reached"}],"displayName":[{"value":"UsefulLife"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8130","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8219"},{"referenceType":"HasProperty","target":"ns=1;i=8221"},{"referenceType":"HasProperty","target":"ns=1;i=8220"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8219","parentNodeId":"ns=1;i=8130","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8130"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8221","parentNodeId":"ns=1;i=8130","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8130"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8220","parentNodeId":"ns=1;i=8130","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8130"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ValveSeatVelocity","dataType":"Double","description":[{"value":"Mean velocity of the flow through the valve seat at the specified operating conditions"}],"displayName":[{"value":"ValveSeatVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8131","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8222"},{"referenceType":"HasProperty","target":"ns=1;i=8224"},{"referenceType":"HasProperty","target":"ns=1;i=8223"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8222","parentNodeId":"ns=1;i=8131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8224","parentNodeId":"ns=1;i=8131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8223","parentNodeId":"ns=1;i=8131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ValveSpillVelocity","dataType":"Double","description":[{"value":"Mean velocity of the flow through the valve spill area"}],"displayName":[{"value":"ValveSpillVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8132","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8225"},{"referenceType":"HasProperty","target":"ns=1;i=8227"},{"referenceType":"HasProperty","target":"ns=1;i=8226"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8225","parentNodeId":"ns=1;i=8132","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8132"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8227","parentNodeId":"ns=1;i=8132","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8132"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8226","parentNodeId":"ns=1;i=8132","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8132"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:VaporPressureOfThePumpedLiquid","dataType":"Double","description":[{"value":"Absolute pressure at which the fluid vaporizes corresponding to the temperature of the liquid"}],"displayName":[{"value":"VaporPressureOfThePumpedLiquid"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8133","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8228"},{"referenceType":"HasProperty","target":"ns=1;i=8230"},{"referenceType":"HasProperty","target":"ns=1;i=8229"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8228","parentNodeId":"ns=1;i=8133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8230","parentNodeId":"ns=1;i=8133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8229","parentNodeId":"ns=1;i=8133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:VolumetricEfficiency","dataType":"Double","description":[{"value":"Ratio of the actual delivered volume at maximum pressure to the geometric displacement volume"}],"displayName":[{"value":"VolumetricEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8134","parentNodeId":"ns=1;i=1023","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8231"},{"referenceType":"HasProperty","target":"ns=1;i=8233"},{"referenceType":"HasProperty","target":"ns=1;i=8232"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1023"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8231","parentNodeId":"ns=1;i=8134","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8134"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8233","parentNodeId":"ns=1;i=8134","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8134"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8232","parentNodeId":"ns=1;i=8134","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8134"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletConnectionMeasurementsType","displayName":[{"value":"InletConnectionMeasurementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.50","nodeClass":"ObjectType","nodeId":"ns=1;i=1050","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9433"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasComponent","target":"ns=1;i=9435"}],"superType":"ns=3;i=1005"},{"browseName":"1:InletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the inlet area of the pump."}],"displayName":[{"value":"InletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9433","parentNodeId":"ns=1;i=1050","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9437"},{"referenceType":"HasProperty","target":"ns=1;i=9439"},{"referenceType":"HasProperty","target":"ns=1;i=9438"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1050"},{"referenceType":"HasProperty","target":"ns=1;i=14943"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9437","parentNodeId":"ns=1;i=9433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9439","parentNodeId":"ns=1;i=9433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9438","parentNodeId":"ns=1;i=9433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14943","parentNodeId":"ns=1;i=9433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtInlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump inlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9435","parentNodeId":"ns=1;i=1050","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9440"},{"referenceType":"HasProperty","target":"ns=1;i=9442"},{"referenceType":"HasProperty","target":"ns=1;i=9441"},{"referenceType":"HasProperty","target":"ns=1;i=14951"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1050"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9440","parentNodeId":"ns=1;i=9435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9442","parentNodeId":"ns=1;i=9435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9441","parentNodeId":"ns=1;i=9435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14951","parentNodeId":"ns=1;i=9435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:InletConnectionSystemRequirementsType","displayName":[{"value":"InletConnectionSystemRequirementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.44","nodeClass":"ObjectType","nodeId":"ns=1;i=1045","references":[{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9385"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:InletPressure","dataType":"Double","description":[{"value":"Pressure at the inlet of the pump, measured at a defined location in the test dome."}],"displayName":[{"value":"InletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9385","parentNodeId":"ns=1;i=1045","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9386"},{"referenceType":"HasProperty","target":"ns=1;i=9388"},{"referenceType":"HasProperty","target":"ns=1;i=9387"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1045"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9386","parentNodeId":"ns=1;i=9385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9388","parentNodeId":"ns=1;i=9385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9387","parentNodeId":"ns=1;i=9385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PumpIdentificationType","displayName":[{"value":"PumpIdentificationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.4","nodeClass":"ObjectType","nodeId":"ns=1;i=1005","references":[{"referenceType":"HasProperty","target":"ns=1;i=6071"},{"referenceType":"HasProperty","target":"ns=1;i=6079"},{"referenceType":"HasProperty","target":"ns=1;i=6072"},{"referenceType":"HasProperty","target":"ns=1;i=12928"},{"referenceType":"HasProperty","target":"ns=1;i=6073"},{"referenceType":"HasProperty","target":"ns=1;i=6074"},{"referenceType":"HasInterface","target":"ns=1;i=1004"},{"referenceType":"HasComponent","target":"ns=1;i=5022"},{"referenceType":"HasProperty","target":"ns=1;i=6075"},{"referenceType":"HasProperty","target":"ns=1;i=6076"},{"referenceType":"HasProperty","target":"ns=1;i=6081"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=2;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6077"},{"referenceType":"HasProperty","target":"ns=1;i=6078"}],"superType":"ns=2;i=1012"},{"browseName":"1:ArticleNumber","dataType":"String","description":[{"value":"Alphanumeric character sequence identifying a manufactured, non-configurable product."}],"displayName":[{"value":"ArticleNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6071","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:CountryOfOrigin","dataType":"String","description":[{"value":"Country in which the product is manufactured."}],"displayName":[{"value":"CountryOfOrigin"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6079","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DayOfConstruction","dataType":"Int32","description":[{"value":"The optional DayOfConstrucition provides the day of the month in which the manufacturing process of the machine has been completed. It shall be a number and never change during the life-cycle of a machine."}],"displayName":[{"value":"DayOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6072","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:DeviceClass","dataType":"String","description":[{"value":"Domain or for what purpose this item is used."}],"displayName":[{"value":"DeviceClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12928","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPump\u003C/uax:String\u003E"},{"browseName":"1:FabricationNumber","dataType":"String","description":[{"value":"Alphanumeric character sequence assigned to a fabricated product, which allows the date, time and circumstances of fabrication to be traced."}],"displayName":[{"value":"FabricationNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6073","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GTINCode","dataType":"String","description":[{"value":"Bar code number that identifies the device based on the Global Trade Item Number system."}],"displayName":[{"value":"GTINCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6074","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Markings","description":[{"value":"Safety instructions for safe use, e.g. temperature and pressure resistance, electrostatic charge, high voltage, radioactivity, explosive protection."}],"displayName":[{"value":"Markings"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5022","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasComponent","target":"ns=1;i=5023"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1005"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1002"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"ns=1;i=1002"},{"browseName":"1:\u003CMarking\u003E","displayName":[{"value":"\u003CMarking\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5023","parentNodeId":"ns=1;i=5022","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5022"},{"referenceType":"HasComponent","target":"ns=1;i=7013"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7014"},{"referenceType":"HasProperty","target":"ns=1;i=6095"},{"referenceType":"HasComponent","target":"ns=1;i=7015"},{"referenceType":"HasProperty","target":"ns=1;i=6087"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=7016"},{"referenceType":"HasComponent","target":"ns=1;i=7017"},{"referenceType":"HasProperty","target":"ns=1;i=6091"},{"referenceType":"HasProperty","target":"ns=1;i=6092"},{"referenceType":"HasProperty","target":"ns=1;i=6093"},{"referenceType":"HasComponent","target":"ns=1;i=7018"}],"symbolicName":"Marking","typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7013","parentNodeId":"ns=1;i=5023","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5023"},{"referenceType":"HasProperty","target":"ns=1;i=6082"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6082","parentNodeId":"ns=1;i=7013","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7013"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7014","parentNodeId":"ns=1;i=5023","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5023"},{"referenceType":"HasProperty","target":"ns=1;i=6083"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6084"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6083","parentNodeId":"ns=1;i=7014","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7014"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6084","parentNodeId":"ns=1;i=7014","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7014"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6095","parentNodeId":"ns=1;i=5023","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5023"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7015","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasProperty","target":"ns=1;i=6085"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5023"},{"referenceType":"HasProperty","target":"ns=1;i=6086"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6085","parentNodeId":"ns=1;i=7015","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7015"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6086","parentNodeId":"ns=1;i=7015","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7015"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6087","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5023"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7016","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasProperty","target":"ns=1;i=6088"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6089"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5023"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6088","parentNodeId":"ns=1;i=7016","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7016"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6089","parentNodeId":"ns=1;i=7016","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7016"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7017","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasProperty","target":"ns=1;i=6090"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5023"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6090","parentNodeId":"ns=1;i=7017","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7017"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6091","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5023"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6092","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5023"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6093","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5023"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7018","parentNodeId":"ns=1;i=5023","references":[{"referenceType":"HasProperty","target":"ns=1;i=6094"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5023"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6094","parentNodeId":"ns=1;i=7018","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7018"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:NationalStockNumber","dataType":"String","description":[{"value":"13-digit numeric code, identifying all \u0027standardized material items of supply\u0027 as recognized by the United States Department of Defense."}],"displayName":[{"value":"NationalStockNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6075","parentNodeId":"ns=1;i=1005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OrderProductCode","dataType":"String","description":[{"value":"Unique combination of numbers and letters used to order the device."}],"displayName":[{"value":"OrderProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6076","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PhysicalAddress","dataType":"PhysicalAddressDataType","description":[{"value":"Physical address of the manufacturer."}],"displayName":[{"value":"PhysicalAddress"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6081","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ens=1;i=5017\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003CPhysicalAddressDataType xmlns=\u0022http://opcfoundation.org/UA/Pumps/Types.xsd\u0022\u003E\n \u003CEncodingMask\u003E0\u003C/EncodingMask\u003E\n \u003C/PhysicalAddressDataType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Supplier","dataType":"String","description":[{"value":"Name of the supplier or vendor of a device."}],"displayName":[{"value":"Supplier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6077","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"}],"typeDefinition":"i=68"},{"browseName":"1:TypeOfProduct","dataType":"String","description":[{"value":"Characterisation of the device based on its usage, operation principle, and its fabricated form."}],"displayName":[{"value":"TypeOfProduct"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6078","parentNodeId":"ns=1;i=1005","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=1005"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceGroupType","displayName":[{"value":"MaintenanceGroupType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.6","nodeClass":"ObjectType","nodeId":"ns=1;i=1011","references":[{"referenceType":"HasComponent","target":"ns=1;i=5046"},{"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasComponent","target":"ns=1;i=5048"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=5049"}],"superType":"ns=3;i=1005"},{"browseName":"1:BreakdownMaintenance","description":[{"value":"Properties for breakdown maintenance."}],"displayName":[{"value":"BreakdownMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5046","parentNodeId":"ns=1;i=1011","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1011"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1010"},{"referenceType":"HasComponent","target":"ns=1;i=6576"},{"referenceType":"HasComponent","target":"ns=1;i=6577"},{"referenceType":"HasComponent","target":"ns=1;i=6578"},{"referenceType":"HasComponent","target":"ns=1;i=6581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=6582"}],"typeDefinition":"ns=1;i=1010"},{"browseName":"1:CorrectiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the maintenance time when active corrective maintenance is carried out on an item, including technical, logistic and internal administrative delays"}],"displayName":[{"value":"CorrectiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6576","parentNodeId":"ns=1;i=5046","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5046"},{"referenceType":"HasProperty","target":"ns=1;i=6583"},{"referenceType":"HasProperty","target":"ns=1;i=6585"},{"referenceType":"HasProperty","target":"ns=1;i=6584"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6583","parentNodeId":"ns=1;i=6576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6585","parentNodeId":"ns=1;i=6576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6584","parentNodeId":"ns=1;i=6576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Criticality","dataType":"Double","description":[{"value":"Index of the severity of an effect combined with the probability of expected frequency of its occurrence"}],"displayName":[{"value":"Criticality"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6577","parentNodeId":"ns=1;i=5046","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5046"},{"referenceType":"HasProperty","target":"ns=1;i=6586"},{"referenceType":"HasProperty","target":"ns=1;i=6587"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6586","parentNodeId":"ns=1;i=6577","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6577"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6587","parentNodeId":"ns=1;i=6577","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6577"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Failure","dataType":"Boolean","description":[{"value":"Termination of the ability of an item to perform a required function. A \u0022True\u0022 status means that the pump has a failure and a \u0022False\u0022 status means that the pump has no failure."}],"displayName":[{"value":"Failure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6578","parentNodeId":"ns=1;i=5046","references":[{"referenceType":"HasProperty","target":"ns=1;i=6589"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5046"},{"referenceType":"HasProperty","target":"ns=1;i=6579"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6580"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6589","parentNodeId":"ns=1;i=6578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6578"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6579","parentNodeId":"ns=1;i=6578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6578"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6580","parentNodeId":"ns=1;i=6578","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6578"}],"typeDefinition":"i=68"},{"browseName":"1:NumberOfFailures","dataType":"Int32","description":[{"value":"Number of failures of an object"}],"displayName":[{"value":"NumberOfFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6581","parentNodeId":"ns=1;i=5046","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6590"},{"referenceType":"HasProperty","target":"ns=1;i=6591"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5046"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6590","parentNodeId":"ns=1;i=6581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6591","parentNodeId":"ns=1;i=6581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Severity","dataType":"String","description":[{"value":"Extent of loss, damage or harm caused by a fault or failure"}],"displayName":[{"value":"Severity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6582","parentNodeId":"ns=1;i=5046","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6593"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5046"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6593","parentNodeId":"ns=1;i=6582","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6582"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ConditionBasedMaintenance","description":[{"value":"Properties for condition based maintenance."}],"displayName":[{"value":"ConditionBasedMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5047","parentNodeId":"ns=1;i=1011","references":[{"referenceType":"HasComponent","target":"ns=1;i=6594"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1011"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1008"},{"referenceType":"HasComponent","target":"ns=1;i=6595"},{"referenceType":"HasComponent","target":"ns=1;i=6596"},{"referenceType":"HasComponent","target":"ns=1;i=6597"},{"referenceType":"HasComponent","target":"ns=1;i=6598"},{"referenceType":"HasComponent","target":"ns=1;i=6599"},{"referenceType":"HasComponent","target":"ns=1;i=6600"},{"referenceType":"HasComponent","target":"ns=1;i=14641"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=6601"},{"referenceType":"HasComponent","target":"ns=1;i=6602"},{"referenceType":"HasComponent","target":"ns=1;i=6603"}],"typeDefinition":"ns=1;i=1008"},{"browseName":"1:Availability","dataType":"Double","description":[{"value":"Probability that a machine will, when used under specified conditions, operate satisfactorily and effectively"}],"displayName":[{"value":"Availability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6594","parentNodeId":"ns=1;i=5047","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6604"},{"referenceType":"HasProperty","target":"ns=1;i=6606"},{"referenceType":"HasProperty","target":"ns=1;i=6605"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6604","parentNodeId":"ns=1;i=6594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6606","parentNodeId":"ns=1;i=6594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6605","parentNodeId":"ns=1;i=6594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Durability","dataType":"Double","description":[{"value":"Actual reliability of an item considering operating modes, operating conditions and possible preventive maintenance actions carried out"}],"displayName":[{"value":"Durability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6595","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6607"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasProperty","target":"ns=1;i=6609"},{"referenceType":"HasProperty","target":"ns=1;i=6608"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6607","parentNodeId":"ns=1;i=6595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6609","parentNodeId":"ns=1;i=6595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6608","parentNodeId":"ns=1;i=6595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ExpectedReliability","dataType":"Double","description":[{"value":"Reliability of an item determined by design and manufacture under expected conditions of operation and maintenance"}],"displayName":[{"value":"ExpectedReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6596","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6610"},{"referenceType":"HasProperty","target":"ns=1;i=6612"},{"referenceType":"HasProperty","target":"ns=1;i=6611"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6610","parentNodeId":"ns=1;i=6596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6612","parentNodeId":"ns=1;i=6596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6611","parentNodeId":"ns=1;i=6596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InstantaneousAvailability","dataType":"Double","description":[{"value":"Probability that an item is in a state to perform as required at a given instant, under given conditions, assuming that the necessary external resources are provided"}],"displayName":[{"value":"InstantaneousAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6597","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6613"},{"referenceType":"HasProperty","target":"ns=1;i=6615"},{"referenceType":"HasProperty","target":"ns=1;i=6614"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6613","parentNodeId":"ns=1;i=6597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6615","parentNodeId":"ns=1;i=6597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6614","parentNodeId":"ns=1;i=6597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IntrinsicMaintainability","dataType":"Double","description":[{"value":"Maintainability of an item determined by the design under expected conditions of maintenance and logistic support"}],"displayName":[{"value":"IntrinsicMaintainability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6598","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6616"},{"referenceType":"HasProperty","target":"ns=1;i=6618"},{"referenceType":"HasProperty","target":"ns=1;i=6617"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6616","parentNodeId":"ns=1;i=6598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6618","parentNodeId":"ns=1;i=6598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6617","parentNodeId":"ns=1;i=6598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IntrinsicReliability","dataType":"Double","description":[{"value":"Reliability of an item determined by design and manufacture under expected conditions of operation assuming that no preventive maintenance task is carried out, excepting routine maintenance"}],"displayName":[{"value":"IntrinsicReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6599","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6619"},{"referenceType":"HasProperty","target":"ns=1;i=6621"},{"referenceType":"HasProperty","target":"ns=1;i=6620"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6619","parentNodeId":"ns=1;i=6599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6621","parentNodeId":"ns=1;i=6599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6620","parentNodeId":"ns=1;i=6599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Maintainability","dataType":"Double","description":[{"value":"Ability of a machine or part of a system to be retained in, or restored to, a state in which it can perform the required function(s)"}],"displayName":[{"value":"Maintainability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6600","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6622"},{"referenceType":"HasProperty","target":"ns=1;i=6624"},{"referenceType":"HasProperty","target":"ns=1;i=6623"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6622","parentNodeId":"ns=1;i=6600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6624","parentNodeId":"ns=1;i=6600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6623","parentNodeId":"ns=1;i=6600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperationalReliability","dataType":"Double","description":[{"value":"Actual reliability of an item considering operating modes, operating conditions and possible preventive maintenance actions carried out"}],"displayName":[{"value":"OperationalReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14641","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14643"},{"referenceType":"HasProperty","target":"ns=1;i=14645"},{"referenceType":"HasProperty","target":"ns=1;i=14644"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14643","parentNodeId":"ns=1;i=14641","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14641"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14645","parentNodeId":"ns=1;i=14641","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14641"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14644","parentNodeId":"ns=1;i=14641","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14641"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProductionBasedAvailability","dataType":"Double","description":[{"value":"Ratio of actual production to required production, or any other reference level, over a specified period of time"}],"displayName":[{"value":"ProductionBasedAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6601","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6625"},{"referenceType":"HasProperty","target":"ns=1;i=6627"},{"referenceType":"HasProperty","target":"ns=1;i=6626"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6625","parentNodeId":"ns=1;i=6601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6627","parentNodeId":"ns=1;i=6601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6626","parentNodeId":"ns=1;i=6601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Reliability","dataType":"Double","description":[{"value":"Probability that a machine will perform its required functions without failure for a specified time period when used under specified conditions"}],"displayName":[{"value":"Reliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6602","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6628"},{"referenceType":"HasProperty","target":"ns=1;i=6630"},{"referenceType":"HasProperty","target":"ns=1;i=6629"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6628","parentNodeId":"ns=1;i=6602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6630","parentNodeId":"ns=1;i=6602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6629","parentNodeId":"ns=1;i=6602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeBasedAvailability","dataType":"Double","description":[{"value":"During a given period of time, percentage of the time during which an item was able to perform when required"}],"displayName":[{"value":"TimeBasedAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6603","parentNodeId":"ns=1;i=5047","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6631"},{"referenceType":"HasProperty","target":"ns=1;i=6633"},{"referenceType":"HasProperty","target":"ns=1;i=6632"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5047"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6631","parentNodeId":"ns=1;i=6603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6633","parentNodeId":"ns=1;i=6603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6632","parentNodeId":"ns=1;i=6603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GeneralMaintenance","description":[{"value":"General maintenance properties."}],"displayName":[{"value":"GeneralMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5048","parentNodeId":"ns=1;i=1011","references":[{"referenceType":"HasComponent","target":"ns=1;i=6634"},{"referenceType":"HasComponent","target":"ns=1;i=14593"},{"referenceType":"HasComponent","target":"ns=1;i=14594"},{"referenceType":"HasComponent","target":"ns=1;i=6635"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1011"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1007"},{"referenceType":"HasComponent","target":"ns=1;i=14595"},{"referenceType":"HasComponent","target":"ns=1;i=6636"},{"referenceType":"HasComponent","target":"ns=1;i=6637"},{"referenceType":"HasComponent","target":"ns=1;i=6638"},{"referenceType":"HasComponent","target":"ns=1;i=6639"},{"referenceType":"HasComponent","target":"ns=1;i=6640"},{"referenceType":"HasComponent","target":"ns=1;i=6641"},{"referenceType":"HasComponent","target":"ns=1;i=14596"},{"referenceType":"HasComponent","target":"ns=1;i=6644"},{"referenceType":"HasComponent","target":"ns=1;i=6645"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=6646"},{"referenceType":"HasComponent","target":"ns=1;i=14597"},{"referenceType":"HasComponent","target":"ns=1;i=6647"},{"referenceType":"HasComponent","target":"ns=1;i=6648"},{"referenceType":"HasComponent","target":"ns=1;i=6649"},{"referenceType":"HasComponent","target":"ns=1;i=14598"}],"typeDefinition":"ns=1;i=1007"},{"browseName":"1:ActiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the maintenance time when active maintenance is carried out on an item."}],"displayName":[{"value":"ActiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6634","parentNodeId":"ns=1;i=5048","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6650"},{"referenceType":"HasProperty","target":"ns=1;i=6652"},{"referenceType":"HasProperty","target":"ns=1;i=6651"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6650","parentNodeId":"ns=1;i=6634","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6634"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6652","parentNodeId":"ns=1;i=6634","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6634"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6651","parentNodeId":"ns=1;i=6634","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6634"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DownTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in a down state"}],"displayName":[{"value":"DownTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14593","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14605"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasProperty","target":"ns=1;i=14607"},{"referenceType":"HasProperty","target":"ns=1;i=14606"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14605","parentNodeId":"ns=1;i=14593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14607","parentNodeId":"ns=1;i=14593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14606","parentNodeId":"ns=1;i=14593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ExternalDisabledTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an external disabled state"}],"displayName":[{"value":"ExternalDisabledTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14594","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14608"},{"referenceType":"HasProperty","target":"ns=1;i=14610"},{"referenceType":"HasProperty","target":"ns=1;i=14609"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14608","parentNodeId":"ns=1;i=14594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14610","parentNodeId":"ns=1;i=14594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14609","parentNodeId":"ns=1;i=14594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FailureRate","dataType":"Double","description":[{"value":"Number of failures within a population divided by the number of life units used by that population"}],"displayName":[{"value":"FailureRate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6635","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6653"},{"referenceType":"HasProperty","target":"ns=1;i=6655"},{"referenceType":"HasProperty","target":"ns=1;i=6654"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6653","parentNodeId":"ns=1;i=6635","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6635"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6655","parentNodeId":"ns=1;i=6635","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6635"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6654","parentNodeId":"ns=1;i=6635","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6635"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IdleTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an idle state"}],"displayName":[{"value":"IdleTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14595","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14611"},{"referenceType":"HasProperty","target":"ns=1;i=14613"},{"referenceType":"HasProperty","target":"ns=1;i=14612"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14611","parentNodeId":"ns=1;i=14595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14613","parentNodeId":"ns=1;i=14595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14612","parentNodeId":"ns=1;i=14595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceLevel","dataType":"MaintenanceLevelEnum","description":[{"value":"Maintenance task categorization by complexity"}],"displayName":[{"value":"MaintenanceLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6636","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6656"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6656","parentNodeId":"ns=1;i=6636","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6636"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceTime","dataType":"Double","description":[{"value":"Time interval when maintenance is carried out on an item including technical, logistic and internal administrative delays"}],"displayName":[{"value":"MaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6637","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6657"},{"referenceType":"HasProperty","target":"ns=1;i=6659"},{"referenceType":"HasProperty","target":"ns=1;i=6658"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6657","parentNodeId":"ns=1;i=6637","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6637"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6659","parentNodeId":"ns=1;i=6637","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6637"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6658","parentNodeId":"ns=1;i=6637","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6637"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanOperatingTimeBetweenFailures","dataType":"Double","description":[{"value":"Average of the operating times between failures"}],"displayName":[{"value":"MeanOperatingTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6638","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6660"},{"referenceType":"HasProperty","target":"ns=1;i=6662"},{"referenceType":"HasProperty","target":"ns=1;i=6661"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6660","parentNodeId":"ns=1;i=6638","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6638"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6662","parentNodeId":"ns=1;i=6638","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6638"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6661","parentNodeId":"ns=1;i=6638","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6638"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanRepairTime","dataType":"Double","description":[{"value":"Average of the repair times"}],"displayName":[{"value":"MeanRepairTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6639","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6663"},{"referenceType":"HasProperty","target":"ns=1;i=6665"},{"referenceType":"HasProperty","target":"ns=1;i=6664"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6663","parentNodeId":"ns=1;i=6639","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6639"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6665","parentNodeId":"ns=1;i=6639","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6639"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6664","parentNodeId":"ns=1;i=6639","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6639"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanTimeToRestauration","dataType":"Double","description":[{"value":"Average of the time to restauration"}],"displayName":[{"value":"MeanTimeToRestauration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6640","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6666"},{"referenceType":"HasProperty","target":"ns=1;i=6668"},{"referenceType":"HasProperty","target":"ns=1;i=6667"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6666","parentNodeId":"ns=1;i=6640","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6640"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6668","parentNodeId":"ns=1;i=6640","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6640"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6667","parentNodeId":"ns=1;i=6640","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6640"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Obsolescence","dataType":"Boolean","description":[{"value":"Inability of an item to be maintained due to the unavailability on the market of the necessary resources at acceptable technical and/or economic conditions. A \u0022True\u0022 status means that the pump is obsolete and a \u0022False\u0022 status means that the pump is not obsolete."}],"displayName":[{"value":"Obsolescence"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6641","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasProperty","target":"ns=1;i=6669"},{"referenceType":"HasProperty","target":"ns=1;i=6642"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6643"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6669","parentNodeId":"ns=1;i=6641","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6641"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6642","parentNodeId":"ns=1;i=6641","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6641"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6643","parentNodeId":"ns=1;i=6641","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6641"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in operating state"}],"displayName":[{"value":"OperatingTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14596","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14614"},{"referenceType":"HasProperty","target":"ns=1;i=14616"},{"referenceType":"HasProperty","target":"ns=1;i=14615"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14614","parentNodeId":"ns=1;i=14596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14616","parentNodeId":"ns=1;i=14596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14615","parentNodeId":"ns=1;i=14596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14596"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTimeBetweenFailures","dataType":"Double","description":[{"value":"Operating time between consecutive failures"}],"displayName":[{"value":"OperatingTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6644","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6670"},{"referenceType":"HasProperty","target":"ns=1;i=6672"},{"referenceType":"HasProperty","target":"ns=1;i=6671"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6670","parentNodeId":"ns=1;i=6644","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6644"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6672","parentNodeId":"ns=1;i=6644","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6644"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6671","parentNodeId":"ns=1;i=6644","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6644"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTimeToFailure","dataType":"Double","description":[{"value":"Operating time accumulated from the first use, or from restoration, until failure"}],"displayName":[{"value":"OperatingTimeToFailure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6645","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6673"},{"referenceType":"HasProperty","target":"ns=1;i=6675"},{"referenceType":"HasProperty","target":"ns=1;i=6674"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6673","parentNodeId":"ns=1;i=6645","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6645"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6675","parentNodeId":"ns=1;i=6645","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6645"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6674","parentNodeId":"ns=1;i=6645","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6645"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RepairTime","dataType":"Double","description":[{"value":"Part of corrective maintenance time when repair is carried out on an item."}],"displayName":[{"value":"RepairTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6646","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6676"},{"referenceType":"HasProperty","target":"ns=1;i=6678"},{"referenceType":"HasProperty","target":"ns=1;i=6677"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6676","parentNodeId":"ns=1;i=6646","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6646"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6678","parentNodeId":"ns=1;i=6646","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6646"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6677","parentNodeId":"ns=1;i=6646","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6646"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:StandbyTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in a standby state"}],"displayName":[{"value":"StandbyTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14597","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14617"},{"referenceType":"HasProperty","target":"ns=1;i=14619"},{"referenceType":"HasProperty","target":"ns=1;i=14618"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14617","parentNodeId":"ns=1;i=14597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14619","parentNodeId":"ns=1;i=14597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14618","parentNodeId":"ns=1;i=14597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:StateOfTheItem","dataType":"StateOfTheItemEnum","description":[{"value":"Current state of the item"}],"displayName":[{"value":"StateOfTheItem"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6647","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6679"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6679","parentNodeId":"ns=1;i=6647","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6647"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeBetweenFailures","dataType":"Double","description":[{"value":"Duration between consecutive failures"}],"displayName":[{"value":"TimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6648","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6680"},{"referenceType":"HasProperty","target":"ns=1;i=6682"},{"referenceType":"HasProperty","target":"ns=1;i=6681"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6680","parentNodeId":"ns=1;i=6648","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6648"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6682","parentNodeId":"ns=1;i=6648","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6648"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6681","parentNodeId":"ns=1;i=6648","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6648"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeToRestoration","dataType":"Double","description":[{"value":"Time interval, from the instant of failure, until restoration"}],"displayName":[{"value":"TimeToRestoration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6649","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6683"},{"referenceType":"HasProperty","target":"ns=1;i=6685"},{"referenceType":"HasProperty","target":"ns=1;i=6684"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6683","parentNodeId":"ns=1;i=6649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6685","parentNodeId":"ns=1;i=6649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6684","parentNodeId":"ns=1;i=6649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:UpTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an up state"}],"displayName":[{"value":"UpTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14598","parentNodeId":"ns=1;i=5048","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14620"},{"referenceType":"HasProperty","target":"ns=1;i=14622"},{"referenceType":"HasProperty","target":"ns=1;i=14621"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5048"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14620","parentNodeId":"ns=1;i=14598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14622","parentNodeId":"ns=1;i=14598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14621","parentNodeId":"ns=1;i=14598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14598"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PreventiveMaintenance","description":[{"value":"Properties for preventive maintenance."}],"displayName":[{"value":"PreventiveMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5049","parentNodeId":"ns=1;i=1011","references":[{"referenceType":"HasComponent","target":"ns=1;i=6686"},{"referenceType":"HasComponent","target":"ns=1;i=6687"},{"referenceType":"HasComponent","target":"ns=1;i=6688"},{"referenceType":"HasComponent","target":"ns=1;i=6689"},{"referenceType":"HasComponent","target":"ns=1;i=6690"},{"referenceType":"HasComponent","target":"ns=1;i=6691"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1011"},{"referenceType":"HasComponent","target":"ns=1;i=6692"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1009"}],"typeDefinition":"ns=1;i=1009"},{"accessLevel":3,"browseName":"1:ActivePreventiveMaintenanceTime","dataType":"Double","description":[{"value":"This attribute indicates the date of installation or commissioning of the device."}],"displayName":[{"value":"ActivePreventiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6686","parentNodeId":"ns=1;i=5049","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6693"},{"referenceType":"HasProperty","target":"ns=1;i=6695"},{"referenceType":"HasProperty","target":"ns=1;i=6694"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6693","parentNodeId":"ns=1;i=6686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6695","parentNodeId":"ns=1;i=6686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6694","parentNodeId":"ns=1;i=6686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:InstallationDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device was last inspected."}],"displayName":[{"value":"InstallationDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6687","parentNodeId":"ns=1;i=5049","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6696"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6696","parentNodeId":"ns=1;i=6687","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:LastInspectionDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device is scheduled for the next inspection."}],"displayName":[{"value":"LastInspectionDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6688","parentNodeId":"ns=1;i=5049","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6697"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6697","parentNodeId":"ns=1;i=6688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6688"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:LastServicingDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device is scheduled for the next servicing."}],"displayName":[{"value":"LastServicingDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6689","parentNodeId":"ns=1;i=5049","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6698"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6698","parentNodeId":"ns=1;i=6689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NextInspectionDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device was last serviced."}],"displayName":[{"value":"NextInspectionDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6690","parentNodeId":"ns=1;i=5049","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6699"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6699","parentNodeId":"ns=1;i=6690","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6690"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NextServicingDate","dataType":"DateTime","description":[{"value":"Part of maintenance time when preventive maintenance is carried out on an item, including technical, logistic and internal administrative delays"}],"displayName":[{"value":"NextServicingDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6691","parentNodeId":"ns=1;i=5049","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6700"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6700","parentNodeId":"ns=1;i=6691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PreventiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the active maintenance time taken to perform a preventive maintenance"}],"displayName":[{"value":"PreventiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6692","parentNodeId":"ns=1;i=5049","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6701"},{"referenceType":"HasProperty","target":"ns=1;i=6703"},{"referenceType":"HasProperty","target":"ns=1;i=6702"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5049"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6701","parentNodeId":"ns=1;i=6692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6703","parentNodeId":"ns=1;i=6692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6702","parentNodeId":"ns=1;i=6692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeasurementsType","displayName":[{"value":"MeasurementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.32","nodeClass":"ObjectType","nodeId":"ns=1;i=1054","references":[{"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasComponent","target":"ns=1;i=11265"},{"referenceType":"HasComponent","target":"ns=1;i=9515"},{"referenceType":"HasComponent","target":"ns=1;i=11127"},{"referenceType":"HasComponent","target":"ns=1;i=11859"},{"referenceType":"HasComponent","target":"ns=1;i=12637"},{"referenceType":"HasComponent","target":"ns=1;i=12639"},{"referenceType":"HasComponent","target":"ns=1;i=12641"},{"referenceType":"HasComponent","target":"ns=1;i=12643"},{"referenceType":"HasComponent","target":"ns=1;i=12645"},{"referenceType":"HasComponent","target":"ns=1;i=12647"},{"referenceType":"HasComponent","target":"ns=1;i=12649"},{"referenceType":"HasComponent","target":"ns=1;i=12651"},{"referenceType":"HasComponent","target":"ns=1;i=12653"},{"referenceType":"HasComponent","target":"ns=1;i=12655"},{"referenceType":"HasComponent","target":"ns=1;i=12657"},{"referenceType":"HasComponent","target":"ns=1;i=12659"},{"referenceType":"HasComponent","target":"ns=1;i=12661"},{"referenceType":"HasComponent","target":"ns=1;i=12663"},{"referenceType":"HasComponent","target":"ns=1;i=12667"},{"referenceType":"HasComponent","target":"ns=1;i=12665"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasComponent","target":"ns=1;i=12669"},{"referenceType":"HasComponent","target":"ns=1;i=12671"},{"referenceType":"HasComponent","target":"ns=1;i=12673"},{"referenceType":"HasComponent","target":"ns=1;i=12675"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=12677"},{"referenceType":"HasComponent","target":"ns=1;i=12679"},{"referenceType":"HasComponent","target":"ns=1;i=12681"},{"referenceType":"HasComponent","target":"ns=1;i=12683"},{"referenceType":"HasComponent","target":"ns=1;i=12685"},{"referenceType":"HasComponent","target":"ns=1;i=12687"},{"referenceType":"HasComponent","target":"ns=1;i=12689"},{"referenceType":"HasComponent","target":"ns=1;i=12691"},{"referenceType":"HasComponent","target":"ns=1;i=12693"},{"referenceType":"HasComponent","target":"ns=1;i=12695"},{"referenceType":"HasComponent","target":"ns=1;i=12697"},{"referenceType":"HasComponent","target":"ns=1;i=12699"},{"referenceType":"HasComponent","target":"ns=1;i=12701"},{"referenceType":"HasComponent","target":"ns=1;i=12703"},{"referenceType":"HasComponent","target":"ns=1;i=12705"},{"referenceType":"HasComponent","target":"ns=1;i=12707"},{"referenceType":"HasComponent","target":"ns=1;i=12709"},{"referenceType":"HasComponent","target":"ns=1;i=12711"},{"referenceType":"HasComponent","target":"ns=1;i=12713"},{"referenceType":"HasComponent","target":"ns=1;i=12715"},{"referenceType":"HasComponent","target":"ns=1;i=12717"},{"referenceType":"HasComponent","target":"ns=1;i=12719"},{"referenceType":"HasComponent","target":"ns=1;i=12721"},{"referenceType":"HasComponent","target":"ns=1;i=12723"},{"referenceType":"HasComponent","target":"ns=1;i=12725"},{"referenceType":"HasComponent","target":"ns=1;i=12727"}],"superType":"ns=3;i=1005"},{"browseName":"1:\u003CVibration\u003E","description":[{"value":"Properties characterizing dynamic data which are the result of an oscillation measurement at machines with rotating movements"}],"displayName":[{"value":"\u003CVibration\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5228","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasComponent","target":"ns=1;i=11283"},{"referenceType":"HasComponent","target":"ns=1;i=11285"},{"referenceType":"HasComponent","target":"ns=1;i=11287"},{"referenceType":"HasComponent","target":"ns=1;i=11289"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasComponent","target":"ns=1;i=13853"},{"referenceType":"HasComponent","target":"ns=1;i=13855"},{"referenceType":"HasComponent","target":"ns=1;i=13857"},{"referenceType":"HasComponent","target":"ns=1;i=13859"},{"referenceType":"HasComponent","target":"ns=1;i=13861"},{"referenceType":"HasComponent","target":"ns=1;i=13863"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=13865"},{"referenceType":"HasComponent","target":"ns=1;i=13867"},{"referenceType":"HasComponent","target":"ns=1;i=13869"},{"referenceType":"HasComponent","target":"ns=1;i=13873"},{"referenceType":"HasComponent","target":"ns=1;i=13871"},{"referenceType":"HasComponent","target":"ns=1;i=13875"},{"referenceType":"HasComponent","target":"ns=1;i=13877"},{"referenceType":"HasComponent","target":"ns=1;i=13879"},{"referenceType":"HasComponent","target":"ns=1;i=13881"},{"referenceType":"HasComponent","target":"ns=1;i=13883"},{"referenceType":"HasComponent","target":"ns=1;i=13885"},{"referenceType":"HasComponent","target":"ns=1;i=13887"},{"referenceType":"HasComponent","target":"ns=1;i=13888"},{"referenceType":"HasComponent","target":"ns=1;i=13890"},{"referenceType":"HasComponent","target":"ns=1;i=13892"},{"referenceType":"HasComponent","target":"ns=1;i=13894"},{"referenceType":"HasComponent","target":"ns=1;i=13896"},{"referenceType":"HasComponent","target":"ns=1;i=13898"},{"referenceType":"HasComponent","target":"ns=1;i=13900"},{"referenceType":"HasComponent","target":"ns=1;i=13902"},{"referenceType":"HasComponent","target":"ns=1;i=13904"},{"referenceType":"HasComponent","target":"ns=1;i=13906"},{"referenceType":"HasComponent","target":"ns=1;i=13908"},{"referenceType":"HasComponent","target":"ns=1;i=13910"},{"referenceType":"HasComponent","target":"ns=1;i=13912"},{"referenceType":"HasComponent","target":"ns=1;i=13914"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1055"}],"symbolicName":"Vibration","typeDefinition":"ns=1;i=1055"},{"accessLevel":5,"browseName":"1:1XPhase","dataType":"Double","description":[{"value":"Phase of the 1X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"1XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11283","parentNodeId":"ns=1;i=5228","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13084"},{"referenceType":"HasProperty","target":"ns=1;i=13085"},{"referenceType":"HasProperty","target":"ns=1;i=13086"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XPhase","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13084","parentNodeId":"ns=1;i=11283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13085","parentNodeId":"ns=1;i=11283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13086","parentNodeId":"ns=1;i=11283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11285","parentNodeId":"ns=1;i=5228","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13096"},{"referenceType":"HasProperty","target":"ns=1;i=13097"},{"referenceType":"HasProperty","target":"ns=1;i=13098"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XRelativeShaftVibrationP_P","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13096","parentNodeId":"ns=1;i=11285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13097","parentNodeId":"ns=1;i=11285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13098","parentNodeId":"ns=1;i=11285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XPhase","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"2XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11287","parentNodeId":"ns=1;i=5228","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13090"},{"referenceType":"HasProperty","target":"ns=1;i=13091"},{"referenceType":"HasProperty","target":"ns=1;i=13092"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XPhase","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13090","parentNodeId":"ns=1;i=11287","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13091","parentNodeId":"ns=1;i=11287","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13092","parentNodeId":"ns=1;i=11287","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the double rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"2XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11289","parentNodeId":"ns=1;i=5228","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13102"},{"referenceType":"HasProperty","target":"ns=1;i=13103"},{"referenceType":"HasProperty","target":"ns=1;i=13104"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XRelativeShaftVibrationP_P","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13102","parentNodeId":"ns=1;i=11289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13103","parentNodeId":"ns=1;i=11289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13104","parentNodeId":"ns=1;i=11289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndex","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndex"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13853","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasProperty","target":"ns=1;i=13916"},{"referenceType":"HasProperty","target":"ns=1;i=13918"},{"referenceType":"HasProperty","target":"ns=1;i=13917"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13916","parentNodeId":"ns=1;i=13853","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13853"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13918","parentNodeId":"ns=1;i=13853","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13853"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13917","parentNodeId":"ns=1;i=13853","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13853"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndexPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndexPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13855","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasProperty","target":"ns=1;i=13919"},{"referenceType":"HasProperty","target":"ns=1;i=13921"},{"referenceType":"HasProperty","target":"ns=1;i=13920"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13919","parentNodeId":"ns=1;i=13855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13921","parentNodeId":"ns=1;i=13855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13920","parentNodeId":"ns=1;i=13855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration in units of the acceleration of gravity g. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13857","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasProperty","target":"ns=1;i=13922"},{"referenceType":"HasProperty","target":"ns=1;i=13924"},{"referenceType":"HasProperty","target":"ns=1;i=13923"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13922","parentNodeId":"ns=1;i=13857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13857"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13924","parentNodeId":"ns=1;i=13857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13857"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13923","parentNodeId":"ns=1;i=13857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13857"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13859","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasProperty","target":"ns=1;i=13925"},{"referenceType":"HasProperty","target":"ns=1;i=13927"},{"referenceType":"HasProperty","target":"ns=1;i=13926"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13925","parentNodeId":"ns=1;i=13859","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13859"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13927","parentNodeId":"ns=1;i=13859","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13859"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13926","parentNodeId":"ns=1;i=13859","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13859"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapVoltage","dataType":"Double","description":[{"value":"Sum value of the oscillation ranges of the vibration at all frequencies except the rotation frequency of the shaft under consideration, expressed as displacement. Regularly, only the frequency range below the rotational frequency is considered."}],"displayName":[{"value":"GapVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13861","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13928"},{"referenceType":"HasProperty","target":"ns=1;i=13930"},{"referenceType":"HasProperty","target":"ns=1;i=13929"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13928","parentNodeId":"ns=1;i=13861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13930","parentNodeId":"ns=1;i=13861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13929","parentNodeId":"ns=1;i=13861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Not1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"Not1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13863","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13931"},{"referenceType":"HasProperty","target":"ns=1;i=13933"},{"referenceType":"HasProperty","target":"ns=1;i=13932"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13931","parentNodeId":"ns=1;i=13863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13933","parentNodeId":"ns=1;i=13863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13932","parentNodeId":"ns=1;i=13863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAcceleration0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAcceleration0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13865","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13934"},{"referenceType":"HasProperty","target":"ns=1;i=13936"},{"referenceType":"HasProperty","target":"ns=1;i=13935"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13934","parentNodeId":"ns=1;i=13865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13865"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13936","parentNodeId":"ns=1;i=13865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13865"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13935","parentNodeId":"ns=1;i=13865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13865"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13867","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13937"},{"referenceType":"HasProperty","target":"ns=1;i=13939"},{"referenceType":"HasProperty","target":"ns=1;i=13938"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13937","parentNodeId":"ns=1;i=13867","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13867"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13939","parentNodeId":"ns=1;i=13867","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13867"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13938","parentNodeId":"ns=1;i=13867","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13867"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerG0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13869","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13940"},{"referenceType":"HasProperty","target":"ns=1;i=13942"},{"referenceType":"HasProperty","target":"ns=1;i=13941"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13940","parentNodeId":"ns=1;i=13869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13942","parentNodeId":"ns=1;i=13869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13941","parentNodeId":"ns=1;i=13869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration in units of the acceleration of gravity g"}],"displayName":[{"value":"OverallVibrationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13873","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13946"},{"referenceType":"HasProperty","target":"ns=1;i=13948"},{"referenceType":"HasProperty","target":"ns=1;i=13947"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13946","parentNodeId":"ns=1;i=13873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13948","parentNodeId":"ns=1;i=13873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13947","parentNodeId":"ns=1;i=13873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerGP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerGP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13871","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13943"},{"referenceType":"HasProperty","target":"ns=1;i=13945"},{"referenceType":"HasProperty","target":"ns=1;i=13944"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13943","parentNodeId":"ns=1;i=13871","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13871"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13945","parentNodeId":"ns=1;i=13871","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13871"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13944","parentNodeId":"ns=1;i=13871","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13871"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration"}],"displayName":[{"value":"OverallVibrationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13875","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13949"},{"referenceType":"HasProperty","target":"ns=1;i=13951"},{"referenceType":"HasProperty","target":"ns=1;i=13950"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13949","parentNodeId":"ns=1;i=13875","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13875"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13951","parentNodeId":"ns=1;i=13875","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13875"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13950","parentNodeId":"ns=1;i=13875","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13875"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13877","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13952"},{"referenceType":"HasProperty","target":"ns=1;i=13954"},{"referenceType":"HasProperty","target":"ns=1;i=13953"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13952","parentNodeId":"ns=1;i=13877","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13954","parentNodeId":"ns=1;i=13877","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13953","parentNodeId":"ns=1;i=13877","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementRMS","dataType":"Double","description":[{"value":"Root mean square of oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13879","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13955"},{"referenceType":"HasProperty","target":"ns=1;i=13957"},{"referenceType":"HasProperty","target":"ns=1;i=13956"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13955","parentNodeId":"ns=1;i=13879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13957","parentNodeId":"ns=1;i=13879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13956","parentNodeId":"ns=1;i=13879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocity0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocity0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13881","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13958"},{"referenceType":"HasProperty","target":"ns=1;i=13960"},{"referenceType":"HasProperty","target":"ns=1;i=13959"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13958","parentNodeId":"ns=1;i=13881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13960","parentNodeId":"ns=1;i=13881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13959","parentNodeId":"ns=1;i=13881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocityP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13883","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13961"},{"referenceType":"HasProperty","target":"ns=1;i=13963"},{"referenceType":"HasProperty","target":"ns=1;i=13962"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13961","parentNodeId":"ns=1;i=13883","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13883"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13963","parentNodeId":"ns=1;i=13883","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13883"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13962","parentNodeId":"ns=1;i=13883","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13883"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement expressed as velocity"}],"displayName":[{"value":"OverallVibrationVelocityRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13885","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13964"},{"referenceType":"HasProperty","target":"ns=1;i=13966"},{"referenceType":"HasProperty","target":"ns=1;i=13965"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13964","parentNodeId":"ns=1;i=13885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13885"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13966","parentNodeId":"ns=1;i=13885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13885"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13965","parentNodeId":"ns=1;i=13885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13885"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ReferenceStandardForVibrationMeasurement","dataType":"String","description":[{"value":"Standard to which statements on vibration measurement refer."}],"displayName":[{"value":"ReferenceStandardForVibrationMeasurement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13887","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13967"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13967","parentNodeId":"ns=1;i=13887","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13887"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase1X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the rotation frequency (1X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13888","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13968"},{"referenceType":"HasProperty","target":"ns=1;i=13970"},{"referenceType":"HasProperty","target":"ns=1;i=13969"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13968","parentNodeId":"ns=1;i=13888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13888"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13970","parentNodeId":"ns=1;i=13888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13888"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13969","parentNodeId":"ns=1;i=13888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13888"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase2X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the first harmonic of the rotation frequency (2X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13890","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13971"},{"referenceType":"HasProperty","target":"ns=1;i=13973"},{"referenceType":"HasProperty","target":"ns=1;i=13972"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13971","parentNodeId":"ns=1;i=13890","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13890"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13973","parentNodeId":"ns=1;i=13890","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13890"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13972","parentNodeId":"ns=1;i=13890","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13890"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SpeedOfRotation","dataType":"Double","description":[{"value":"Number of revolutions per time."}],"displayName":[{"value":"SpeedOfRotation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13892","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13974"},{"referenceType":"HasProperty","target":"ns=1;i=13976"},{"referenceType":"HasProperty","target":"ns=1;i=13975"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13974","parentNodeId":"ns=1;i=13892","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13892"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13976","parentNodeId":"ns=1;i=13892","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13892"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13975","parentNodeId":"ns=1;i=13892","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13892"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ThrustPosition","dataType":"Double","description":[{"value":"Measure for the distance between the sensor and the shaft, expressed as device output voltage"}],"displayName":[{"value":"ThrustPosition"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13894","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13977"},{"referenceType":"HasProperty","target":"ns=1;i=13979"},{"referenceType":"HasProperty","target":"ns=1;i=13978"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13977","parentNodeId":"ns=1;i=13894","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13894"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13979","parentNodeId":"ns=1;i=13894","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13894"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5066068\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13978","parentNodeId":"ns=1;i=13894","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13894"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequencies","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequencies"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13896","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13980"},{"referenceType":"HasProperty","target":"ns=1;i=13982"},{"referenceType":"HasProperty","target":"ns=1;i=13981"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13980","parentNodeId":"ns=1;i=13896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13982","parentNodeId":"ns=1;i=13896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13981","parentNodeId":"ns=1;i=13896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequenciesPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequenciesPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13898","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13983"},{"referenceType":"HasProperty","target":"ns=1;i=13985"},{"referenceType":"HasProperty","target":"ns=1;i=13984"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13983","parentNodeId":"ns=1;i=13898","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13898"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13985","parentNodeId":"ns=1;i=13898","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13898"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13984","parentNodeId":"ns=1;i=13898","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13898"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBladePassFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft multiplied with the number of blades mounted at the shaft, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheBladePassFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13900","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13986"},{"referenceType":"HasProperty","target":"ns=1;i=13988"},{"referenceType":"HasProperty","target":"ns=1;i=13987"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13986","parentNodeId":"ns=1;i=13900","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13900"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13988","parentNodeId":"ns=1;i=13900","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13900"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13987","parentNodeId":"ns=1;i=13900","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13900"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X","dataType":"Double","description":[{"value":"Oscillation amplitude at the double rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13902","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13989"},{"referenceType":"HasProperty","target":"ns=1;i=13991"},{"referenceType":"HasProperty","target":"ns=1;i=13990"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13989","parentNodeId":"ns=1;i=13902","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13902"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13991","parentNodeId":"ns=1;i=13902","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13902"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13990","parentNodeId":"ns=1;i=13902","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13902"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13904","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13992"},{"referenceType":"HasProperty","target":"ns=1;i=13994"},{"referenceType":"HasProperty","target":"ns=1;i=13993"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13992","parentNodeId":"ns=1;i=13904","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13904"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13994","parentNodeId":"ns=1;i=13904","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13904"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13993","parentNodeId":"ns=1;i=13904","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13904"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13906","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13995"},{"referenceType":"HasProperty","target":"ns=1;i=13997"},{"referenceType":"HasProperty","target":"ns=1;i=13996"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13995","parentNodeId":"ns=1;i=13906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13997","parentNodeId":"ns=1;i=13906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13996","parentNodeId":"ns=1;i=13906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the harmonics of the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13908","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13998"},{"referenceType":"HasProperty","target":"ns=1;i=14000"},{"referenceType":"HasProperty","target":"ns=1;i=13999"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13998","parentNodeId":"ns=1;i=13908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13908"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14000","parentNodeId":"ns=1;i=13908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13908"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13999","parentNodeId":"ns=1;i=13908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13908"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheRotationFrequency1X","dataType":"Double","description":[{"value":"Oscillation amplitude at the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheRotationFrequency1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13910","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14001"},{"referenceType":"HasProperty","target":"ns=1;i=14003"},{"referenceType":"HasProperty","target":"ns=1;i=14002"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14001","parentNodeId":"ns=1;i=13910","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13910"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14003","parentNodeId":"ns=1;i=13910","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13910"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14002","parentNodeId":"ns=1;i=13910","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13910"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13912","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14004"},{"referenceType":"HasProperty","target":"ns=1;i=14006"},{"referenceType":"HasProperty","target":"ns=1;i=14005"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14004","parentNodeId":"ns=1;i=13912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13912"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14006","parentNodeId":"ns=1;i=13912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13912"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14005","parentNodeId":"ns=1;i=13912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13912"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13914","parentNodeId":"ns=1;i=5228","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14007"},{"referenceType":"HasProperty","target":"ns=1;i=14009"},{"referenceType":"HasProperty","target":"ns=1;i=14008"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5228"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14007","parentNodeId":"ns=1;i=13914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14009","parentNodeId":"ns=1;i=13914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14008","parentNodeId":"ns=1;i=13914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:AmbientHumidity","dataType":"Double","description":[{"value":"Measured ambient humidity"}],"displayName":[{"value":"AmbientHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11265","parentNodeId":"ns=1;i=1054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11292"},{"referenceType":"HasProperty","target":"ns=1;i=11339"},{"referenceType":"HasProperty","target":"ns=1;i=14723"},{"referenceType":"HasProperty","target":"ns=1;i=6007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11292","parentNodeId":"ns=1;i=11265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11265"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11339","parentNodeId":"ns=1;i=11265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11265"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14723","parentNodeId":"ns=1;i=11265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11265"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of partial pressure of water vapor and partial pressure at its saturation"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6007","parentNodeId":"ns=1;i=11265","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11265"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erelative humidity\u003C/uax:String\u003E"},{"browseName":"1:AmbientTemperature","dataType":"Double","description":[{"value":"Measured ambient temperature"}],"displayName":[{"value":"AmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9515","parentNodeId":"ns=1;i=1054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6031"},{"referenceType":"HasProperty","target":"ns=1;i=9429"},{"referenceType":"HasProperty","target":"ns=1;i=9424"},{"referenceType":"HasProperty","target":"ns=1;i=9448"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6031","parentNodeId":"ns=1;i=9515","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9515"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9429","parentNodeId":"ns=1;i=9515","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9515"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9424","parentNodeId":"ns=1;i=9515","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9515"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9448","parentNodeId":"ns=1;i=9515","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9515"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:AxialLoadOfPumpRotor","dataType":"Double","description":[{"value":"Measured residual thrust acting through the shaft derived from hydraulic or mechanical forces"}],"displayName":[{"value":"AxialLoadOfPumpRotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11127","parentNodeId":"ns=1;i=1054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9464"},{"referenceType":"HasProperty","target":"ns=1;i=9468"},{"referenceType":"HasProperty","target":"ns=1;i=9466"},{"referenceType":"HasProperty","target":"ns=1;i=9571"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9464","parentNodeId":"ns=1;i=11127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11127"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9468","parentNodeId":"ns=1;i=11127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11127"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9466","parentNodeId":"ns=1;i=11127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11127"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity describing interaction between bodies or particles"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9571","parentNodeId":"ns=1;i=11127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11127"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eforce\u003C/uax:String\u003E"},{"browseName":"1:AxialRotorPosition","dataType":"Double","description":[{"value":"Measured position of the axial rotor in bearing."}],"displayName":[{"value":"AxialRotorPosition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11859","parentNodeId":"ns=1;i=1054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9577"},{"referenceType":"HasProperty","target":"ns=1;i=9672"},{"referenceType":"HasProperty","target":"ns=1;i=9579"},{"referenceType":"HasProperty","target":"ns=1;i=10985"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9577","parentNodeId":"ns=1;i=11859","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11859"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9672","parentNodeId":"ns=1;i=11859","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11859"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9579","parentNodeId":"ns=1;i=11859","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11859"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10985","parentNodeId":"ns=1;i=11859","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11859"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:BackPressure","dataType":"Double","description":[{"value":"Measured back pressure of the pump"}],"displayName":[{"value":"BackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12637","parentNodeId":"ns=1;i=1054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=10991"},{"referenceType":"HasProperty","target":"ns=1;i=10995"},{"referenceType":"HasProperty","target":"ns=1;i=10993"},{"referenceType":"HasProperty","target":"ns=1;i=11280"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10991","parentNodeId":"ns=1;i=12637","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12637"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10995","parentNodeId":"ns=1;i=12637","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12637"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10993","parentNodeId":"ns=1;i=12637","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12637"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11280","parentNodeId":"ns=1;i=12637","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12637"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:BearingTemperature","dataType":"Double","description":[{"value":"Measured temperature of the bearing"}],"displayName":[{"value":"BearingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12639","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=11286"},{"referenceType":"HasProperty","target":"ns=1;i=11290"},{"referenceType":"HasProperty","target":"ns=1;i=11288"},{"referenceType":"HasProperty","target":"ns=1;i=11905"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11286","parentNodeId":"ns=1;i=12639","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12639"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11290","parentNodeId":"ns=1;i=12639","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12639"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11288","parentNodeId":"ns=1;i=12639","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12639"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11905","parentNodeId":"ns=1;i=12639","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12639"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:ClearanceFlow","dataType":"Double","description":[{"value":"Measured clearance flow between the housing and the impeller"}],"displayName":[{"value":"ClearanceFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12641","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=11920"},{"referenceType":"HasProperty","target":"ns=1;i=11930"},{"referenceType":"HasProperty","target":"ns=1;i=11925"},{"referenceType":"HasProperty","target":"ns=1;i=9460"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11920","parentNodeId":"ns=1;i=12641","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12641"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11930","parentNodeId":"ns=1;i=12641","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12641"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11925","parentNodeId":"ns=1;i=12641","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12641"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9460","parentNodeId":"ns=1;i=12641","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12641"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:CoolantTemperature","dataType":"Double","description":[{"value":"Measured temperature of the coolant."}],"displayName":[{"value":"CoolantTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12643","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=9561"},{"referenceType":"HasProperty","target":"ns=1;i=9674"},{"referenceType":"HasProperty","target":"ns=1;i=9569"},{"referenceType":"HasProperty","target":"ns=1;i=14751"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9561","parentNodeId":"ns=1;i=12643","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12643"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9674","parentNodeId":"ns=1;i=12643","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12643"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9569","parentNodeId":"ns=1;i=12643","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12643"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14751","parentNodeId":"ns=1;i=12643","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12643"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:Density","dataType":"Double","description":[{"value":"Measured density of the fluid"}],"displayName":[{"value":"Density"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12645","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11860"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=11935"},{"referenceType":"HasProperty","target":"ns=1;i=11900"},{"referenceType":"HasProperty","target":"ns=1;i=14754"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11860","parentNodeId":"ns=1;i=12645","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12645"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11935","parentNodeId":"ns=1;i=12645","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12645"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4934993\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/m\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per cubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11900","parentNodeId":"ns=1;i=12645","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12645"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing the spatial distribution of mass of a continuous material"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14754","parentNodeId":"ns=1;i=12645","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12645"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Edensity\u003C/uax:String\u003E"},{"browseName":"1:DifferentialPressure","dataType":"Double","description":[{"value":"Determined (actual) gain in total pressure between the pump inlet and pump outlet"}],"displayName":[{"value":"DifferentialPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12647","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12467"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=12640"},{"referenceType":"HasProperty","target":"ns=1;i=12638"},{"referenceType":"HasProperty","target":"ns=1;i=14757"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12467","parentNodeId":"ns=1;i=12647","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12647"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12640","parentNodeId":"ns=1;i=12647","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12647"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12638","parentNodeId":"ns=1;i=12647","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12647"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14757","parentNodeId":"ns=1;i=12647","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12647"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:DynamicViscosity","dataType":"Double","description":[{"value":"Measured kinematic viscosity of the fluid"}],"displayName":[{"value":"DynamicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12649","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12654"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=12658"},{"referenceType":"HasProperty","target":"ns=1;i=12656"},{"referenceType":"HasProperty","target":"ns=1;i=14760"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12654","parentNodeId":"ns=1;i=12649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12658","parentNodeId":"ns=1;i=12649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12656","parentNodeId":"ns=1;i=12649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"For laminar flows, proportionality constant between shear stress in a fluid moving with a velocity and gradient perpendicular to the plane of shear"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14760","parentNodeId":"ns=1;i=12649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Edynamic viscosity\u003C/uax:String\u003E"},{"browseName":"1:ElectronicTemperature","dataType":"Double","description":[{"value":"Measured temperature of the electronic"}],"displayName":[{"value":"ElectronicTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12651","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12672"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=12676"},{"referenceType":"HasProperty","target":"ns=1;i=12674"},{"referenceType":"HasProperty","target":"ns=1;i=14763"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12672","parentNodeId":"ns=1;i=12651","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12651"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12676","parentNodeId":"ns=1;i=12651","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12651"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12674","parentNodeId":"ns=1;i=12651","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12651"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14763","parentNodeId":"ns=1;i=12651","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12651"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:FluidTemperature","dataType":"Double","description":[{"value":"Measured internal temperature of pump fluid."}],"displayName":[{"value":"FluidTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12653","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12690"},{"referenceType":"HasProperty","target":"ns=1;i=12694"},{"referenceType":"HasProperty","target":"ns=1;i=12692"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=14766"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12690","parentNodeId":"ns=1;i=12653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12694","parentNodeId":"ns=1;i=12653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12692","parentNodeId":"ns=1;i=12653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14766","parentNodeId":"ns=1;i=12653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:HousingTemperature","dataType":"Double","description":[{"value":"Measured temperature of the housing"}],"displayName":[{"value":"HousingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12655","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12708"},{"referenceType":"HasProperty","target":"ns=1;i=12712"},{"referenceType":"HasProperty","target":"ns=1;i=12710"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=14769"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12708","parentNodeId":"ns=1;i=12655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12712","parentNodeId":"ns=1;i=12655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12710","parentNodeId":"ns=1;i=12655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14769","parentNodeId":"ns=1;i=12655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:HydraulicEfficiency","dataType":"Double","description":[{"value":"Determined proportion of pump available power input, Pa, which is delivered as pump power output, Pu, after satisfying the losses resulting from friction due to the relative motion of internal surfaces and internal leakage"}],"displayName":[{"value":"HydraulicEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12657","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12726"},{"referenceType":"HasProperty","target":"ns=1;i=12729"},{"referenceType":"HasProperty","target":"ns=1;i=12728"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=14772"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12726","parentNodeId":"ns=1;i=12657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12729","parentNodeId":"ns=1;i=12657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12728","parentNodeId":"ns=1;i=12657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14772","parentNodeId":"ns=1;i=12657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:InletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Measured pressure at the inlet area of the installation."}],"displayName":[{"value":"InletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12659","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12736"},{"referenceType":"HasProperty","target":"ns=1;i=12738"},{"referenceType":"HasProperty","target":"ns=1;i=12737"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=14775"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12736","parentNodeId":"ns=1;i=12659","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12659"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12738","parentNodeId":"ns=1;i=12659","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12659"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12737","parentNodeId":"ns=1;i=12659","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12659"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14775","parentNodeId":"ns=1;i=12659","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12659"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:InstallationTotalHead","dataType":"Double","description":[{"value":"Determined difference between the total head at the outlet side of the installation and the total head at the inlet side of the installation"}],"displayName":[{"value":"InstallationTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12661","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12745"},{"referenceType":"HasProperty","target":"ns=1;i=12747"},{"referenceType":"HasProperty","target":"ns=1;i=12746"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasProperty","target":"ns=1;i=14778"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12745","parentNodeId":"ns=1;i=12661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12661"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12747","parentNodeId":"ns=1;i=12661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12661"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12746","parentNodeId":"ns=1;i=12661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12661"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14778","parentNodeId":"ns=1;i=12661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12661"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:KinematicViscosity","dataType":"Double","description":[{"value":"Measured dynamic viscosity of the fluid"}],"displayName":[{"value":"KinematicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12663","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12754"},{"referenceType":"HasProperty","target":"ns=1;i=12756"},{"referenceType":"HasProperty","target":"ns=1;i=12755"},{"referenceType":"HasProperty","target":"ns=1;i=14781"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12754","parentNodeId":"ns=1;i=12663","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12663"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12756","parentNodeId":"ns=1;i=12663","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12663"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E21300\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12755","parentNodeId":"ns=1;i=12663","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12663"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of dynamic viscosity and mass density of a fluid"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14781","parentNodeId":"ns=1;i=12663","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12663"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ekinematic viscosity\u003C/uax:String\u003E"},{"browseName":"1:LeakageRateOfFlow","dataType":"Double","description":[{"value":"Measured rate of flow leaking from shaft seals"}],"displayName":[{"value":"LeakageRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12667","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12763"},{"referenceType":"HasProperty","target":"ns=1;i=12765"},{"referenceType":"HasProperty","target":"ns=1;i=12764"},{"referenceType":"HasProperty","target":"ns=1;i=14784"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12763","parentNodeId":"ns=1;i=12667","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12667"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12765","parentNodeId":"ns=1;i=12667","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12667"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12764","parentNodeId":"ns=1;i=12667","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12667"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14784","parentNodeId":"ns=1;i=12667","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12667"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:Level","dataType":"Double","description":[{"value":"Measured level"}],"displayName":[{"value":"Level"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12665","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12772"},{"referenceType":"HasProperty","target":"ns=1;i=12774"},{"referenceType":"HasProperty","target":"ns=1;i=12773"},{"referenceType":"HasProperty","target":"ns=1;i=14787"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12772","parentNodeId":"ns=1;i=12665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12774","parentNodeId":"ns=1;i=12665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12773","parentNodeId":"ns=1;i=12665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14787","parentNodeId":"ns=1;i=12665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:LubricatingOilConsumption","dataType":"Double","description":[{"value":"Measured oil consumption of the lubricating system"}],"displayName":[{"value":"LubricatingOilConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12669","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12781"},{"referenceType":"HasProperty","target":"ns=1;i=12783"},{"referenceType":"HasProperty","target":"ns=1;i=12782"},{"referenceType":"HasProperty","target":"ns=1;i=14790"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12781","parentNodeId":"ns=1;i=12669","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12669"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12783","parentNodeId":"ns=1;i=12669","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12669"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12782","parentNodeId":"ns=1;i=12669","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12669"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Extent of a three dimensional geometrical shape"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14790","parentNodeId":"ns=1;i=12669","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12669"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume\u003C/uax:String\u003E"},{"browseName":"1:LubricatingOilPressure","dataType":"Double","description":[{"value":"Measured oil pressure of the lubrication system"}],"displayName":[{"value":"LubricatingOilPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12671","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12790"},{"referenceType":"HasProperty","target":"ns=1;i=12792"},{"referenceType":"HasProperty","target":"ns=1;i=12791"},{"referenceType":"HasProperty","target":"ns=1;i=14793"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12790","parentNodeId":"ns=1;i=12671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12792","parentNodeId":"ns=1;i=12671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12791","parentNodeId":"ns=1;i=12671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14793","parentNodeId":"ns=1;i=12671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:MassFlow","dataType":"Double","description":[{"value":"Measure mass flow from the outlet area of the pump"}],"displayName":[{"value":"MassFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12673","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12799"},{"referenceType":"HasProperty","target":"ns=1;i=12801"},{"referenceType":"HasProperty","target":"ns=1;i=12800"},{"referenceType":"HasProperty","target":"ns=1;i=14796"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12799","parentNodeId":"ns=1;i=12673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12801","parentNodeId":"ns=1;i=12673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12800","parentNodeId":"ns=1;i=12673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity characterizing a flowing fluid by the product of its local mass density and local velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14796","parentNodeId":"ns=1;i=12673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emass flow\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtThroat","dataType":"Double","description":[{"value":"Measured rate of flow passing through the exit from the volute divided by the throat area"}],"displayName":[{"value":"MeanVelocityAtThroat"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12675","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12808"},{"referenceType":"HasProperty","target":"ns=1;i=12810"},{"referenceType":"HasProperty","target":"ns=1;i=12809"},{"referenceType":"HasProperty","target":"ns=1;i=14799"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12808","parentNodeId":"ns=1;i=12675","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12675"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12810","parentNodeId":"ns=1;i=12675","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12675"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12809","parentNodeId":"ns=1;i=12675","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12675"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14799","parentNodeId":"ns=1;i=12675","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12675"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:MechanicalEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the pump power input, P, available after satisfying the mechanical power losses, PJ, ab, at given operating conditions"}],"displayName":[{"value":"MechanicalEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12677","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12817"},{"referenceType":"HasProperty","target":"ns=1;i=12819"},{"referenceType":"HasProperty","target":"ns=1;i=12818"},{"referenceType":"HasProperty","target":"ns=1;i=14802"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12817","parentNodeId":"ns=1;i=12677","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12677"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12819","parentNodeId":"ns=1;i=12677","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12677"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12818","parentNodeId":"ns=1;i=12677","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12677"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14802","parentNodeId":"ns=1;i=12677","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12677"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:NetPositiveInletPressure","dataType":"Double","description":[{"value":"Total pressure (including velocity pressure) at the pump inlet connection less the liquid vapor pressure at the present temperature of the liquid"}],"displayName":[{"value":"NetPositiveInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12679","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12826"},{"referenceType":"HasProperty","target":"ns=1;i=12828"},{"referenceType":"HasProperty","target":"ns=1;i=12827"},{"referenceType":"HasProperty","target":"ns=1;i=14805"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12826","parentNodeId":"ns=1;i=12679","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12679"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12828","parentNodeId":"ns=1;i=12679","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12679"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12827","parentNodeId":"ns=1;i=12679","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12679"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14805","parentNodeId":"ns=1;i=12679","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12679"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:NetPositiveSuctionHead","dataType":"Double","description":[{"value":"Amount of the absolute value of the total head above the head, equivalent to the vapor pressure of the liquid at the particular temperature, with reference to the NPSH datum plane"}],"displayName":[{"value":"NetPositiveSuctionHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12681","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12835"},{"referenceType":"HasProperty","target":"ns=1;i=12837"},{"referenceType":"HasProperty","target":"ns=1;i=12836"},{"referenceType":"HasProperty","target":"ns=1;i=14808"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12835","parentNodeId":"ns=1;i=12681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12837","parentNodeId":"ns=1;i=12681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12836","parentNodeId":"ns=1;i=12681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14808","parentNodeId":"ns=1;i=12681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:NumberOfStarts","dataType":"UInt32","description":[{"value":"Total number of starts"}],"displayName":[{"value":"NumberOfStarts"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12683","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12844"},{"referenceType":"HasProperty","target":"ns=1;i=12846"},{"referenceType":"HasProperty","target":"ns=1;i=12845"},{"referenceType":"HasProperty","target":"ns=1;i=14811"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:UInt32 xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:UInt32\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12844","parentNodeId":"ns=1;i=12683","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12683"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12846","parentNodeId":"ns=1;i=12683","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12683"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12845","parentNodeId":"ns=1;i=12683","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12683"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14811","parentNodeId":"ns=1;i=12683","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12683"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:OutletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Measured pressure at the outlet area of the installation."}],"displayName":[{"value":"OutletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12685","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12853"},{"referenceType":"HasProperty","target":"ns=1;i=12855"},{"referenceType":"HasProperty","target":"ns=1;i=12854"},{"referenceType":"HasProperty","target":"ns=1;i=14814"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12853","parentNodeId":"ns=1;i=12685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12855","parentNodeId":"ns=1;i=12685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12854","parentNodeId":"ns=1;i=12685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14814","parentNodeId":"ns=1;i=12685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:OverallEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the driver power input, Pmot, delivered as pump power output, Pu"}],"displayName":[{"value":"OverallEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12687","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12862"},{"referenceType":"HasProperty","target":"ns=1;i=12864"},{"referenceType":"HasProperty","target":"ns=1;i=12863"},{"referenceType":"HasProperty","target":"ns=1;i=14817"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12862","parentNodeId":"ns=1;i=12687","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12864","parentNodeId":"ns=1;i=12687","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12863","parentNodeId":"ns=1;i=12687","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14817","parentNodeId":"ns=1;i=12687","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:PowerLossDueToInternalLeakage","dataType":"Double","description":[{"value":"Determined power loss due clearance flows"}],"displayName":[{"value":"PowerLossDueToInternalLeakage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12689","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12871"},{"referenceType":"HasProperty","target":"ns=1;i=12873"},{"referenceType":"HasProperty","target":"ns=1;i=12872"},{"referenceType":"HasProperty","target":"ns=1;i=14820"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12871","parentNodeId":"ns=1;i=12689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12873","parentNodeId":"ns=1;i=12689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12872","parentNodeId":"ns=1;i=12689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14820","parentNodeId":"ns=1;i=12689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:ProcessPressure","dataType":"Double","description":[{"value":"Measured process pressure of the pump"}],"displayName":[{"value":"ProcessPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12691","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12880"},{"referenceType":"HasProperty","target":"ns=1;i=12882"},{"referenceType":"HasProperty","target":"ns=1;i=12881"},{"referenceType":"HasProperty","target":"ns=1;i=14823"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12880","parentNodeId":"ns=1;i=12691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12882","parentNodeId":"ns=1;i=12691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12881","parentNodeId":"ns=1;i=12691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14823","parentNodeId":"ns=1;i=12691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:PumpEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the pump power input, P, delivered as pump power output, Pu, at given operating conditions"}],"displayName":[{"value":"PumpEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12693","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12889"},{"referenceType":"HasProperty","target":"ns=1;i=12891"},{"referenceType":"HasProperty","target":"ns=1;i=12890"},{"referenceType":"HasProperty","target":"ns=1;i=14826"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12889","parentNodeId":"ns=1;i=12693","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12693"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12891","parentNodeId":"ns=1;i=12693","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12693"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12890","parentNodeId":"ns=1;i=12693","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12693"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14826","parentNodeId":"ns=1;i=12693","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12693"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:PumpHumidity","dataType":"Double","description":[{"value":"Measured humidity inside the pump"}],"displayName":[{"value":"PumpHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12695","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12898"},{"referenceType":"HasProperty","target":"ns=1;i=12900"},{"referenceType":"HasProperty","target":"ns=1;i=12899"},{"referenceType":"HasProperty","target":"ns=1;i=14829"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12898","parentNodeId":"ns=1;i=12695","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12695"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12900","parentNodeId":"ns=1;i=12695","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12695"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12899","parentNodeId":"ns=1;i=12695","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12695"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of partial pressure of water vapor and partial pressure at its saturation"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14829","parentNodeId":"ns=1;i=12695","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12695"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erelative humidity\u003C/uax:String\u003E"},{"browseName":"1:PumpPowerInput","dataType":"Double","description":[{"value":"Measured power transmitted to the pump by its driver"}],"displayName":[{"value":"PumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12697","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12907"},{"referenceType":"HasProperty","target":"ns=1;i=12909"},{"referenceType":"HasProperty","target":"ns=1;i=12908"},{"referenceType":"HasProperty","target":"ns=1;i=14832"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12907","parentNodeId":"ns=1;i=12697","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12697"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12909","parentNodeId":"ns=1;i=12697","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12697"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12908","parentNodeId":"ns=1;i=12697","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12697"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar product of force acting to a body and its velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14832","parentNodeId":"ns=1;i=12697","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12697"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emechanical power\u003C/uax:String\u003E"},{"browseName":"1:PumpPowerOutput","dataType":"Double","description":[{"value":"Measured useful mechanical power transferred to the fluid during its passage through the pump"}],"displayName":[{"value":"PumpPowerOutput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12699","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12916"},{"referenceType":"HasProperty","target":"ns=1;i=12918"},{"referenceType":"HasProperty","target":"ns=1;i=12917"},{"referenceType":"HasProperty","target":"ns=1;i=14835"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12916","parentNodeId":"ns=1;i=12699","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12699"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12918","parentNodeId":"ns=1;i=12699","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12699"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12917","parentNodeId":"ns=1;i=12699","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12699"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar product of force acting to a body and its velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14835","parentNodeId":"ns=1;i=12699","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12699"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emechanical power\u003C/uax:String\u003E"},{"browseName":"1:PumpTemperature","dataType":"Double","description":[{"value":"Measured temperature of the pump"}],"displayName":[{"value":"PumpTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12701","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12927"},{"referenceType":"HasProperty","target":"ns=1;i=13108"},{"referenceType":"HasProperty","target":"ns=1;i=13106"},{"referenceType":"HasProperty","target":"ns=1;i=14838"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12927","parentNodeId":"ns=1;i=12701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12701"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13108","parentNodeId":"ns=1;i=12701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12701"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13106","parentNodeId":"ns=1;i=12701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12701"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14838","parentNodeId":"ns=1;i=12701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12701"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:PumpTotalHead","dataType":"Double","description":[{"value":"Determined difference between the total head at the outlet side of the pump and the total head at the inlet side of the pump"}],"displayName":[{"value":"PumpTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12703","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13122"},{"referenceType":"HasProperty","target":"ns=1;i=13126"},{"referenceType":"HasProperty","target":"ns=1;i=13124"},{"referenceType":"HasProperty","target":"ns=1;i=14841"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13122","parentNodeId":"ns=1;i=12703","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12703"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13126","parentNodeId":"ns=1;i=12703","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12703"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13124","parentNodeId":"ns=1;i=12703","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12703"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14841","parentNodeId":"ns=1;i=12703","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12703"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:RadialLoadOfPumpRotor","dataType":"Double","description":[{"value":"Measured residual force acting at right angles to the line of the shaft and derived from hydraulic forces"}],"displayName":[{"value":"RadialLoadOfPumpRotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12705","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13142"},{"referenceType":"HasProperty","target":"ns=1;i=13146"},{"referenceType":"HasProperty","target":"ns=1;i=13144"},{"referenceType":"HasProperty","target":"ns=1;i=14844"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13142","parentNodeId":"ns=1;i=12705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13146","parentNodeId":"ns=1;i=12705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13144","parentNodeId":"ns=1;i=12705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity describing interaction between bodies or particles"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14844","parentNodeId":"ns=1;i=12705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eforce\u003C/uax:String\u003E"},{"browseName":"1:SoundEnergy","dataType":"Double","description":[{"value":"Determined integral of the sound power, P, over a stated time interval of duration T (starting at t1 and ending at t2)"}],"displayName":[{"value":"SoundEnergy"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12707","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13160"},{"referenceType":"HasProperty","target":"ns=1;i=13164"},{"referenceType":"HasProperty","target":"ns=1;i=13162"},{"referenceType":"HasProperty","target":"ns=1;i=14847"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13160","parentNodeId":"ns=1;i=12707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13164","parentNodeId":"ns=1;i=12707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13162","parentNodeId":"ns=1;i=12707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14847","parentNodeId":"ns=1;i=12707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:SoundEnergyLevel","dataType":"Double","description":[{"value":"Determined ten times the logarithm to the base 10 of the ratio of the sound energy, J, to a reference value, J0, expressed in decibels"}],"displayName":[{"value":"SoundEnergyLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12709","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13862"},{"referenceType":"HasProperty","target":"ns=1;i=13866"},{"referenceType":"HasProperty","target":"ns=1;i=13864"},{"referenceType":"HasProperty","target":"ns=1;i=14850"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13862","parentNodeId":"ns=1;i=12709","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12709"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13866","parentNodeId":"ns=1;i=12709","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12709"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13864","parentNodeId":"ns=1;i=12709","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12709"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14850","parentNodeId":"ns=1;i=12709","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12709"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:SoundPower","dataType":"Double","description":[{"value":"Determined through a surface, product of the sound pressure, p, and the component of the particle velocity, un, at a point on the surface in the direction normal to the surface, integrated over that surface"}],"displayName":[{"value":"SoundPower"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12711","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13880"},{"referenceType":"HasProperty","target":"ns=1;i=13884"},{"referenceType":"HasProperty","target":"ns=1;i=13882"},{"referenceType":"HasProperty","target":"ns=1;i=14853"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13880","parentNodeId":"ns=1;i=12711","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13884","parentNodeId":"ns=1;i=12711","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13882","parentNodeId":"ns=1;i=12711","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14853","parentNodeId":"ns=1;i=12711","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:SoundPowerLevel","dataType":"Double","description":[{"value":"Determined ten times the logarithm to the base 10 of the ratio of the sound power of a source, P, to a reference value, P0, expressed in decibels"}],"displayName":[{"value":"SoundPowerLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12713","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13899"},{"referenceType":"HasProperty","target":"ns=1;i=13903"},{"referenceType":"HasProperty","target":"ns=1;i=13901"},{"referenceType":"HasProperty","target":"ns=1;i=14856"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13899","parentNodeId":"ns=1;i=12713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13903","parentNodeId":"ns=1;i=12713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13901","parentNodeId":"ns=1;i=12713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14856","parentNodeId":"ns=1;i=12713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:SoundPressure","dataType":"Double","description":[{"value":"Measured difference between instantaneous pressure and static pressure"}],"displayName":[{"value":"SoundPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12715","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14649"},{"referenceType":"HasProperty","target":"ns=1;i=14653"},{"referenceType":"HasProperty","target":"ns=1;i=14651"},{"referenceType":"HasProperty","target":"ns=1;i=14859"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14649","parentNodeId":"ns=1;i=12715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14653","parentNodeId":"ns=1;i=12715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14651","parentNodeId":"ns=1;i=12715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14859","parentNodeId":"ns=1;i=12715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:SoundPressureLevel","dataType":"Double","description":[{"value":"Determined ten times logarithm to the base 10 of the ratio of the square of the sound pressure, p, to the square of a reference value, p0, expressed in decibels"}],"displayName":[{"value":"SoundPressureLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12717","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14667"},{"referenceType":"HasProperty","target":"ns=1;i=14671"},{"referenceType":"HasProperty","target":"ns=1;i=14669"},{"referenceType":"HasProperty","target":"ns=1;i=14862"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14667","parentNodeId":"ns=1;i=12717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14671","parentNodeId":"ns=1;i=12717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14669","parentNodeId":"ns=1;i=12717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14862","parentNodeId":"ns=1;i=12717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:Speed","dataType":"Double","description":[{"value":"Measured number of rotations or movements made by the shaft, coupling or impeller in a given time"}],"displayName":[{"value":"Speed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12719","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14685"},{"referenceType":"HasProperty","target":"ns=1;i=14689"},{"referenceType":"HasProperty","target":"ns=1;i=14687"},{"referenceType":"HasProperty","target":"ns=1;i=14865"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14685","parentNodeId":"ns=1;i=12719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14689","parentNodeId":"ns=1;i=12719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14687","parentNodeId":"ns=1;i=12719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14865","parentNodeId":"ns=1;i=12719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:Throughput","dataType":"Double","description":[{"value":"Measured throughput of the vacuum pump"}],"displayName":[{"value":"Throughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12721","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14703"},{"referenceType":"HasProperty","target":"ns=1;i=14707"},{"referenceType":"HasProperty","target":"ns=1;i=14705"},{"referenceType":"HasProperty","target":"ns=1;i=14868"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14703","parentNodeId":"ns=1;i=12721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14707","parentNodeId":"ns=1;i=12721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14705","parentNodeId":"ns=1;i=12721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14868","parentNodeId":"ns=1;i=12721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12721"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:TotalHeadAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Determined total head at the inlet area of the installation, which corresponds to the sum of geodetic head, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12723","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14721"},{"referenceType":"HasProperty","target":"ns=1;i=14726"},{"referenceType":"HasProperty","target":"ns=1;i=14724"},{"referenceType":"HasProperty","target":"ns=1;i=14871"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14721","parentNodeId":"ns=1;i=12723","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14726","parentNodeId":"ns=1;i=12723","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14724","parentNodeId":"ns=1;i=12723","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14871","parentNodeId":"ns=1;i=12723","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:TotalHeadAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Determined total head at the outlet area of the installation, which corresponds to the sum of geodetic head, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12725","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14733"},{"referenceType":"HasProperty","target":"ns=1;i=14735"},{"referenceType":"HasProperty","target":"ns=1;i=14734"},{"referenceType":"HasProperty","target":"ns=1;i=14874"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14733","parentNodeId":"ns=1;i=12725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14735","parentNodeId":"ns=1;i=12725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14734","parentNodeId":"ns=1;i=12725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14874","parentNodeId":"ns=1;i=12725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:VolumetricEfficiency","dataType":"Double","description":[{"value":"Determined ratio of the actual delivered volume at maximum pressure to the geometric displacement volume"}],"displayName":[{"value":"VolumetricEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12727","parentNodeId":"ns=1;i=1054","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14742"},{"referenceType":"HasProperty","target":"ns=1;i=14744"},{"referenceType":"HasProperty","target":"ns=1;i=14743"},{"referenceType":"HasProperty","target":"ns=1;i=14877"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1054"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14742","parentNodeId":"ns=1;i=12727","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12727"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14744","parentNodeId":"ns=1;i=12727","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12727"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14743","parentNodeId":"ns=1;i=12727","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12727"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind."}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14877","parentNodeId":"ns=1;i=12727","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12727"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MultiPumpType","displayName":[{"value":"MultiPumpType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.34","nodeClass":"ObjectType","nodeId":"ns=1;i=1039","references":[{"referenceType":"HasComponent","target":"ns=1;i=9251"},{"referenceType":"HasComponent","target":"ns=1;i=9252"},{"referenceType":"HasComponent","target":"ns=1;i=9253"},{"referenceType":"HasComponent","target":"ns=1;i=9254"},{"referenceType":"HasComponent","target":"ns=1;i=9255"},{"referenceType":"HasComponent","target":"ns=1;i=9256"},{"referenceType":"HasComponent","target":"ns=1;i=9257"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9258"},{"referenceType":"HasComponent","target":"ns=1;i=9259"},{"referenceType":"HasComponent","target":"ns=1;i=9260"},{"referenceType":"HasComponent","target":"ns=1;i=9261"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:DistributionPriority","dataType":"String","description":[{"value":"This property describes in ascending order the priority of pumps in addition operation mode."}],"displayName":[{"value":"DistributionPriority"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9251","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9263"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9263","parentNodeId":"ns=1;i=9251","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9251"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DistributionType","dataType":"DistributionTypeEnum","description":[{"value":"This property describes the share of operation time of different pumps of the pump system in addition operation mode."}],"displayName":[{"value":"DistributionType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9252","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9264"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9264","parentNodeId":"ns=1;i=9252","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9252"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeMode","dataType":"ExchangeModeEnum","description":[{"value":"This property specifies the exchange mode of the pump"}],"displayName":[{"value":"ExchangeMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9253","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9265"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9265","parentNodeId":"ns=1;i=9253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeTime","dataType":"DateTime","description":[{"value":"This property specifies the determination of the absolute time for the next exchange of the pump, if operator specific Pump Exchange Mode is activated."}],"displayName":[{"value":"ExchangeTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9254","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9266"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9266","parentNodeId":"ns=1;i=9254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9254"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeTimeDifference","dataType":"Double","description":[{"value":"This property specifies the determination of the time for the next exchange of the pump relative to ExchangeTime, if operator specific Pump Exchange Mode is activated."}],"displayName":[{"value":"ExchangeTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9255","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=9267"},{"referenceType":"HasProperty","target":"ns=1;i=9262"},{"referenceType":"HasProperty","target":"ns=1;i=9268"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9267","parentNodeId":"ns=1;i=9255","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9255"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9262","parentNodeId":"ns=1;i=9255","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9255"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9268","parentNodeId":"ns=1;i=9255","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9255"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumNumberOfPumpsInOperation","dataType":"UInt32","description":[{"value":"This property specifies the maximum number of pumps in operation. The difference between NumberOfPumps and MaximumNumberOfPumpsInOperation identifies the redundant pumps."}],"displayName":[{"value":"MaximumNumberOfPumpsInOperation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9256","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9269"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9269","parentNodeId":"ns=1;i=9256","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9256"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MultiPumpOperationMode","dataType":"MultiPumpOperationModeEnum","description":[{"value":"This property specifies the actual multi pump operation mode. In redundant operation mode a pump fulfils the process function of another pump. Addition operation mode characterizes the supplementary fulfilling of the process function. The mixed mode characterizes both operation tasks."}],"displayName":[{"value":"MultiPumpOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9257","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9270"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9270","parentNodeId":"ns=1;i=9257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NumberOfPumps","dataType":"UInt32","description":[{"value":"This property identifies the number of pumps in multi pump management"}],"displayName":[{"value":"NumberOfPumps"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9258","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9271"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9271","parentNodeId":"ns=1;i=9258","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9258"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:PumpCollectiveIDs","dataType":"String","description":[{"value":"This element identifies the pumps within the pump system"}],"displayName":[{"value":"PumpCollectiveIDs"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9259","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9272"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9272","parentNodeId":"ns=1;i=9259","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9259"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpRole","dataType":"PumpRoleEnum","description":[{"value":"This property identifies the role rsp. task of the pump within the multi pump management."}],"displayName":[{"value":"PumpRole"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9260","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9273"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9273","parentNodeId":"ns=1;i=9260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9260"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:RedundantPumpIDs","dataType":"String","description":[{"value":"This property identifies the actual redundant pumps within the pump system"}],"displayName":[{"value":"RedundantPumpIDs"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9261","parentNodeId":"ns=1;i=1039","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9274"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1039"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9274","parentNodeId":"ns=1;i=9261","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9261"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperationalGroupType","displayName":[{"value":"OperationalGroupType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.23","nodeClass":"ObjectType","nodeId":"ns=1;i=1053","references":[{"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasComponent","target":"ns=1;i=5197"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=5194"}],"superType":"ns=3;i=1005"},{"browseName":"1:BypassActuation","description":[{"value":"Actuation parameters for a bypass valve of a pump."}],"displayName":[{"value":"BypassActuation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5193","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1025"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"},{"referenceType":"HasComponent","target":"ns=1;i=11250"},{"referenceType":"HasComponent","target":"ns=1;i=11253"},{"referenceType":"HasComponent","target":"ns=1;i=11254"},{"referenceType":"HasComponent","target":"ns=1;i=11256"},{"referenceType":"HasComponent","target":"ns=1;i=11257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11260"},{"referenceType":"HasComponent","target":"ns=1;i=11262"}],"typeDefinition":"ns=1;i=1025"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11250","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasProperty","target":"ns=1;i=11619"},{"referenceType":"HasProperty","target":"ns=1;i=11251"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11252"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11619","parentNodeId":"ns=1;i=11250","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11250"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11251","parentNodeId":"ns=1;i=11250","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11250"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11252","parentNodeId":"ns=1;i=11250","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11250"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11253","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11620"},{"referenceType":"HasProperty","target":"ns=1;i=11621"},{"referenceType":"HasProperty","target":"ns=1;i=11622"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11620","parentNodeId":"ns=1;i=11253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11621","parentNodeId":"ns=1;i=11253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11622","parentNodeId":"ns=1;i=11253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11254","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11623"},{"referenceType":"HasProperty","target":"ns=1;i=11255"},{"referenceType":"HasProperty","target":"ns=1;i=11624"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11623","parentNodeId":"ns=1;i=11254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11254"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11255","parentNodeId":"ns=1;i=11254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11254"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11624","parentNodeId":"ns=1;i=11254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11254"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11256","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11627"},{"referenceType":"HasProperty","target":"ns=1;i=11628"},{"referenceType":"HasProperty","target":"ns=1;i=11629"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11627","parentNodeId":"ns=1;i=11256","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11256"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11628","parentNodeId":"ns=1;i=11256","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11256"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11629","parentNodeId":"ns=1;i=11256","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11256"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11257","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasProperty","target":"ns=1;i=11617"},{"referenceType":"HasProperty","target":"ns=1;i=11258"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11259"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11617","parentNodeId":"ns=1;i=11257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11258","parentNodeId":"ns=1;i=11257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11257"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11259","parentNodeId":"ns=1;i=11257","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11257"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11260","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11625"},{"referenceType":"HasProperty","target":"ns=1;i=11261"},{"referenceType":"HasProperty","target":"ns=1;i=11626"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11625","parentNodeId":"ns=1;i=11260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11260"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11261","parentNodeId":"ns=1;i=11260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11260"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11626","parentNodeId":"ns=1;i=11260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11260"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11262","parentNodeId":"ns=1;i=5193","references":[{"referenceType":"HasProperty","target":"ns=1;i=11618"},{"referenceType":"HasProperty","target":"ns=1;i=11263"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5193"},{"referenceType":"HasProperty","target":"ns=1;i=11264"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11618","parentNodeId":"ns=1;i=11262","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11262"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11263","parentNodeId":"ns=1;i=11262","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11262"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11264","parentNodeId":"ns=1;i=11262","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11262"}],"typeDefinition":"i=68"},{"browseName":"1:Control","description":[{"value":"Control parameters for a pump."}],"displayName":[{"value":"Control"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5191","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasComponent","target":"ns=1;i=10968"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"},{"referenceType":"HasComponent","target":"ns=1;i=10969"},{"referenceType":"HasComponent","target":"ns=1;i=10970"},{"referenceType":"HasComponent","target":"ns=1;i=10971"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1021"},{"referenceType":"HasComponent","target":"ns=1;i=11001"},{"referenceType":"HasComponent","target":"ns=1;i=11002"},{"referenceType":"HasComponent","target":"ns=1;i=11003"},{"referenceType":"HasComponent","target":"ns=1;i=11004"},{"referenceType":"HasComponent","target":"ns=1;i=11005"},{"referenceType":"HasComponent","target":"ns=1;i=11006"},{"referenceType":"HasComponent","target":"ns=1;i=11007"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11008"},{"referenceType":"HasComponent","target":"ns=1;i=11009"}],"typeDefinition":"ns=1;i=1021"},{"accessLevel":3,"browseName":"1:CommandVariable","dataType":"Double","description":[{"value":"Variable quantity, which is not influenced by the control but is introduced into the control system from outside with the aim of making the final controlled variable follow it in a given relationship"}],"displayName":[{"value":"CommandVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10968","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasProperty","target":"ns=1;i=13779"},{"referenceType":"HasProperty","target":"ns=1;i=13780"},{"referenceType":"HasProperty","target":"ns=1;i=13781"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13779","parentNodeId":"ns=1;i=10968","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10968"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13780","parentNodeId":"ns=1;i=10968","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10968"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13781","parentNodeId":"ns=1;i=10968","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10968"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlDifferenceVariable","dataType":"Double","description":[{"value":"Difference between the reference variable and the feedback variable"}],"displayName":[{"value":"ControlDifferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10969","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasProperty","target":"ns=1;i=13804"},{"referenceType":"HasProperty","target":"ns=1;i=13805"},{"referenceType":"HasProperty","target":"ns=1;i=13806"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13804","parentNodeId":"ns=1;i=10969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13805","parentNodeId":"ns=1;i=10969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13806","parentNodeId":"ns=1;i=10969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlledVariable","dataType":"Double","description":[{"value":"Output variable of the controlled system that will be acted upon by one or more manipulated variables"}],"displayName":[{"value":"ControlledVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10970","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasProperty","target":"ns=1;i=13807"},{"referenceType":"HasProperty","target":"ns=1;i=13808"},{"referenceType":"HasProperty","target":"ns=1;i=13809"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13807","parentNodeId":"ns=1;i=10970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13808","parentNodeId":"ns=1;i=10970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13809","parentNodeId":"ns=1;i=10970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControllerOutputVariable","dataType":"Double","description":[{"value":"Output variable of the controlling element, which is deducted from the control difference variable and is also the input variable of the actuator"}],"displayName":[{"value":"ControllerOutputVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10971","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasProperty","target":"ns=1;i=13810"},{"referenceType":"HasProperty","target":"ns=1;i=13811"},{"referenceType":"HasProperty","target":"ns=1;i=13812"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13810","parentNodeId":"ns=1;i=10971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13811","parentNodeId":"ns=1;i=10971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13812","parentNodeId":"ns=1;i=10971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DeadTime","dataType":"Double","description":[{"value":"In a dead-time element the duration of the time interval by which the output variable is shifted relative to the input variable"}],"displayName":[{"value":"DeadTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11001","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasProperty","target":"ns=1;i=13782"},{"referenceType":"HasProperty","target":"ns=1;i=13783"},{"referenceType":"HasProperty","target":"ns=1;i=13784"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13782","parentNodeId":"ns=1;i=11001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13783","parentNodeId":"ns=1;i=11001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13784","parentNodeId":"ns=1;i=11001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DerivativeActionCoefficient","dataType":"Double","description":[{"value":"For a derivative element, the quotient of the value of the output variable to the value of the time derivative of the input variable"}],"displayName":[{"value":"DerivativeActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11002","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13785"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasProperty","target":"ns=1;i=13786"},{"referenceType":"HasProperty","target":"ns=1;i=13787"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13785","parentNodeId":"ns=1;i=11002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11002"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13786","parentNodeId":"ns=1;i=11002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11002"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13787","parentNodeId":"ns=1;i=11002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11002"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11003","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13813"},{"referenceType":"HasProperty","target":"ns=1;i=13814"},{"referenceType":"HasProperty","target":"ns=1;i=13815"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13813","parentNodeId":"ns=1;i=11003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13814","parentNodeId":"ns=1;i=11003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13815","parentNodeId":"ns=1;i=11003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FinalControlledVariable","dataType":"Double","description":[{"value":"Variable quantity which has, or combination of variable quantities which have, to be influenced by the control"}],"displayName":[{"value":"FinalControlledVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11004","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13788"},{"referenceType":"HasProperty","target":"ns=1;i=13789"},{"referenceType":"HasProperty","target":"ns=1;i=13790"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13788","parentNodeId":"ns=1;i=11004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13789","parentNodeId":"ns=1;i=11004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13790","parentNodeId":"ns=1;i=11004","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11004"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IntegralActionCoefficient","dataType":"Double","description":[{"value":"For an integral element, the quotient of the time derivative of the output variable to the fixed value of the input variable"}],"displayName":[{"value":"IntegralActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11005","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13791"},{"referenceType":"HasProperty","target":"ns=1;i=13792"},{"referenceType":"HasProperty","target":"ns=1;i=13793"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13791","parentNodeId":"ns=1;i=11005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13792","parentNodeId":"ns=1;i=11005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13793","parentNodeId":"ns=1;i=11005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedVariable","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11006","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13794"},{"referenceType":"HasProperty","target":"ns=1;i=13795"},{"referenceType":"HasProperty","target":"ns=1;i=13796"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13794","parentNodeId":"ns=1;i=11006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13795","parentNodeId":"ns=1;i=11006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13796","parentNodeId":"ns=1;i=11006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OperatingMode","dataType":"String","description":[{"value":"Characterization of the way and the extent to which the human operator intervenes in the control equipment"}],"displayName":[{"value":"OperatingMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11007","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13803"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13803","parentNodeId":"ns=1;i=11007","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11007"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ProportionalActionCoefficient","dataType":"Double","description":[{"value":"For a proportional element, the quotient of the variation of the output variable to the corresponding variation of the input variable"}],"displayName":[{"value":"ProportionalActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11008","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13797"},{"referenceType":"HasProperty","target":"ns=1;i=13798"},{"referenceType":"HasProperty","target":"ns=1;i=13799"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13797","parentNodeId":"ns=1;i=11008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11008"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13798","parentNodeId":"ns=1;i=11008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11008"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13799","parentNodeId":"ns=1;i=11008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11008"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11009","parentNodeId":"ns=1;i=5191","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13800"},{"referenceType":"HasProperty","target":"ns=1;i=13801"},{"referenceType":"HasProperty","target":"ns=1;i=13802"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5191"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13800","parentNodeId":"ns=1;i=11009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13801","parentNodeId":"ns=1;i=11009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13802","parentNodeId":"ns=1;i=11009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"Measurements at a pump."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5129","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasComponent","target":"ns=1;i=11291"},{"referenceType":"HasComponent","target":"ns=1;i=11329"},{"referenceType":"HasComponent","target":"ns=1;i=11342"},{"referenceType":"HasComponent","target":"ns=1;i=11344"},{"referenceType":"HasComponent","target":"ns=1;i=11346"},{"referenceType":"HasComponent","target":"ns=1;i=12447"},{"referenceType":"HasComponent","target":"ns=1;i=12450"},{"referenceType":"HasComponent","target":"ns=1;i=12453"},{"referenceType":"HasComponent","target":"ns=1;i=12456"},{"referenceType":"HasComponent","target":"ns=1;i=12459"},{"referenceType":"HasComponent","target":"ns=1;i=12462"},{"referenceType":"HasComponent","target":"ns=1;i=12465"},{"referenceType":"HasComponent","target":"ns=1;i=12468"},{"referenceType":"HasComponent","target":"ns=1;i=12926"},{"referenceType":"HasComponent","target":"ns=1;i=14650"},{"referenceType":"HasComponent","target":"ns=1;i=14652"},{"referenceType":"HasComponent","target":"ns=1;i=14654"},{"referenceType":"HasComponent","target":"ns=1;i=14656"},{"referenceType":"HasComponent","target":"ns=1;i=14658"},{"referenceType":"HasComponent","target":"ns=1;i=14660"},{"referenceType":"HasComponent","target":"ns=1;i=14662"},{"referenceType":"HasComponent","target":"ns=1;i=14664"},{"referenceType":"HasComponent","target":"ns=1;i=14666"},{"referenceType":"HasComponent","target":"ns=1;i=14668"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1054"},{"referenceType":"HasComponent","target":"ns=1;i=14670"},{"referenceType":"HasComponent","target":"ns=1;i=14672"},{"referenceType":"HasComponent","target":"ns=1;i=14674"},{"referenceType":"HasComponent","target":"ns=1;i=14676"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14678"},{"referenceType":"HasComponent","target":"ns=1;i=14680"},{"referenceType":"HasComponent","target":"ns=1;i=14682"},{"referenceType":"HasComponent","target":"ns=1;i=14684"},{"referenceType":"HasComponent","target":"ns=1;i=14686"},{"referenceType":"HasComponent","target":"ns=1;i=14688"},{"referenceType":"HasComponent","target":"ns=1;i=14690"},{"referenceType":"HasComponent","target":"ns=1;i=14692"},{"referenceType":"HasComponent","target":"ns=1;i=14694"},{"referenceType":"HasComponent","target":"ns=1;i=14696"},{"referenceType":"HasComponent","target":"ns=1;i=14698"},{"referenceType":"HasComponent","target":"ns=1;i=14700"},{"referenceType":"HasComponent","target":"ns=1;i=14702"},{"referenceType":"HasComponent","target":"ns=1;i=14704"},{"referenceType":"HasComponent","target":"ns=1;i=14706"},{"referenceType":"HasComponent","target":"ns=1;i=14708"},{"referenceType":"HasComponent","target":"ns=1;i=14710"},{"referenceType":"HasComponent","target":"ns=1;i=14712"},{"referenceType":"HasComponent","target":"ns=1;i=14714"},{"referenceType":"HasComponent","target":"ns=1;i=14716"},{"referenceType":"HasComponent","target":"ns=1;i=14718"},{"referenceType":"HasComponent","target":"ns=1;i=14720"}],"typeDefinition":"ns=1;i=1054"},{"browseName":"1:\u003CVibration\u003E","displayName":[{"value":"\u003CVibration\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5130","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasComponent","target":"ns=1;i=14922"},{"referenceType":"HasComponent","target":"ns=1;i=14924"},{"referenceType":"HasComponent","target":"ns=1;i=14926"},{"referenceType":"HasComponent","target":"ns=1;i=14928"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasComponent","target":"ns=1;i=14930"},{"referenceType":"HasComponent","target":"ns=1;i=14932"},{"referenceType":"HasComponent","target":"ns=1;i=14934"},{"referenceType":"HasComponent","target":"ns=1;i=14936"},{"referenceType":"HasComponent","target":"ns=1;i=14938"},{"referenceType":"HasComponent","target":"ns=1;i=14940"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=14942"},{"referenceType":"HasComponent","target":"ns=1;i=14944"},{"referenceType":"HasComponent","target":"ns=1;i=14946"},{"referenceType":"HasComponent","target":"ns=1;i=14950"},{"referenceType":"HasComponent","target":"ns=1;i=14948"},{"referenceType":"HasComponent","target":"ns=1;i=14952"},{"referenceType":"HasComponent","target":"ns=1;i=14954"},{"referenceType":"HasComponent","target":"ns=1;i=14956"},{"referenceType":"HasComponent","target":"ns=1;i=14958"},{"referenceType":"HasComponent","target":"ns=1;i=14960"},{"referenceType":"HasComponent","target":"ns=1;i=14962"},{"referenceType":"HasComponent","target":"ns=1;i=14964"},{"referenceType":"HasComponent","target":"ns=1;i=14965"},{"referenceType":"HasComponent","target":"ns=1;i=14967"},{"referenceType":"HasComponent","target":"ns=1;i=14969"},{"referenceType":"HasComponent","target":"ns=1;i=14971"},{"referenceType":"HasComponent","target":"ns=1;i=14973"},{"referenceType":"HasComponent","target":"ns=1;i=14975"},{"referenceType":"HasComponent","target":"ns=1;i=14977"},{"referenceType":"HasComponent","target":"ns=1;i=14979"},{"referenceType":"HasComponent","target":"ns=1;i=14981"},{"referenceType":"HasComponent","target":"ns=1;i=14983"},{"referenceType":"HasComponent","target":"ns=1;i=14985"},{"referenceType":"HasComponent","target":"ns=1;i=14987"},{"referenceType":"HasComponent","target":"ns=1;i=14989"},{"referenceType":"HasComponent","target":"ns=1;i=14991"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1055"}],"symbolicName":"Vibration","typeDefinition":"ns=1;i=1055"},{"accessLevel":5,"browseName":"1:1XPhase","dataType":"Double","description":[{"value":"Phase of the 1X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"1XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14922","parentNodeId":"ns=1;i=5130","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15064"},{"referenceType":"HasProperty","target":"ns=1;i=15066"},{"referenceType":"HasProperty","target":"ns=1;i=15065"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XPhase","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15064","parentNodeId":"ns=1;i=14922","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15066","parentNodeId":"ns=1;i=14922","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15065","parentNodeId":"ns=1;i=14922","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14924","parentNodeId":"ns=1;i=5130","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15067"},{"referenceType":"HasProperty","target":"ns=1;i=15069"},{"referenceType":"HasProperty","target":"ns=1;i=15068"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XRelativeShaftVibrationP_P","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15067","parentNodeId":"ns=1;i=14924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15069","parentNodeId":"ns=1;i=14924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15068","parentNodeId":"ns=1;i=14924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XPhase","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"2XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14926","parentNodeId":"ns=1;i=5130","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15070"},{"referenceType":"HasProperty","target":"ns=1;i=15072"},{"referenceType":"HasProperty","target":"ns=1;i=15071"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XPhase","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15070","parentNodeId":"ns=1;i=14926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15072","parentNodeId":"ns=1;i=14926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15071","parentNodeId":"ns=1;i=14926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the double rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"2XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14928","parentNodeId":"ns=1;i=5130","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15073"},{"referenceType":"HasProperty","target":"ns=1;i=15075"},{"referenceType":"HasProperty","target":"ns=1;i=15074"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XRelativeShaftVibrationP_P","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15073","parentNodeId":"ns=1;i=14928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15075","parentNodeId":"ns=1;i=14928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15074","parentNodeId":"ns=1;i=14928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndex","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndex"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14930","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasProperty","target":"ns=1;i=15076"},{"referenceType":"HasProperty","target":"ns=1;i=15078"},{"referenceType":"HasProperty","target":"ns=1;i=15077"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15076","parentNodeId":"ns=1;i=14930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15078","parentNodeId":"ns=1;i=14930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15077","parentNodeId":"ns=1;i=14930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndexPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndexPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14932","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasProperty","target":"ns=1;i=15079"},{"referenceType":"HasProperty","target":"ns=1;i=15081"},{"referenceType":"HasProperty","target":"ns=1;i=15080"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15079","parentNodeId":"ns=1;i=14932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15081","parentNodeId":"ns=1;i=14932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15080","parentNodeId":"ns=1;i=14932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration in units of the acceleration of gravity g. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14934","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasProperty","target":"ns=1;i=15082"},{"referenceType":"HasProperty","target":"ns=1;i=15084"},{"referenceType":"HasProperty","target":"ns=1;i=15083"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15082","parentNodeId":"ns=1;i=14934","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14934"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15084","parentNodeId":"ns=1;i=14934","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14934"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15083","parentNodeId":"ns=1;i=14934","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14934"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14936","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasProperty","target":"ns=1;i=15085"},{"referenceType":"HasProperty","target":"ns=1;i=15087"},{"referenceType":"HasProperty","target":"ns=1;i=15086"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15085","parentNodeId":"ns=1;i=14936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15087","parentNodeId":"ns=1;i=14936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15086","parentNodeId":"ns=1;i=14936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapVoltage","dataType":"Double","description":[{"value":"Sum value of the oscillation ranges of the vibration at all frequencies except the rotation frequency of the shaft under consideration, expressed as displacement. Regularly, only the frequency range below the rotational frequency is considered."}],"displayName":[{"value":"GapVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14938","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15088"},{"referenceType":"HasProperty","target":"ns=1;i=15090"},{"referenceType":"HasProperty","target":"ns=1;i=15089"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15088","parentNodeId":"ns=1;i=14938","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14938"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15090","parentNodeId":"ns=1;i=14938","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14938"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15089","parentNodeId":"ns=1;i=14938","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14938"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Not1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"Not1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14940","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15091"},{"referenceType":"HasProperty","target":"ns=1;i=15093"},{"referenceType":"HasProperty","target":"ns=1;i=15092"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15091","parentNodeId":"ns=1;i=14940","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14940"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15093","parentNodeId":"ns=1;i=14940","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14940"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15092","parentNodeId":"ns=1;i=14940","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14940"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAcceleration0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAcceleration0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14942","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15094"},{"referenceType":"HasProperty","target":"ns=1;i=15096"},{"referenceType":"HasProperty","target":"ns=1;i=15095"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15094","parentNodeId":"ns=1;i=14942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14942"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15096","parentNodeId":"ns=1;i=14942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14942"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15095","parentNodeId":"ns=1;i=14942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14942"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14944","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15097"},{"referenceType":"HasProperty","target":"ns=1;i=15399"},{"referenceType":"HasProperty","target":"ns=1;i=15098"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15097","parentNodeId":"ns=1;i=14944","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14944"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15399","parentNodeId":"ns=1;i=14944","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14944"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15098","parentNodeId":"ns=1;i=14944","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14944"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerG0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14946","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15400"},{"referenceType":"HasProperty","target":"ns=1;i=15402"},{"referenceType":"HasProperty","target":"ns=1;i=15401"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15400","parentNodeId":"ns=1;i=14946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15402","parentNodeId":"ns=1;i=14946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15401","parentNodeId":"ns=1;i=14946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration in units of the acceleration of gravity g"}],"displayName":[{"value":"OverallVibrationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14950","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15406"},{"referenceType":"HasProperty","target":"ns=1;i=15408"},{"referenceType":"HasProperty","target":"ns=1;i=15407"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15406","parentNodeId":"ns=1;i=14950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15408","parentNodeId":"ns=1;i=14950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15407","parentNodeId":"ns=1;i=14950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerGP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerGP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14948","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15403"},{"referenceType":"HasProperty","target":"ns=1;i=15405"},{"referenceType":"HasProperty","target":"ns=1;i=15404"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15403","parentNodeId":"ns=1;i=14948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15405","parentNodeId":"ns=1;i=14948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15404","parentNodeId":"ns=1;i=14948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration"}],"displayName":[{"value":"OverallVibrationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14952","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15409"},{"referenceType":"HasProperty","target":"ns=1;i=15411"},{"referenceType":"HasProperty","target":"ns=1;i=15410"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15409","parentNodeId":"ns=1;i=14952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15411","parentNodeId":"ns=1;i=14952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15410","parentNodeId":"ns=1;i=14952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14954","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15412"},{"referenceType":"HasProperty","target":"ns=1;i=15414"},{"referenceType":"HasProperty","target":"ns=1;i=15413"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15412","parentNodeId":"ns=1;i=14954","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14954"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15414","parentNodeId":"ns=1;i=14954","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14954"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15413","parentNodeId":"ns=1;i=14954","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14954"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementRMS","dataType":"Double","description":[{"value":"Root mean square of oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14956","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15415"},{"referenceType":"HasProperty","target":"ns=1;i=15417"},{"referenceType":"HasProperty","target":"ns=1;i=15416"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15415","parentNodeId":"ns=1;i=14956","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14956"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15417","parentNodeId":"ns=1;i=14956","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14956"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15416","parentNodeId":"ns=1;i=14956","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14956"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocity0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocity0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14958","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15418"},{"referenceType":"HasProperty","target":"ns=1;i=15420"},{"referenceType":"HasProperty","target":"ns=1;i=15419"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15418","parentNodeId":"ns=1;i=14958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15420","parentNodeId":"ns=1;i=14958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15419","parentNodeId":"ns=1;i=14958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocityP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14960","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15421"},{"referenceType":"HasProperty","target":"ns=1;i=15423"},{"referenceType":"HasProperty","target":"ns=1;i=15422"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15421","parentNodeId":"ns=1;i=14960","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14960"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15423","parentNodeId":"ns=1;i=14960","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14960"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15422","parentNodeId":"ns=1;i=14960","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14960"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement expressed as velocity"}],"displayName":[{"value":"OverallVibrationVelocityRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14962","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15424"},{"referenceType":"HasProperty","target":"ns=1;i=15426"},{"referenceType":"HasProperty","target":"ns=1;i=15425"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15424","parentNodeId":"ns=1;i=14962","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14962"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15426","parentNodeId":"ns=1;i=14962","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14962"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15425","parentNodeId":"ns=1;i=14962","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14962"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ReferenceStandardForVibrationMeasurement","dataType":"String","description":[{"value":"Standard to which statements on vibration measurement refer."}],"displayName":[{"value":"ReferenceStandardForVibrationMeasurement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14964","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=15427"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15427","parentNodeId":"ns=1;i=14964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14964"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase1X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the rotation frequency (1X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14965","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15428"},{"referenceType":"HasProperty","target":"ns=1;i=15430"},{"referenceType":"HasProperty","target":"ns=1;i=15429"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15428","parentNodeId":"ns=1;i=14965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15430","parentNodeId":"ns=1;i=14965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15429","parentNodeId":"ns=1;i=14965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase2X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the first harmonic of the rotation frequency (2X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14967","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15431"},{"referenceType":"HasProperty","target":"ns=1;i=15433"},{"referenceType":"HasProperty","target":"ns=1;i=15432"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15431","parentNodeId":"ns=1;i=14967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15433","parentNodeId":"ns=1;i=14967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15432","parentNodeId":"ns=1;i=14967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SpeedOfRotation","dataType":"Double","description":[{"value":"Number of revolutions per time."}],"displayName":[{"value":"SpeedOfRotation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14969","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15434"},{"referenceType":"HasProperty","target":"ns=1;i=15436"},{"referenceType":"HasProperty","target":"ns=1;i=15435"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15434","parentNodeId":"ns=1;i=14969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15436","parentNodeId":"ns=1;i=14969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15435","parentNodeId":"ns=1;i=14969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ThrustPosition","dataType":"Double","description":[{"value":"Measure for the distance between the sensor and the shaft, expressed as device output voltage"}],"displayName":[{"value":"ThrustPosition"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14971","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15437"},{"referenceType":"HasProperty","target":"ns=1;i=15439"},{"referenceType":"HasProperty","target":"ns=1;i=15438"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15437","parentNodeId":"ns=1;i=14971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15439","parentNodeId":"ns=1;i=14971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5066068\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15438","parentNodeId":"ns=1;i=14971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequencies","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequencies"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14973","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15440"},{"referenceType":"HasProperty","target":"ns=1;i=15442"},{"referenceType":"HasProperty","target":"ns=1;i=15441"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15440","parentNodeId":"ns=1;i=14973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15442","parentNodeId":"ns=1;i=14973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15441","parentNodeId":"ns=1;i=14973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequenciesPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequenciesPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14975","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15443"},{"referenceType":"HasProperty","target":"ns=1;i=15445"},{"referenceType":"HasProperty","target":"ns=1;i=15444"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15443","parentNodeId":"ns=1;i=14975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15445","parentNodeId":"ns=1;i=14975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15444","parentNodeId":"ns=1;i=14975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBladePassFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft multiplied with the number of blades mounted at the shaft, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheBladePassFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14977","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15446"},{"referenceType":"HasProperty","target":"ns=1;i=15448"},{"referenceType":"HasProperty","target":"ns=1;i=15447"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15446","parentNodeId":"ns=1;i=14977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15448","parentNodeId":"ns=1;i=14977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15447","parentNodeId":"ns=1;i=14977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X","dataType":"Double","description":[{"value":"Oscillation amplitude at the double rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14979","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15449"},{"referenceType":"HasProperty","target":"ns=1;i=15451"},{"referenceType":"HasProperty","target":"ns=1;i=15450"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15449","parentNodeId":"ns=1;i=14979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15451","parentNodeId":"ns=1;i=14979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15450","parentNodeId":"ns=1;i=14979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14981","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15452"},{"referenceType":"HasProperty","target":"ns=1;i=15454"},{"referenceType":"HasProperty","target":"ns=1;i=15453"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15452","parentNodeId":"ns=1;i=14981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15454","parentNodeId":"ns=1;i=14981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15453","parentNodeId":"ns=1;i=14981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14983","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15455"},{"referenceType":"HasProperty","target":"ns=1;i=15457"},{"referenceType":"HasProperty","target":"ns=1;i=15456"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15455","parentNodeId":"ns=1;i=14983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15457","parentNodeId":"ns=1;i=14983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15456","parentNodeId":"ns=1;i=14983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the harmonics of the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14985","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15458"},{"referenceType":"HasProperty","target":"ns=1;i=15460"},{"referenceType":"HasProperty","target":"ns=1;i=15459"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15458","parentNodeId":"ns=1;i=14985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15460","parentNodeId":"ns=1;i=14985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15459","parentNodeId":"ns=1;i=14985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheRotationFrequency1X","dataType":"Double","description":[{"value":"Oscillation amplitude at the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheRotationFrequency1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14987","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15461"},{"referenceType":"HasProperty","target":"ns=1;i=15463"},{"referenceType":"HasProperty","target":"ns=1;i=15462"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15461","parentNodeId":"ns=1;i=14987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15463","parentNodeId":"ns=1;i=14987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15462","parentNodeId":"ns=1;i=14987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14989","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15464"},{"referenceType":"HasProperty","target":"ns=1;i=15466"},{"referenceType":"HasProperty","target":"ns=1;i=15465"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15464","parentNodeId":"ns=1;i=14989","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14989"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15466","parentNodeId":"ns=1;i=14989","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14989"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15465","parentNodeId":"ns=1;i=14989","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14989"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14991","parentNodeId":"ns=1;i=5130","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15467"},{"referenceType":"HasProperty","target":"ns=1;i=15469"},{"referenceType":"HasProperty","target":"ns=1;i=15468"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5130"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15467","parentNodeId":"ns=1;i=14991","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15469","parentNodeId":"ns=1;i=14991","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15468","parentNodeId":"ns=1;i=14991","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:AmbientHumidity","dataType":"Double","description":[{"value":"Measured ambient humidity"}],"displayName":[{"value":"AmbientHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11291","parentNodeId":"ns=1;i=5129","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11340"},{"referenceType":"HasProperty","target":"ns=1;i=11341"},{"referenceType":"HasProperty","target":"ns=1;i=14725"},{"referenceType":"HasProperty","target":"ns=1;i=6030"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11340","parentNodeId":"ns=1;i=11291","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11291"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11341","parentNodeId":"ns=1;i=11291","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11291"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14725","parentNodeId":"ns=1;i=11291","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11291"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of partial pressure of water vapor and partial pressure at its saturation"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6030","parentNodeId":"ns=1;i=11291","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11291"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erelative humidity\u003C/uax:String\u003E"},{"browseName":"1:AmbientTemperature","dataType":"Double","description":[{"value":"Measured ambient temperature"}],"displayName":[{"value":"AmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11329","parentNodeId":"ns=1;i=5129","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9436"},{"referenceType":"HasProperty","target":"ns=1;i=9444"},{"referenceType":"HasProperty","target":"ns=1;i=9446"},{"referenceType":"HasProperty","target":"ns=1;i=9456"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9436","parentNodeId":"ns=1;i=11329","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11329"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9444","parentNodeId":"ns=1;i=11329","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11329"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9446","parentNodeId":"ns=1;i=11329","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11329"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9456","parentNodeId":"ns=1;i=11329","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11329"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:AxialLoadOfPumpRotor","dataType":"Double","description":[{"value":"Measured residual thrust acting through the shaft derived from hydraulic or mechanical forces"}],"displayName":[{"value":"AxialLoadOfPumpRotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11342","parentNodeId":"ns=1;i=5129","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9555"},{"referenceType":"HasProperty","target":"ns=1;i=9557"},{"referenceType":"HasProperty","target":"ns=1;i=9559"},{"referenceType":"HasProperty","target":"ns=1;i=9573"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9555","parentNodeId":"ns=1;i=11342","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11342"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9557","parentNodeId":"ns=1;i=11342","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11342"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9559","parentNodeId":"ns=1;i=11342","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11342"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity describing interaction between bodies or particles"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9573","parentNodeId":"ns=1;i=11342","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11342"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eforce\u003C/uax:String\u003E"},{"browseName":"1:AxialRotorPosition","dataType":"Double","description":[{"value":"Measured position of the axial rotor in bearing."}],"displayName":[{"value":"AxialRotorPosition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11344","parentNodeId":"ns=1;i=5129","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9734"},{"referenceType":"HasProperty","target":"ns=1;i=9736"},{"referenceType":"HasProperty","target":"ns=1;i=10973"},{"referenceType":"HasProperty","target":"ns=1;i=10987"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9734","parentNodeId":"ns=1;i=11344","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11344"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9736","parentNodeId":"ns=1;i=11344","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11344"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10973","parentNodeId":"ns=1;i=11344","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11344"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10987","parentNodeId":"ns=1;i=11344","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11344"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:BackPressure","dataType":"Double","description":[{"value":"Measured back pressure of the pump"}],"displayName":[{"value":"BackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11346","parentNodeId":"ns=1;i=5129","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11058"},{"referenceType":"HasProperty","target":"ns=1;i=11060"},{"referenceType":"HasProperty","target":"ns=1;i=11100"},{"referenceType":"HasProperty","target":"ns=1;i=11282"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11058","parentNodeId":"ns=1;i=11346","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11346"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11060","parentNodeId":"ns=1;i=11346","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11346"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11100","parentNodeId":"ns=1;i=11346","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11346"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11282","parentNodeId":"ns=1;i=11346","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11346"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:BearingTemperature","dataType":"Double","description":[{"value":"Measured temperature of the bearing"}],"displayName":[{"value":"BearingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12447","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=11343"},{"referenceType":"HasProperty","target":"ns=1;i=11345"},{"referenceType":"HasProperty","target":"ns=1;i=11347"},{"referenceType":"HasProperty","target":"ns=1;i=11910"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11343","parentNodeId":"ns=1;i=12447","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12447"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11345","parentNodeId":"ns=1;i=12447","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12447"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11347","parentNodeId":"ns=1;i=12447","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12447"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11910","parentNodeId":"ns=1;i=12447","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12447"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:ClearanceFlow","dataType":"Double","description":[{"value":"Measured clearance flow between the housing and the impeller"}],"displayName":[{"value":"ClearanceFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12450","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=11940"},{"referenceType":"HasProperty","target":"ns=1;i=11945"},{"referenceType":"HasProperty","target":"ns=1;i=12005"},{"referenceType":"HasProperty","target":"ns=1;i=9462"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11940","parentNodeId":"ns=1;i=12450","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12450"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11945","parentNodeId":"ns=1;i=12450","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12450"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12005","parentNodeId":"ns=1;i=12450","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12450"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9462","parentNodeId":"ns=1;i=12450","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12450"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:CoolantTemperature","dataType":"Double","description":[{"value":"Measured temperature of the coolant."}],"displayName":[{"value":"CoolantTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12453","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=10975"},{"referenceType":"HasProperty","target":"ns=1;i=10983"},{"referenceType":"HasProperty","target":"ns=1;i=10997"},{"referenceType":"HasProperty","target":"ns=1;i=14752"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10975","parentNodeId":"ns=1;i=12453","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12453"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10983","parentNodeId":"ns=1;i=12453","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12453"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10997","parentNodeId":"ns=1;i=12453","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12453"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14752","parentNodeId":"ns=1;i=12453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:Density","dataType":"Double","description":[{"value":"Measured density of the fluid"}],"displayName":[{"value":"Density"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12456","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12010"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=12452"},{"referenceType":"HasProperty","target":"ns=1;i=12455"},{"referenceType":"HasProperty","target":"ns=1;i=14755"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12010","parentNodeId":"ns=1;i=12456","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12456"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12452","parentNodeId":"ns=1;i=12456","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12456"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4934993\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/m\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per cubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12455","parentNodeId":"ns=1;i=12456","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12456"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing the spatial distribution of mass of a continuous material"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14755","parentNodeId":"ns=1;i=12456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12456"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Edensity\u003C/uax:String\u003E"},{"browseName":"1:DifferentialPressure","dataType":"Double","description":[{"value":"Determined (actual) gain in total pressure between the pump inlet and pump outlet"}],"displayName":[{"value":"DifferentialPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12459","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12642"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=12644"},{"referenceType":"HasProperty","target":"ns=1;i=12646"},{"referenceType":"HasProperty","target":"ns=1;i=14758"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12642","parentNodeId":"ns=1;i=12459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12644","parentNodeId":"ns=1;i=12459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12646","parentNodeId":"ns=1;i=12459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14758","parentNodeId":"ns=1;i=12459","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12459"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:DynamicViscosity","dataType":"Double","description":[{"value":"Measured kinematic viscosity of the fluid"}],"displayName":[{"value":"DynamicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12462","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12660"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=12662"},{"referenceType":"HasProperty","target":"ns=1;i=12664"},{"referenceType":"HasProperty","target":"ns=1;i=14761"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12660","parentNodeId":"ns=1;i=12462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12662","parentNodeId":"ns=1;i=12462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12664","parentNodeId":"ns=1;i=12462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"For laminar flows, proportionality constant between shear stress in a fluid moving with a velocity and gradient perpendicular to the plane of shear"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14761","parentNodeId":"ns=1;i=12462","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12462"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Edynamic viscosity\u003C/uax:String\u003E"},{"browseName":"1:ElectronicTemperature","dataType":"Double","description":[{"value":"Measured temperature of the electronic"}],"displayName":[{"value":"ElectronicTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12465","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12678"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=12680"},{"referenceType":"HasProperty","target":"ns=1;i=12682"},{"referenceType":"HasProperty","target":"ns=1;i=14764"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12678","parentNodeId":"ns=1;i=12465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12680","parentNodeId":"ns=1;i=12465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12682","parentNodeId":"ns=1;i=12465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14764","parentNodeId":"ns=1;i=12465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:FluidTemperature","dataType":"Double","description":[{"value":"Measured internal temperature of pump fluid."}],"displayName":[{"value":"FluidTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12468","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12696"},{"referenceType":"HasProperty","target":"ns=1;i=12698"},{"referenceType":"HasProperty","target":"ns=1;i=12700"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=14767"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12696","parentNodeId":"ns=1;i=12468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12698","parentNodeId":"ns=1;i=12468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12700","parentNodeId":"ns=1;i=12468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14767","parentNodeId":"ns=1;i=12468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12468"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:HousingTemperature","dataType":"Double","description":[{"value":"Measured temperature of the housing"}],"displayName":[{"value":"HousingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12926","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12714"},{"referenceType":"HasProperty","target":"ns=1;i=12716"},{"referenceType":"HasProperty","target":"ns=1;i=12718"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=14770"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12714","parentNodeId":"ns=1;i=12926","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12926"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12716","parentNodeId":"ns=1;i=12926","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12926"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12718","parentNodeId":"ns=1;i=12926","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12926"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14770","parentNodeId":"ns=1;i=12926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:HydraulicEfficiency","dataType":"Double","description":[{"value":"Determined proportion of pump available power input, Pa, which is delivered as pump power output, Pu, after satisfying the losses resulting from friction due to the relative motion of internal surfaces and internal leakage"}],"displayName":[{"value":"HydraulicEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14650","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12730"},{"referenceType":"HasProperty","target":"ns=1;i=12731"},{"referenceType":"HasProperty","target":"ns=1;i=12732"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=14773"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12730","parentNodeId":"ns=1;i=14650","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14650"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12731","parentNodeId":"ns=1;i=14650","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14650"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12732","parentNodeId":"ns=1;i=14650","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14650"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14773","parentNodeId":"ns=1;i=14650","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14650"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:InletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Measured pressure at the inlet area of the installation."}],"displayName":[{"value":"InletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14652","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12739"},{"referenceType":"HasProperty","target":"ns=1;i=12740"},{"referenceType":"HasProperty","target":"ns=1;i=12741"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=14776"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12739","parentNodeId":"ns=1;i=14652","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14652"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12740","parentNodeId":"ns=1;i=14652","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14652"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12741","parentNodeId":"ns=1;i=14652","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14652"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14776","parentNodeId":"ns=1;i=14652","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14652"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:InstallationTotalHead","dataType":"Double","description":[{"value":"Determined difference between the total head at the outlet side of the installation and the total head at the inlet side of the installation"}],"displayName":[{"value":"InstallationTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14654","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12748"},{"referenceType":"HasProperty","target":"ns=1;i=12749"},{"referenceType":"HasProperty","target":"ns=1;i=12750"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasProperty","target":"ns=1;i=14779"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12748","parentNodeId":"ns=1;i=14654","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14654"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12749","parentNodeId":"ns=1;i=14654","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14654"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12750","parentNodeId":"ns=1;i=14654","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14654"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14779","parentNodeId":"ns=1;i=14654","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14654"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:KinematicViscosity","dataType":"Double","description":[{"value":"Measured dynamic viscosity of the fluid"}],"displayName":[{"value":"KinematicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14656","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12757"},{"referenceType":"HasProperty","target":"ns=1;i=12758"},{"referenceType":"HasProperty","target":"ns=1;i=12759"},{"referenceType":"HasProperty","target":"ns=1;i=14782"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12757","parentNodeId":"ns=1;i=14656","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14656"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12758","parentNodeId":"ns=1;i=14656","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14656"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E21300\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12759","parentNodeId":"ns=1;i=14656","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14656"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of dynamic viscosity and mass density of a fluid"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14782","parentNodeId":"ns=1;i=14656","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14656"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ekinematic viscosity\u003C/uax:String\u003E"},{"browseName":"1:LeakageRateOfFlow","dataType":"Double","description":[{"value":"Measured rate of flow leaking from shaft seals"}],"displayName":[{"value":"LeakageRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14658","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12766"},{"referenceType":"HasProperty","target":"ns=1;i=12767"},{"referenceType":"HasProperty","target":"ns=1;i=12768"},{"referenceType":"HasProperty","target":"ns=1;i=14785"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12766","parentNodeId":"ns=1;i=14658","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14658"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12767","parentNodeId":"ns=1;i=14658","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14658"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12768","parentNodeId":"ns=1;i=14658","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14658"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14785","parentNodeId":"ns=1;i=14658","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14658"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:Level","dataType":"Double","description":[{"value":"Measured level"}],"displayName":[{"value":"Level"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14660","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12775"},{"referenceType":"HasProperty","target":"ns=1;i=12776"},{"referenceType":"HasProperty","target":"ns=1;i=12777"},{"referenceType":"HasProperty","target":"ns=1;i=14788"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12775","parentNodeId":"ns=1;i=14660","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14660"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12776","parentNodeId":"ns=1;i=14660","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14660"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12777","parentNodeId":"ns=1;i=14660","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14660"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14788","parentNodeId":"ns=1;i=14660","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14660"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:LubricatingOilConsumption","dataType":"Double","description":[{"value":"Measured oil consumption of the lubricating system"}],"displayName":[{"value":"LubricatingOilConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14662","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12784"},{"referenceType":"HasProperty","target":"ns=1;i=12785"},{"referenceType":"HasProperty","target":"ns=1;i=12786"},{"referenceType":"HasProperty","target":"ns=1;i=14791"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12784","parentNodeId":"ns=1;i=14662","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14662"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12785","parentNodeId":"ns=1;i=14662","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14662"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12786","parentNodeId":"ns=1;i=14662","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14662"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Extent of a three dimensional geometrical shape"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14791","parentNodeId":"ns=1;i=14662","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14662"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume\u003C/uax:String\u003E"},{"browseName":"1:LubricatingOilPressure","dataType":"Double","description":[{"value":"Measured oil pressure of the lubrication system"}],"displayName":[{"value":"LubricatingOilPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14664","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12793"},{"referenceType":"HasProperty","target":"ns=1;i=12794"},{"referenceType":"HasProperty","target":"ns=1;i=12795"},{"referenceType":"HasProperty","target":"ns=1;i=14794"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12793","parentNodeId":"ns=1;i=14664","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14664"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12794","parentNodeId":"ns=1;i=14664","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14664"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12795","parentNodeId":"ns=1;i=14664","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14664"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14794","parentNodeId":"ns=1;i=14664","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14664"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:MassFlow","dataType":"Double","description":[{"value":"Measure mass flow from the outlet area of the pump"}],"displayName":[{"value":"MassFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14666","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12802"},{"referenceType":"HasProperty","target":"ns=1;i=12803"},{"referenceType":"HasProperty","target":"ns=1;i=12804"},{"referenceType":"HasProperty","target":"ns=1;i=14797"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12802","parentNodeId":"ns=1;i=14666","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14666"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12803","parentNodeId":"ns=1;i=14666","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14666"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12804","parentNodeId":"ns=1;i=14666","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14666"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity characterizing a flowing fluid by the product of its local mass density and local velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14797","parentNodeId":"ns=1;i=14666","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14666"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emass flow\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtThroat","dataType":"Double","description":[{"value":"Measured rate of flow passing through the exit from the volute divided by the throat area"}],"displayName":[{"value":"MeanVelocityAtThroat"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14668","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12811"},{"referenceType":"HasProperty","target":"ns=1;i=12812"},{"referenceType":"HasProperty","target":"ns=1;i=12813"},{"referenceType":"HasProperty","target":"ns=1;i=14800"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12811","parentNodeId":"ns=1;i=14668","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14668"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12812","parentNodeId":"ns=1;i=14668","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14668"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12813","parentNodeId":"ns=1;i=14668","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14668"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14800","parentNodeId":"ns=1;i=14668","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14668"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:MechanicalEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the pump power input, P, available after satisfying the mechanical power losses, PJ, ab, at given operating conditions"}],"displayName":[{"value":"MechanicalEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14670","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12820"},{"referenceType":"HasProperty","target":"ns=1;i=12821"},{"referenceType":"HasProperty","target":"ns=1;i=12822"},{"referenceType":"HasProperty","target":"ns=1;i=14803"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12820","parentNodeId":"ns=1;i=14670","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14670"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12821","parentNodeId":"ns=1;i=14670","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14670"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12822","parentNodeId":"ns=1;i=14670","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14670"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14803","parentNodeId":"ns=1;i=14670","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14670"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:NetPositiveInletPressure","dataType":"Double","description":[{"value":"Total pressure (including velocity pressure) at the pump inlet connection less the liquid vapor pressure at the present temperature of the liquid"}],"displayName":[{"value":"NetPositiveInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14672","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12829"},{"referenceType":"HasProperty","target":"ns=1;i=12830"},{"referenceType":"HasProperty","target":"ns=1;i=12831"},{"referenceType":"HasProperty","target":"ns=1;i=14806"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12829","parentNodeId":"ns=1;i=14672","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14672"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12830","parentNodeId":"ns=1;i=14672","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14672"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12831","parentNodeId":"ns=1;i=14672","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14672"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14806","parentNodeId":"ns=1;i=14672","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14672"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:NetPositiveSuctionHead","dataType":"Double","description":[{"value":"Amount of the absolute value of the total head above the head, equivalent to the vapor pressure of the liquid at the particular temperature, with reference to the NPSH datum plane"}],"displayName":[{"value":"NetPositiveSuctionHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14674","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12838"},{"referenceType":"HasProperty","target":"ns=1;i=12839"},{"referenceType":"HasProperty","target":"ns=1;i=12840"},{"referenceType":"HasProperty","target":"ns=1;i=14809"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12838","parentNodeId":"ns=1;i=14674","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14674"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12839","parentNodeId":"ns=1;i=14674","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14674"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12840","parentNodeId":"ns=1;i=14674","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14674"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14809","parentNodeId":"ns=1;i=14674","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14674"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:NumberOfStarts","dataType":"UInt32","description":[{"value":"Total number of starts"}],"displayName":[{"value":"NumberOfStarts"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14676","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12847"},{"referenceType":"HasProperty","target":"ns=1;i=12848"},{"referenceType":"HasProperty","target":"ns=1;i=12849"},{"referenceType":"HasProperty","target":"ns=1;i=14812"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:UInt32 xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:UInt32\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12847","parentNodeId":"ns=1;i=14676","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14676"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12848","parentNodeId":"ns=1;i=14676","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14676"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12849","parentNodeId":"ns=1;i=14676","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14676"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14812","parentNodeId":"ns=1;i=14676","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14676"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:OutletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Measured pressure at the outlet area of the installation."}],"displayName":[{"value":"OutletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14678","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12856"},{"referenceType":"HasProperty","target":"ns=1;i=12857"},{"referenceType":"HasProperty","target":"ns=1;i=12858"},{"referenceType":"HasProperty","target":"ns=1;i=14815"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12856","parentNodeId":"ns=1;i=14678","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14678"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12857","parentNodeId":"ns=1;i=14678","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14678"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12858","parentNodeId":"ns=1;i=14678","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14678"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14815","parentNodeId":"ns=1;i=14678","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14678"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:OverallEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the driver power input, Pmot, delivered as pump power output, Pu"}],"displayName":[{"value":"OverallEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14680","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12865"},{"referenceType":"HasProperty","target":"ns=1;i=12866"},{"referenceType":"HasProperty","target":"ns=1;i=12867"},{"referenceType":"HasProperty","target":"ns=1;i=14818"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12865","parentNodeId":"ns=1;i=14680","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14680"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12866","parentNodeId":"ns=1;i=14680","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14680"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12867","parentNodeId":"ns=1;i=14680","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14680"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14818","parentNodeId":"ns=1;i=14680","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14680"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:PowerLossDueToInternalLeakage","dataType":"Double","description":[{"value":"Determined power loss due clearance flows"}],"displayName":[{"value":"PowerLossDueToInternalLeakage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14682","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12874"},{"referenceType":"HasProperty","target":"ns=1;i=12875"},{"referenceType":"HasProperty","target":"ns=1;i=12876"},{"referenceType":"HasProperty","target":"ns=1;i=14821"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12874","parentNodeId":"ns=1;i=14682","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14682"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12875","parentNodeId":"ns=1;i=14682","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14682"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12876","parentNodeId":"ns=1;i=14682","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14682"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14821","parentNodeId":"ns=1;i=14682","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14682"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:ProcessPressure","dataType":"Double","description":[{"value":"Measured process pressure of the pump"}],"displayName":[{"value":"ProcessPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14684","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12883"},{"referenceType":"HasProperty","target":"ns=1;i=12884"},{"referenceType":"HasProperty","target":"ns=1;i=12885"},{"referenceType":"HasProperty","target":"ns=1;i=14824"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12883","parentNodeId":"ns=1;i=14684","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14684"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12884","parentNodeId":"ns=1;i=14684","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14684"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12885","parentNodeId":"ns=1;i=14684","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14684"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14824","parentNodeId":"ns=1;i=14684","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14684"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:PumpEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the pump power input, P, delivered as pump power output, Pu, at given operating conditions"}],"displayName":[{"value":"PumpEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14686","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12892"},{"referenceType":"HasProperty","target":"ns=1;i=12893"},{"referenceType":"HasProperty","target":"ns=1;i=12894"},{"referenceType":"HasProperty","target":"ns=1;i=14827"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12892","parentNodeId":"ns=1;i=14686","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14686"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12893","parentNodeId":"ns=1;i=14686","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14686"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12894","parentNodeId":"ns=1;i=14686","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14686"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14827","parentNodeId":"ns=1;i=14686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:PumpHumidity","dataType":"Double","description":[{"value":"Measured humidity inside the pump"}],"displayName":[{"value":"PumpHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14688","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12901"},{"referenceType":"HasProperty","target":"ns=1;i=12902"},{"referenceType":"HasProperty","target":"ns=1;i=12903"},{"referenceType":"HasProperty","target":"ns=1;i=14830"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12901","parentNodeId":"ns=1;i=14688","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14688"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12902","parentNodeId":"ns=1;i=14688","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14688"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12903","parentNodeId":"ns=1;i=14688","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14688"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of partial pressure of water vapor and partial pressure at its saturation"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14830","parentNodeId":"ns=1;i=14688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14688"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erelative humidity\u003C/uax:String\u003E"},{"browseName":"1:PumpPowerInput","dataType":"Double","description":[{"value":"Measured power transmitted to the pump by its driver"}],"displayName":[{"value":"PumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14690","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12910"},{"referenceType":"HasProperty","target":"ns=1;i=12911"},{"referenceType":"HasProperty","target":"ns=1;i=12912"},{"referenceType":"HasProperty","target":"ns=1;i=14833"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12910","parentNodeId":"ns=1;i=14690","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14690"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12911","parentNodeId":"ns=1;i=14690","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14690"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12912","parentNodeId":"ns=1;i=14690","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14690"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar product of force acting to a body and its velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14833","parentNodeId":"ns=1;i=14690","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14690"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emechanical power\u003C/uax:String\u003E"},{"browseName":"1:PumpPowerOutput","dataType":"Double","description":[{"value":"Measured useful mechanical power transferred to the fluid during its passage through the pump"}],"displayName":[{"value":"PumpPowerOutput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14692","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12919"},{"referenceType":"HasProperty","target":"ns=1;i=12920"},{"referenceType":"HasProperty","target":"ns=1;i=12921"},{"referenceType":"HasProperty","target":"ns=1;i=14836"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12919","parentNodeId":"ns=1;i=14692","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14692"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12920","parentNodeId":"ns=1;i=14692","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14692"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12921","parentNodeId":"ns=1;i=14692","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14692"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar product of force acting to a body and its velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14836","parentNodeId":"ns=1;i=14692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emechanical power\u003C/uax:String\u003E"},{"browseName":"1:PumpTemperature","dataType":"Double","description":[{"value":"Measured temperature of the pump"}],"displayName":[{"value":"PumpTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14694","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13110"},{"referenceType":"HasProperty","target":"ns=1;i=13112"},{"referenceType":"HasProperty","target":"ns=1;i=13114"},{"referenceType":"HasProperty","target":"ns=1;i=14839"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13110","parentNodeId":"ns=1;i=14694","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14694"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13112","parentNodeId":"ns=1;i=14694","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14694"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13114","parentNodeId":"ns=1;i=14694","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14694"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14839","parentNodeId":"ns=1;i=14694","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14694"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:PumpTotalHead","dataType":"Double","description":[{"value":"Determined difference between the total head at the outlet side of the pump and the total head at the inlet side of the pump"}],"displayName":[{"value":"PumpTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14696","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13128"},{"referenceType":"HasProperty","target":"ns=1;i=13130"},{"referenceType":"HasProperty","target":"ns=1;i=13132"},{"referenceType":"HasProperty","target":"ns=1;i=14842"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13128","parentNodeId":"ns=1;i=14696","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14696"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13130","parentNodeId":"ns=1;i=14696","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14696"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13132","parentNodeId":"ns=1;i=14696","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14696"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14842","parentNodeId":"ns=1;i=14696","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14696"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:RadialLoadOfPumpRotor","dataType":"Double","description":[{"value":"Measured residual force acting at right angles to the line of the shaft and derived from hydraulic forces"}],"displayName":[{"value":"RadialLoadOfPumpRotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14698","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13148"},{"referenceType":"HasProperty","target":"ns=1;i=13150"},{"referenceType":"HasProperty","target":"ns=1;i=13152"},{"referenceType":"HasProperty","target":"ns=1;i=14845"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13148","parentNodeId":"ns=1;i=14698","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14698"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13150","parentNodeId":"ns=1;i=14698","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14698"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13152","parentNodeId":"ns=1;i=14698","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14698"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity describing interaction between bodies or particles"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14845","parentNodeId":"ns=1;i=14698","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14698"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eforce\u003C/uax:String\u003E"},{"browseName":"1:SoundEnergy","dataType":"Double","description":[{"value":"Determined integral of the sound power, P, over a stated time interval of duration T (starting at t1 and ending at t2)"}],"displayName":[{"value":"SoundEnergy"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14700","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13166"},{"referenceType":"HasProperty","target":"ns=1;i=13168"},{"referenceType":"HasProperty","target":"ns=1;i=13854"},{"referenceType":"HasProperty","target":"ns=1;i=14848"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13166","parentNodeId":"ns=1;i=14700","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14700"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13168","parentNodeId":"ns=1;i=14700","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14700"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13854","parentNodeId":"ns=1;i=14700","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14700"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14848","parentNodeId":"ns=1;i=14700","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14700"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:SoundEnergyLevel","dataType":"Double","description":[{"value":"Determined ten times the logarithm to the base 10 of the ratio of the sound energy, J, to a reference value, J0, expressed in decibels"}],"displayName":[{"value":"SoundEnergyLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14702","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13868"},{"referenceType":"HasProperty","target":"ns=1;i=13870"},{"referenceType":"HasProperty","target":"ns=1;i=13872"},{"referenceType":"HasProperty","target":"ns=1;i=14851"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13868","parentNodeId":"ns=1;i=14702","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14702"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13870","parentNodeId":"ns=1;i=14702","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14702"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13872","parentNodeId":"ns=1;i=14702","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14702"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14851","parentNodeId":"ns=1;i=14702","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14702"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:SoundPower","dataType":"Double","description":[{"value":"Determined through a surface, product of the sound pressure, p, and the component of the particle velocity, un, at a point on the surface in the direction normal to the surface, integrated over that surface"}],"displayName":[{"value":"SoundPower"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14704","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13886"},{"referenceType":"HasProperty","target":"ns=1;i=13889"},{"referenceType":"HasProperty","target":"ns=1;i=13891"},{"referenceType":"HasProperty","target":"ns=1;i=14854"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13886","parentNodeId":"ns=1;i=14704","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14704"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13889","parentNodeId":"ns=1;i=14704","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14704"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13891","parentNodeId":"ns=1;i=14704","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14704"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14854","parentNodeId":"ns=1;i=14704","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14704"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:SoundPowerLevel","dataType":"Double","description":[{"value":"Determined ten times the logarithm to the base 10 of the ratio of the sound power of a source, P, to a reference value, P0, expressed in decibels"}],"displayName":[{"value":"SoundPowerLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14706","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13905"},{"referenceType":"HasProperty","target":"ns=1;i=13907"},{"referenceType":"HasProperty","target":"ns=1;i=13909"},{"referenceType":"HasProperty","target":"ns=1;i=14857"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13905","parentNodeId":"ns=1;i=14706","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14706"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13907","parentNodeId":"ns=1;i=14706","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14706"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13909","parentNodeId":"ns=1;i=14706","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14706"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14857","parentNodeId":"ns=1;i=14706","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14706"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:SoundPressure","dataType":"Double","description":[{"value":"Measured difference between instantaneous pressure and static pressure"}],"displayName":[{"value":"SoundPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14708","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14655"},{"referenceType":"HasProperty","target":"ns=1;i=14657"},{"referenceType":"HasProperty","target":"ns=1;i=14659"},{"referenceType":"HasProperty","target":"ns=1;i=14860"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14655","parentNodeId":"ns=1;i=14708","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14708"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14657","parentNodeId":"ns=1;i=14708","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14708"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14659","parentNodeId":"ns=1;i=14708","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14708"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14860","parentNodeId":"ns=1;i=14708","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14708"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:SoundPressureLevel","dataType":"Double","description":[{"value":"Determined ten times logarithm to the base 10 of the ratio of the square of the sound pressure, p, to the square of a reference value, p0, expressed in decibels"}],"displayName":[{"value":"SoundPressureLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14710","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14673"},{"referenceType":"HasProperty","target":"ns=1;i=14675"},{"referenceType":"HasProperty","target":"ns=1;i=14677"},{"referenceType":"HasProperty","target":"ns=1;i=14863"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14673","parentNodeId":"ns=1;i=14710","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14710"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14675","parentNodeId":"ns=1;i=14710","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14710"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14677","parentNodeId":"ns=1;i=14710","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14710"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14863","parentNodeId":"ns=1;i=14710","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14710"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:Speed","dataType":"Double","description":[{"value":"Measured number of rotations or movements made by the shaft, coupling or impeller in a given time"}],"displayName":[{"value":"Speed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14712","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14691"},{"referenceType":"HasProperty","target":"ns=1;i=14693"},{"referenceType":"HasProperty","target":"ns=1;i=14695"},{"referenceType":"HasProperty","target":"ns=1;i=14866"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14691","parentNodeId":"ns=1;i=14712","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14712"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14693","parentNodeId":"ns=1;i=14712","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14712"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14695","parentNodeId":"ns=1;i=14712","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14712"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14866","parentNodeId":"ns=1;i=14712","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14712"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:Throughput","dataType":"Double","description":[{"value":"Measured throughput of the vacuum pump"}],"displayName":[{"value":"Throughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14714","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14709"},{"referenceType":"HasProperty","target":"ns=1;i=14711"},{"referenceType":"HasProperty","target":"ns=1;i=14713"},{"referenceType":"HasProperty","target":"ns=1;i=14869"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14709","parentNodeId":"ns=1;i=14714","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14714"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14711","parentNodeId":"ns=1;i=14714","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14714"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14713","parentNodeId":"ns=1;i=14714","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14714"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14869","parentNodeId":"ns=1;i=14714","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14714"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:TotalHeadAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Determined total head at the inlet area of the installation, which corresponds to the sum of geodetic head, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14716","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14727"},{"referenceType":"HasProperty","target":"ns=1;i=14728"},{"referenceType":"HasProperty","target":"ns=1;i=14729"},{"referenceType":"HasProperty","target":"ns=1;i=14872"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14727","parentNodeId":"ns=1;i=14716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14728","parentNodeId":"ns=1;i=14716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14729","parentNodeId":"ns=1;i=14716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14872","parentNodeId":"ns=1;i=14716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:TotalHeadAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Determined total head at the outlet area of the installation, which corresponds to the sum of geodetic head, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14718","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14736"},{"referenceType":"HasProperty","target":"ns=1;i=14737"},{"referenceType":"HasProperty","target":"ns=1;i=14738"},{"referenceType":"HasProperty","target":"ns=1;i=14875"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14736","parentNodeId":"ns=1;i=14718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14737","parentNodeId":"ns=1;i=14718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14738","parentNodeId":"ns=1;i=14718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14875","parentNodeId":"ns=1;i=14718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:VolumetricEfficiency","dataType":"Double","description":[{"value":"Determined ratio of the actual delivered volume at maximum pressure to the geometric displacement volume"}],"displayName":[{"value":"VolumetricEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14720","parentNodeId":"ns=1;i=5129","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14745"},{"referenceType":"HasProperty","target":"ns=1;i=14746"},{"referenceType":"HasProperty","target":"ns=1;i=14747"},{"referenceType":"HasProperty","target":"ns=1;i=14878"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5129"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14745","parentNodeId":"ns=1;i=14720","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14746","parentNodeId":"ns=1;i=14720","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14747","parentNodeId":"ns=1;i=14720","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind."}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14878","parentNodeId":"ns=1;i=14720","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MultiPump","description":[{"value":"Properties for multi pump usage of a pump."}],"displayName":[{"value":"MultiPump"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5197","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasComponent","target":"ns=1;i=11010"},{"referenceType":"HasComponent","target":"ns=1;i=11011"},{"referenceType":"HasComponent","target":"ns=1;i=11012"},{"referenceType":"HasComponent","target":"ns=1;i=11013"},{"referenceType":"HasComponent","target":"ns=1;i=11014"},{"referenceType":"HasComponent","target":"ns=1;i=11016"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"},{"referenceType":"HasComponent","target":"ns=1;i=11017"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1039"},{"referenceType":"HasComponent","target":"ns=1;i=11018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11019"},{"referenceType":"HasComponent","target":"ns=1;i=11020"},{"referenceType":"HasComponent","target":"ns=1;i=11021"}],"typeDefinition":"ns=1;i=1039"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:DistributionPriority","dataType":"String","description":[{"value":"This property describes in ascending order the priority of pumps in addition operation mode."}],"displayName":[{"value":"DistributionPriority"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11010","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11267"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11267","parentNodeId":"ns=1;i=11010","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11010"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DistributionType","dataType":"DistributionTypeEnum","description":[{"value":"This property describes the share of operation time of different pumps of the pump system in addition operation mode."}],"displayName":[{"value":"DistributionType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11011","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11268"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11268","parentNodeId":"ns=1;i=11011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeMode","dataType":"ExchangeModeEnum","description":[{"value":"This property specifies the exchange mode of the pump"}],"displayName":[{"value":"ExchangeMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11012","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11269"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11269","parentNodeId":"ns=1;i=11012","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeTime","dataType":"DateTime","description":[{"value":"This property specifies the determination of the absolute time for the next exchange of the pump, if operator specific Pump Exchange Mode is activated."}],"displayName":[{"value":"ExchangeTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11013","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11270"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11270","parentNodeId":"ns=1;i=11013","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeTimeDifference","dataType":"Double","description":[{"value":"This property specifies the determination of the time for the next exchange of the pump relative to ExchangeTime, if operator specific Pump Exchange Mode is activated."}],"displayName":[{"value":"ExchangeTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11014","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11271"},{"referenceType":"HasProperty","target":"ns=1;i=11015"},{"referenceType":"HasProperty","target":"ns=1;i=11272"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11271","parentNodeId":"ns=1;i=11014","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11014"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11015","parentNodeId":"ns=1;i=11014","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11014"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11272","parentNodeId":"ns=1;i=11014","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11014"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumNumberOfPumpsInOperation","dataType":"UInt32","description":[{"value":"This property specifies the maximum number of pumps in operation. The difference between NumberOfPumps and MaximumNumberOfPumpsInOperation identifies the redundant pumps."}],"displayName":[{"value":"MaximumNumberOfPumpsInOperation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11016","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11273"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11273","parentNodeId":"ns=1;i=11016","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MultiPumpOperationMode","dataType":"MultiPumpOperationModeEnum","description":[{"value":"This property specifies the actual multi pump operation mode. In redundant operation mode a pump fulfils the process function of another pump. Addition operation mode characterizes the supplementary fulfilling of the process function. The mixed mode characterizes both operation tasks."}],"displayName":[{"value":"MultiPumpOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11017","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11274"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11274","parentNodeId":"ns=1;i=11017","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NumberOfPumps","dataType":"UInt32","description":[{"value":"This property identifies the number of pumps in multi pump management"}],"displayName":[{"value":"NumberOfPumps"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11018","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11293"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11293","parentNodeId":"ns=1;i=11018","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:PumpCollectiveIDs","dataType":"String","description":[{"value":"This element identifies the pumps within the pump system"}],"displayName":[{"value":"PumpCollectiveIDs"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11019","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11294"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11294","parentNodeId":"ns=1;i=11019","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11019"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpRole","dataType":"PumpRoleEnum","description":[{"value":"This property identifies the role rsp. task of the pump within the multi pump management."}],"displayName":[{"value":"PumpRole"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11020","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11295"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11295","parentNodeId":"ns=1;i=11020","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:RedundantPumpIDs","dataType":"String","description":[{"value":"This property identifies the actual redundant pumps within the pump system"}],"displayName":[{"value":"RedundantPumpIDs"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11021","parentNodeId":"ns=1;i=5197","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11296"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5197"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11296","parentNodeId":"ns=1;i=11021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PumpActuation","description":[{"value":"Actuation parameters for a pump."}],"displayName":[{"value":"PumpActuation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5192","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasComponent","target":"ns=1;i=11022"},{"referenceType":"HasComponent","target":"ns=1;i=11026"},{"referenceType":"HasComponent","target":"ns=1;i=5198"},{"referenceType":"HasComponent","target":"ns=1;i=11039"},{"referenceType":"HasComponent","target":"ns=1;i=11042"},{"referenceType":"HasComponent","target":"ns=1;i=11045"},{"referenceType":"HasComponent","target":"ns=1;i=11053"},{"referenceType":"HasComponent","target":"ns=1;i=11056"},{"referenceType":"HasComponent","target":"ns=1;i=11061"},{"referenceType":"HasComponent","target":"ns=1;i=5199"},{"referenceType":"HasComponent","target":"ns=1;i=5200"},{"referenceType":"HasComponent","target":"ns=1;i=5201"},{"referenceType":"HasComponent","target":"ns=1;i=11084"},{"referenceType":"HasComponent","target":"ns=1;i=11085"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5202"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=5203"},{"referenceType":"HasComponent","target":"ns=1;i=5204"},{"referenceType":"HasComponent","target":"ns=1;i=5205"},{"referenceType":"HasComponent","target":"ns=1;i=11156"},{"referenceType":"HasComponent","target":"ns=1;i=11158"},{"referenceType":"HasComponent","target":"ns=1;i=11161"},{"referenceType":"HasComponent","target":"ns=1;i=11162"},{"referenceType":"HasComponent","target":"ns=1;i=11163"},{"referenceType":"HasComponent","target":"ns=1;i=5206"}],"typeDefinition":"ns=1;i=1028"},{"browseName":"1:ActualControlMode","dataType":"ControlModeEnum","description":[{"value":"This property describes the actual control mode of the pump."}],"displayName":[{"value":"ActualControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11022","parentNodeId":"ns=1;i=5192","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11599"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11599","parentNodeId":"ns=1;i=11022","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11022"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ActualOperationMode","dataType":"OperationModeEnum","description":[{"value":"This property describes the actual operation mode of the pump."}],"displayName":[{"value":"ActualOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11026","parentNodeId":"ns=1;i=5192","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11597"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11597","parentNodeId":"ns=1;i=11026","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11026"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:CleanValveRequest","description":[{"value":"This element offers a request for the opening of the clean valve."}],"displayName":[{"value":"CleanValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5198","parentNodeId":"ns=1;i=5192","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11027"},{"referenceType":"HasComponent","target":"ns=1;i=11504"},{"referenceType":"HasComponent","target":"ns=1;i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=11512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11516"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11027","parentNodeId":"ns=1;i=5198","references":[{"referenceType":"HasProperty","target":"ns=1;i=11503"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5198"},{"referenceType":"HasProperty","target":"ns=1;i=11028"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11038"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11503","parentNodeId":"ns=1;i=11027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11027"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11028","parentNodeId":"ns=1;i=11027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11027"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11038","parentNodeId":"ns=1;i=11027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11027"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11504","parentNodeId":"ns=1;i=5198","references":[{"referenceType":"HasProperty","target":"ns=1;i=11505"},{"referenceType":"HasProperty","target":"ns=1;i=11506"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5198"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11507"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11505","parentNodeId":"ns=1;i=11504","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11504"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11506","parentNodeId":"ns=1;i=11504","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11504"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11507","parentNodeId":"ns=1;i=11504","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11504"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11508","parentNodeId":"ns=1;i=5198","references":[{"referenceType":"HasProperty","target":"ns=1;i=11509"},{"referenceType":"HasProperty","target":"ns=1;i=11510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5198"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11511"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11509","parentNodeId":"ns=1;i=11508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11508"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11510","parentNodeId":"ns=1;i=11508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11508"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11511","parentNodeId":"ns=1;i=11508","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11508"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11512","parentNodeId":"ns=1;i=5198","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11513"},{"referenceType":"HasProperty","target":"ns=1;i=11514"},{"referenceType":"HasProperty","target":"ns=1;i=11515"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5198"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11513","parentNodeId":"ns=1;i=11512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11514","parentNodeId":"ns=1;i=11512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11515","parentNodeId":"ns=1;i=11512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11516","parentNodeId":"ns=1;i=5198","references":[{"referenceType":"HasProperty","target":"ns=1;i=11517"},{"referenceType":"HasProperty","target":"ns=1;i=11518"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5198"},{"referenceType":"HasProperty","target":"ns=1;i=11519"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11517","parentNodeId":"ns=1;i=11516","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11516"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11518","parentNodeId":"ns=1;i=11516","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11516"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11519","parentNodeId":"ns=1;i=11516","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11516"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ControlInversion","dataType":"Boolean","description":[{"value":"This property offers the inversion of the selected control mode in operation mode AutoControl. A \u0022True\u0022 status means that the control mode inversion is activated and a \u0022False\u0022 status means that the control mode inversion is deactivated."}],"displayName":[{"value":"ControlInversion"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11039","parentNodeId":"ns=1;i=5192","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasProperty","target":"ns=1;i=11601"},{"referenceType":"HasProperty","target":"ns=1;i=11040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11041"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11601","parentNodeId":"ns=1;i=11039","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11039"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11040","parentNodeId":"ns=1;i=11039","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11039"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11041","parentNodeId":"ns=1;i=11039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11039"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Enable","dataType":"Boolean","description":[{"value":"This property activates of the control function."}],"displayName":[{"value":"Enable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11042","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasProperty","target":"ns=1;i=11603"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasProperty","target":"ns=1;i=11043"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11044"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11603","parentNodeId":"ns=1;i=11042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11042"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11043","parentNodeId":"ns=1;i=11042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11042"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11044","parentNodeId":"ns=1;i=11042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11042"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExternalSignal","dataType":"Boolean","description":[{"value":"This property offers the activation of an external electrical interface serving the setpoint of the control function by selecting the kind of electrical (analogue) signal."}],"displayName":[{"value":"ExternalSignal"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11045","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasProperty","target":"ns=1;i=11602"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasProperty","target":"ns=1;i=11046"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11052"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11602","parentNodeId":"ns=1;i=11045","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11045"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11046","parentNodeId":"ns=1;i=11045","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11045"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11052","parentNodeId":"ns=1;i=11045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11045"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11053","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasProperty","target":"ns=1;i=11606"},{"referenceType":"HasProperty","target":"ns=1;i=11054"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11055"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11606","parentNodeId":"ns=1;i=11053","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11054","parentNodeId":"ns=1;i=11053","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11053"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11055","parentNodeId":"ns=1;i=11053","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11053"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11056","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11607"},{"referenceType":"HasProperty","target":"ns=1;i=11608"},{"referenceType":"HasProperty","target":"ns=1;i=11609"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11607","parentNodeId":"ns=1;i=11056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11608","parentNodeId":"ns=1;i=11056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11609","parentNodeId":"ns=1;i=11056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11061","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11610"},{"referenceType":"HasProperty","target":"ns=1;i=11062"},{"referenceType":"HasProperty","target":"ns=1;i=11611"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11610","parentNodeId":"ns=1;i=11061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11062","parentNodeId":"ns=1;i=11061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11061"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11611","parentNodeId":"ns=1;i=11061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FlushValveRequest","description":[{"value":"This element offers a request for the opening of the flush valve."}],"displayName":[{"value":"FlushValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5199","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11063"},{"referenceType":"HasComponent","target":"ns=1;i=11470"},{"referenceType":"HasComponent","target":"ns=1;i=11474"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11482"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11063","parentNodeId":"ns=1;i=5199","references":[{"referenceType":"HasProperty","target":"ns=1;i=11469"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5199"},{"referenceType":"HasProperty","target":"ns=1;i=11064"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11066"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11469","parentNodeId":"ns=1;i=11063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11064","parentNodeId":"ns=1;i=11063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11063"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11066","parentNodeId":"ns=1;i=11063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11063"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11470","parentNodeId":"ns=1;i=5199","references":[{"referenceType":"HasProperty","target":"ns=1;i=11471"},{"referenceType":"HasProperty","target":"ns=1;i=11472"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5199"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11473"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11471","parentNodeId":"ns=1;i=11470","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11470"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11472","parentNodeId":"ns=1;i=11470","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11470"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11473","parentNodeId":"ns=1;i=11470","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11470"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11474","parentNodeId":"ns=1;i=5199","references":[{"referenceType":"HasProperty","target":"ns=1;i=11475"},{"referenceType":"HasProperty","target":"ns=1;i=11476"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5199"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11477"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11475","parentNodeId":"ns=1;i=11474","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11474"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11476","parentNodeId":"ns=1;i=11474","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11474"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11477","parentNodeId":"ns=1;i=11474","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11474"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11478","parentNodeId":"ns=1;i=5199","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11479"},{"referenceType":"HasProperty","target":"ns=1;i=11480"},{"referenceType":"HasProperty","target":"ns=1;i=11481"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5199"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11479","parentNodeId":"ns=1;i=11478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11480","parentNodeId":"ns=1;i=11478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11481","parentNodeId":"ns=1;i=11478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11478"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11482","parentNodeId":"ns=1;i=5199","references":[{"referenceType":"HasProperty","target":"ns=1;i=11483"},{"referenceType":"HasProperty","target":"ns=1;i=11484"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5199"},{"referenceType":"HasProperty","target":"ns=1;i=11485"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11483","parentNodeId":"ns=1;i=11482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11482"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11484","parentNodeId":"ns=1;i=11482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11482"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11485","parentNodeId":"ns=1;i=11482","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11482"}],"typeDefinition":"i=68"},{"browseName":"1:GasDilValveRequest","description":[{"value":"This element offers a request for the opening of the gas dilution valve."}],"displayName":[{"value":"GasDilValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5200","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11070"},{"referenceType":"HasComponent","target":"ns=1;i=11521"},{"referenceType":"HasComponent","target":"ns=1;i=11525"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11529"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11533"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11070","parentNodeId":"ns=1;i=5200","references":[{"referenceType":"HasProperty","target":"ns=1;i=11520"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5200"},{"referenceType":"HasProperty","target":"ns=1;i=11071"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11072"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11520","parentNodeId":"ns=1;i=11070","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11070"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11071","parentNodeId":"ns=1;i=11070","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11070"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11072","parentNodeId":"ns=1;i=11070","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11070"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11521","parentNodeId":"ns=1;i=5200","references":[{"referenceType":"HasProperty","target":"ns=1;i=11522"},{"referenceType":"HasProperty","target":"ns=1;i=11523"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5200"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11524"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11522","parentNodeId":"ns=1;i=11521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11521"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11523","parentNodeId":"ns=1;i=11521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11521"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11524","parentNodeId":"ns=1;i=11521","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11521"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11525","parentNodeId":"ns=1;i=5200","references":[{"referenceType":"HasProperty","target":"ns=1;i=11526"},{"referenceType":"HasProperty","target":"ns=1;i=11527"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5200"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11528"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11526","parentNodeId":"ns=1;i=11525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11527","parentNodeId":"ns=1;i=11525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11525"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11528","parentNodeId":"ns=1;i=11525","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11525"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11529","parentNodeId":"ns=1;i=5200","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11530"},{"referenceType":"HasProperty","target":"ns=1;i=11531"},{"referenceType":"HasProperty","target":"ns=1;i=11532"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5200"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11530","parentNodeId":"ns=1;i=11529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11529"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11531","parentNodeId":"ns=1;i=11529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11529"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11532","parentNodeId":"ns=1;i=11529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11529"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11533","parentNodeId":"ns=1;i=5200","references":[{"referenceType":"HasProperty","target":"ns=1;i=11534"},{"referenceType":"HasProperty","target":"ns=1;i=11535"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5200"},{"referenceType":"HasProperty","target":"ns=1;i=11536"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11534","parentNodeId":"ns=1;i=11533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11533"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11535","parentNodeId":"ns=1;i=11533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11533"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11536","parentNodeId":"ns=1;i=11533","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11533"}],"typeDefinition":"i=68"},{"browseName":"1:InletValveRequest","description":[{"value":"This element offers a request for the opening of the inlet valve."}],"displayName":[{"value":"InletValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5201","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11081"},{"referenceType":"HasComponent","target":"ns=1;i=11436"},{"referenceType":"HasComponent","target":"ns=1;i=11440"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11448"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11081","parentNodeId":"ns=1;i=5201","references":[{"referenceType":"HasProperty","target":"ns=1;i=11435"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5201"},{"referenceType":"HasProperty","target":"ns=1;i=11082"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11083"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11435","parentNodeId":"ns=1;i=11081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11082","parentNodeId":"ns=1;i=11081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11081"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11083","parentNodeId":"ns=1;i=11081","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11081"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11436","parentNodeId":"ns=1;i=5201","references":[{"referenceType":"HasProperty","target":"ns=1;i=11437"},{"referenceType":"HasProperty","target":"ns=1;i=11438"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11439"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11437","parentNodeId":"ns=1;i=11436","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11436"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11438","parentNodeId":"ns=1;i=11436","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11436"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11439","parentNodeId":"ns=1;i=11436","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11436"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11440","parentNodeId":"ns=1;i=5201","references":[{"referenceType":"HasProperty","target":"ns=1;i=11441"},{"referenceType":"HasProperty","target":"ns=1;i=11442"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11443"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11441","parentNodeId":"ns=1;i=11440","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11440"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11442","parentNodeId":"ns=1;i=11440","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11440"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11443","parentNodeId":"ns=1;i=11440","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11440"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11444","parentNodeId":"ns=1;i=5201","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11445"},{"referenceType":"HasProperty","target":"ns=1;i=11446"},{"referenceType":"HasProperty","target":"ns=1;i=11447"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5201"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11445","parentNodeId":"ns=1;i=11444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11446","parentNodeId":"ns=1;i=11444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11447","parentNodeId":"ns=1;i=11444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11448","parentNodeId":"ns=1;i=5201","references":[{"referenceType":"HasProperty","target":"ns=1;i=11449"},{"referenceType":"HasProperty","target":"ns=1;i=11450"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5201"},{"referenceType":"HasProperty","target":"ns=1;i=11451"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11449","parentNodeId":"ns=1;i=11448","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11448"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11450","parentNodeId":"ns=1;i=11448","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11448"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11451","parentNodeId":"ns=1;i=11448","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11448"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11084","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11614"},{"referenceType":"HasProperty","target":"ns=1;i=11615"},{"referenceType":"HasProperty","target":"ns=1;i=11616"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11614","parentNodeId":"ns=1;i=11084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11084"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11615","parentNodeId":"ns=1;i=11084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11084"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11616","parentNodeId":"ns=1;i=11084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11084"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11085","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasProperty","target":"ns=1;i=11604"},{"referenceType":"HasProperty","target":"ns=1;i=11086"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11087"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11604","parentNodeId":"ns=1;i=11085","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11085"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11086","parentNodeId":"ns=1;i=11085","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11085"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11087","parentNodeId":"ns=1;i=11085","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11085"}],"typeDefinition":"i=68"},{"browseName":"1:OutletValveRequest","description":[{"value":"This element offers a request for the opening of the outlet valve."}],"displayName":[{"value":"OutletValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5202","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11088"},{"referenceType":"HasComponent","target":"ns=1;i=11453"},{"referenceType":"HasComponent","target":"ns=1;i=11457"},{"referenceType":"HasComponent","target":"ns=1;i=11461"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11465"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11088","parentNodeId":"ns=1;i=5202","references":[{"referenceType":"HasProperty","target":"ns=1;i=11452"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5202"},{"referenceType":"HasProperty","target":"ns=1;i=11094"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11095"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11452","parentNodeId":"ns=1;i=11088","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11088"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11094","parentNodeId":"ns=1;i=11088","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11088"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11095","parentNodeId":"ns=1;i=11088","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11088"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11453","parentNodeId":"ns=1;i=5202","references":[{"referenceType":"HasProperty","target":"ns=1;i=11454"},{"referenceType":"HasProperty","target":"ns=1;i=11455"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5202"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11456"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11454","parentNodeId":"ns=1;i=11453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11455","parentNodeId":"ns=1;i=11453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11453"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11456","parentNodeId":"ns=1;i=11453","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11453"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11457","parentNodeId":"ns=1;i=5202","references":[{"referenceType":"HasProperty","target":"ns=1;i=11458"},{"referenceType":"HasProperty","target":"ns=1;i=11459"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5202"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11460"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11458","parentNodeId":"ns=1;i=11457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11459","parentNodeId":"ns=1;i=11457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11457"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11460","parentNodeId":"ns=1;i=11457","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11457"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11461","parentNodeId":"ns=1;i=5202","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11462"},{"referenceType":"HasProperty","target":"ns=1;i=11463"},{"referenceType":"HasProperty","target":"ns=1;i=11464"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5202"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11462","parentNodeId":"ns=1;i=11461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11463","parentNodeId":"ns=1;i=11461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11464","parentNodeId":"ns=1;i=11461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11465","parentNodeId":"ns=1;i=5202","references":[{"referenceType":"HasProperty","target":"ns=1;i=11466"},{"referenceType":"HasProperty","target":"ns=1;i=11467"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5202"},{"referenceType":"HasProperty","target":"ns=1;i=11468"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11466","parentNodeId":"ns=1;i=11465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11467","parentNodeId":"ns=1;i=11465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11465"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11468","parentNodeId":"ns=1;i=11465","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11465"}],"typeDefinition":"i=68"},{"browseName":"1:PumpKick","description":[{"value":"This element describes a periodical operation of a pump, avoiding blockage at non operation time."}],"displayName":[{"value":"PumpKick"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5203","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasComponent","target":"ns=1;i=11096"},{"referenceType":"HasComponent","target":"ns=1;i=11572"},{"referenceType":"HasComponent","target":"ns=1;i=11576"},{"referenceType":"HasComponent","target":"ns=1;i=11580"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11584"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1032"},{"referenceType":"HasComponent","target":"ns=1;i=11586"},{"referenceType":"HasComponent","target":"ns=1;i=11588"},{"referenceType":"HasComponent","target":"ns=1;i=11592"}],"typeDefinition":"ns=1;i=1032"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11096","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasProperty","target":"ns=1;i=11571"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"},{"referenceType":"HasProperty","target":"ns=1;i=11097"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11149"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11571","parentNodeId":"ns=1;i=11096","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11096"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11097","parentNodeId":"ns=1;i=11096","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11096"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11149","parentNodeId":"ns=1;i=11096","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11096"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11572","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasProperty","target":"ns=1;i=11573"},{"referenceType":"HasProperty","target":"ns=1;i=11574"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11575"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11573","parentNodeId":"ns=1;i=11572","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11572"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11574","parentNodeId":"ns=1;i=11572","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11572"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11575","parentNodeId":"ns=1;i=11572","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11572"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11576","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasProperty","target":"ns=1;i=11577"},{"referenceType":"HasProperty","target":"ns=1;i=11578"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11579"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11577","parentNodeId":"ns=1;i=11576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11578","parentNodeId":"ns=1;i=11576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11576"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11579","parentNodeId":"ns=1;i=11576","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11576"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11580","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11581"},{"referenceType":"HasProperty","target":"ns=1;i=11582"},{"referenceType":"HasProperty","target":"ns=1;i=11583"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11581","parentNodeId":"ns=1;i=11580","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11580"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11582","parentNodeId":"ns=1;i=11580","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11580"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11583","parentNodeId":"ns=1;i=11580","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11580"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickMode","dataType":"PumpKickModeEnum","description":[{"value":"This property describes the pump kick mode of the pump."}],"displayName":[{"value":"PumpKickMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11584","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11585"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11585","parentNodeId":"ns=1;i=11584","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11584"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTime","dataType":"Double","description":[{"value":"This property determines the absolute time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11586","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11587"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11587","parentNodeId":"ns=1;i=11586","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11586"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTimeDifference","dataType":"Double","description":[{"value":"This property determines the interval time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11588","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11589"},{"referenceType":"HasProperty","target":"ns=1;i=11590"},{"referenceType":"HasProperty","target":"ns=1;i=11591"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"}],"typeDefinition":"i=17497","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11589","parentNodeId":"ns=1;i=11588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11588"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11590","parentNodeId":"ns=1;i=11588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11588"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11591","parentNodeId":"ns=1;i=11588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11588"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11592","parentNodeId":"ns=1;i=5203","references":[{"referenceType":"HasProperty","target":"ns=1;i=11593"},{"referenceType":"HasProperty","target":"ns=1;i=11594"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5203"},{"referenceType":"HasProperty","target":"ns=1;i=11595"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11593","parentNodeId":"ns=1;i=11592","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11592"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11594","parentNodeId":"ns=1;i=11592","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11592"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11595","parentNodeId":"ns=1;i=11592","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11592"}],"typeDefinition":"i=68"},{"browseName":"1:PumpStandByRequest","description":[{"value":"This element offers a request for pump standby."}],"displayName":[{"value":"PumpStandByRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5204","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11150"},{"referenceType":"HasComponent","target":"ns=1;i=11538"},{"referenceType":"HasComponent","target":"ns=1;i=11542"},{"referenceType":"HasComponent","target":"ns=1;i=11546"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11550"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11150","parentNodeId":"ns=1;i=5204","references":[{"referenceType":"HasProperty","target":"ns=1;i=11537"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5204"},{"referenceType":"HasProperty","target":"ns=1;i=11151"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11152"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11537","parentNodeId":"ns=1;i=11150","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11150"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11151","parentNodeId":"ns=1;i=11150","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11150"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11152","parentNodeId":"ns=1;i=11150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11150"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11538","parentNodeId":"ns=1;i=5204","references":[{"referenceType":"HasProperty","target":"ns=1;i=11539"},{"referenceType":"HasProperty","target":"ns=1;i=11540"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5204"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11541"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11539","parentNodeId":"ns=1;i=11538","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11538"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11540","parentNodeId":"ns=1;i=11538","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11538"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11541","parentNodeId":"ns=1;i=11538","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11538"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11542","parentNodeId":"ns=1;i=5204","references":[{"referenceType":"HasProperty","target":"ns=1;i=11543"},{"referenceType":"HasProperty","target":"ns=1;i=11544"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5204"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11545"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11543","parentNodeId":"ns=1;i=11542","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11542"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11544","parentNodeId":"ns=1;i=11542","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11542"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11545","parentNodeId":"ns=1;i=11542","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11542"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11546","parentNodeId":"ns=1;i=5204","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11547"},{"referenceType":"HasProperty","target":"ns=1;i=11548"},{"referenceType":"HasProperty","target":"ns=1;i=11549"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5204"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11547","parentNodeId":"ns=1;i=11546","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11546"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11548","parentNodeId":"ns=1;i=11546","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11546"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11549","parentNodeId":"ns=1;i=11546","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11546"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11550","parentNodeId":"ns=1;i=5204","references":[{"referenceType":"HasProperty","target":"ns=1;i=11551"},{"referenceType":"HasProperty","target":"ns=1;i=11552"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5204"},{"referenceType":"HasProperty","target":"ns=1;i=11553"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11551","parentNodeId":"ns=1;i=11550","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11550"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11552","parentNodeId":"ns=1;i=11550","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11550"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11553","parentNodeId":"ns=1;i=11550","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11550"}],"typeDefinition":"i=68"},{"browseName":"1:PurgeValveRequest","description":[{"value":"This element offers a request for the opening of the purge valve."}],"displayName":[{"value":"PurgeValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5205","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11153"},{"referenceType":"HasComponent","target":"ns=1;i=11487"},{"referenceType":"HasComponent","target":"ns=1;i=11491"},{"referenceType":"HasComponent","target":"ns=1;i=11495"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasComponent","target":"ns=1;i=11499"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11153","parentNodeId":"ns=1;i=5205","references":[{"referenceType":"HasProperty","target":"ns=1;i=11486"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5205"},{"referenceType":"HasProperty","target":"ns=1;i=11154"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11155"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11486","parentNodeId":"ns=1;i=11153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11154","parentNodeId":"ns=1;i=11153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11153"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11155","parentNodeId":"ns=1;i=11153","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11153"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11487","parentNodeId":"ns=1;i=5205","references":[{"referenceType":"HasProperty","target":"ns=1;i=11488"},{"referenceType":"HasProperty","target":"ns=1;i=11489"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5205"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11490"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11488","parentNodeId":"ns=1;i=11487","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11487"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11489","parentNodeId":"ns=1;i=11487","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11487"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11490","parentNodeId":"ns=1;i=11487","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11487"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11491","parentNodeId":"ns=1;i=5205","references":[{"referenceType":"HasProperty","target":"ns=1;i=11492"},{"referenceType":"HasProperty","target":"ns=1;i=11493"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5205"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11494"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11492","parentNodeId":"ns=1;i=11491","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11491"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11493","parentNodeId":"ns=1;i=11491","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11491"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11494","parentNodeId":"ns=1;i=11491","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11491"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11495","parentNodeId":"ns=1;i=5205","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11496"},{"referenceType":"HasProperty","target":"ns=1;i=11497"},{"referenceType":"HasProperty","target":"ns=1;i=11498"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5205"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11496","parentNodeId":"ns=1;i=11495","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11495"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11497","parentNodeId":"ns=1;i=11495","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11495"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11498","parentNodeId":"ns=1;i=11495","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11495"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11499","parentNodeId":"ns=1;i=5205","references":[{"referenceType":"HasProperty","target":"ns=1;i=11500"},{"referenceType":"HasProperty","target":"ns=1;i=11501"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5205"},{"referenceType":"HasProperty","target":"ns=1;i=11502"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11500","parentNodeId":"ns=1;i=11499","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11499"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11501","parentNodeId":"ns=1;i=11499","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11499"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11502","parentNodeId":"ns=1;i=11499","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11499"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11156","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11612"},{"referenceType":"HasProperty","target":"ns=1;i=11157"},{"referenceType":"HasProperty","target":"ns=1;i=11613"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11612","parentNodeId":"ns=1;i=11156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11157","parentNodeId":"ns=1;i=11156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11156"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11613","parentNodeId":"ns=1;i=11156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReverseRotatingDirection","dataType":"Boolean","description":[{"value":"This property indicates the inversion of the standard rotating direction."}],"displayName":[{"value":"ReverseRotatingDirection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11158","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasProperty","target":"ns=1;i=11598"},{"referenceType":"HasProperty","target":"ns=1;i=11159"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasProperty","target":"ns=1;i=11160"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11598","parentNodeId":"ns=1;i=11158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11158"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11159","parentNodeId":"ns=1;i=11158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11158"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11160","parentNodeId":"ns=1;i=11158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11158"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SetControlMode","dataType":"ControlModeEnum","description":[{"value":"This property describes the desired control mode of the pump."}],"displayName":[{"value":"SetControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11161","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11600"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11600","parentNodeId":"ns=1;i=11161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SetOperationMode","dataType":"OperationModeEnum","description":[{"value":"This property describes the desired operation mode of the pump."}],"displayName":[{"value":"SetOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11162","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11596"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11596","parentNodeId":"ns=1;i=11162","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11162"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11163","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasProperty","target":"ns=1;i=11605"},{"referenceType":"HasProperty","target":"ns=1;i=11164"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"},{"referenceType":"HasProperty","target":"ns=1;i=11165"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11605","parentNodeId":"ns=1;i=11163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11163"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11164","parentNodeId":"ns=1;i=11163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11163"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11165","parentNodeId":"ns=1;i=11163","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11163"}],"typeDefinition":"i=68"},{"browseName":"1:VentValveRequest","description":[{"value":"This element offers a request for the opening of the vent valve."}],"displayName":[{"value":"VentValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5206","parentNodeId":"ns=1;i=5192","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11166"},{"referenceType":"HasComponent","target":"ns=1;i=11555"},{"referenceType":"HasComponent","target":"ns=1;i=11559"},{"referenceType":"HasComponent","target":"ns=1;i=11563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11567"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5192"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11166","parentNodeId":"ns=1;i=5206","references":[{"referenceType":"HasProperty","target":"ns=1;i=11554"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5206"},{"referenceType":"HasProperty","target":"ns=1;i=11167"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11168"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11554","parentNodeId":"ns=1;i=11166","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11166"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11167","parentNodeId":"ns=1;i=11166","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11166"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11168","parentNodeId":"ns=1;i=11166","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11166"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11555","parentNodeId":"ns=1;i=5206","references":[{"referenceType":"HasProperty","target":"ns=1;i=11556"},{"referenceType":"HasProperty","target":"ns=1;i=11557"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5206"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11558"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11556","parentNodeId":"ns=1;i=11555","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11555"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11557","parentNodeId":"ns=1;i=11555","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11555"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11558","parentNodeId":"ns=1;i=11555","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11555"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11559","parentNodeId":"ns=1;i=5206","references":[{"referenceType":"HasProperty","target":"ns=1;i=11560"},{"referenceType":"HasProperty","target":"ns=1;i=11561"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5206"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11562"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11560","parentNodeId":"ns=1;i=11559","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11559"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11561","parentNodeId":"ns=1;i=11559","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11559"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11562","parentNodeId":"ns=1;i=11559","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11559"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11563","parentNodeId":"ns=1;i=5206","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11564"},{"referenceType":"HasProperty","target":"ns=1;i=11565"},{"referenceType":"HasProperty","target":"ns=1;i=11566"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5206"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11564","parentNodeId":"ns=1;i=11563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11565","parentNodeId":"ns=1;i=11563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11566","parentNodeId":"ns=1;i=11563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11567","parentNodeId":"ns=1;i=5206","references":[{"referenceType":"HasProperty","target":"ns=1;i=11568"},{"referenceType":"HasProperty","target":"ns=1;i=11569"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5206"},{"referenceType":"HasProperty","target":"ns=1;i=11570"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11568","parentNodeId":"ns=1;i=11567","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11567"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11569","parentNodeId":"ns=1;i=11567","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11567"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11570","parentNodeId":"ns=1;i=11567","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11567"}],"typeDefinition":"i=68"},{"browseName":"1:Signals","description":[{"value":"Signals of a pump."}],"displayName":[{"value":"Signals"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5195","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasComponent","target":"ns=1;i=5207"},{"referenceType":"HasComponent","target":"ns=1;i=5208"},{"referenceType":"HasComponent","target":"ns=1;i=5209"},{"referenceType":"HasComponent","target":"ns=1;i=5210"},{"referenceType":"HasComponent","target":"ns=1;i=5211"},{"referenceType":"HasComponent","target":"ns=1;i=5212"},{"referenceType":"HasComponent","target":"ns=1;i=5213"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5214"},{"referenceType":"HasComponent","target":"ns=1;i=5215"},{"referenceType":"HasComponent","target":"ns=1;i=5216"},{"referenceType":"HasComponent","target":"ns=1;i=5217"},{"referenceType":"HasComponent","target":"ns=1;i=5218"},{"referenceType":"HasComponent","target":"ns=1;i=5219"},{"referenceType":"HasComponent","target":"ns=1;i=5220"},{"referenceType":"HasComponent","target":"ns=1;i=5221"},{"referenceType":"HasComponent","target":"ns=1;i=5222"},{"referenceType":"HasComponent","target":"ns=1;i=5223"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=5224"},{"referenceType":"HasComponent","target":"ns=1;i=5225"},{"referenceType":"HasComponent","target":"ns=1;i=5226"},{"referenceType":"HasComponent","target":"ns=1;i=5227"}],"typeDefinition":"ns=1;i=1033"},{"browseName":"1:Acceleration","description":[{"value":"This element serves a feedback that the pump rotation accelerates."}],"displayName":[{"value":"Acceleration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5207","parentNodeId":"ns=1;i=5195","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11169"},{"referenceType":"HasComponent","target":"ns=1;i=12477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12481"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11169","parentNodeId":"ns=1;i=5207","references":[{"referenceType":"HasProperty","target":"ns=1;i=11678"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5207"},{"referenceType":"HasProperty","target":"ns=1;i=11170"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11171"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11678","parentNodeId":"ns=1;i=11169","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11169"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11170","parentNodeId":"ns=1;i=11169","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11169"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11171","parentNodeId":"ns=1;i=11169","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11169"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12477","parentNodeId":"ns=1;i=5207","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12478"},{"referenceType":"HasProperty","target":"ns=1;i=12479"},{"referenceType":"HasProperty","target":"ns=1;i=12480"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5207"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12478","parentNodeId":"ns=1;i=12477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12479","parentNodeId":"ns=1;i=12477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12480","parentNodeId":"ns=1;i=12477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12481","parentNodeId":"ns=1;i=5207","references":[{"referenceType":"HasProperty","target":"ns=1;i=12482"},{"referenceType":"HasProperty","target":"ns=1;i=12483"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5207"},{"referenceType":"HasProperty","target":"ns=1;i=12484"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12482","parentNodeId":"ns=1;i=12481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12481"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12483","parentNodeId":"ns=1;i=12481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12481"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12484","parentNodeId":"ns=1;i=12481","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12481"}],"typeDefinition":"i=68"},{"browseName":"1:CleanValveOpen","description":[{"value":"This element serves a feedback about the open state of the cleaning valve."}],"displayName":[{"value":"CleanValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5208","parentNodeId":"ns=1;i=5195","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11172"},{"referenceType":"HasComponent","target":"ns=1;i=12485"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12489"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11172","parentNodeId":"ns=1;i=5208","references":[{"referenceType":"HasProperty","target":"ns=1;i=11679"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5208"},{"referenceType":"HasProperty","target":"ns=1;i=11173"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11174"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11679","parentNodeId":"ns=1;i=11172","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11172"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11173","parentNodeId":"ns=1;i=11172","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11172"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11174","parentNodeId":"ns=1;i=11172","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11172"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12485","parentNodeId":"ns=1;i=5208","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12486"},{"referenceType":"HasProperty","target":"ns=1;i=12487"},{"referenceType":"HasProperty","target":"ns=1;i=12488"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5208"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12486","parentNodeId":"ns=1;i=12485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12485"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12487","parentNodeId":"ns=1;i=12485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12485"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12488","parentNodeId":"ns=1;i=12485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12485"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12489","parentNodeId":"ns=1;i=5208","references":[{"referenceType":"HasProperty","target":"ns=1;i=12490"},{"referenceType":"HasProperty","target":"ns=1;i=12491"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5208"},{"referenceType":"HasProperty","target":"ns=1;i=12492"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12490","parentNodeId":"ns=1;i=12489","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12489"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12491","parentNodeId":"ns=1;i=12489","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12489"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12492","parentNodeId":"ns=1;i=12489","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12489"}],"typeDefinition":"i=68"},{"browseName":"1:Deceleration","description":[{"value":"This element serves a feedback that the pump rotation decelerates."}],"displayName":[{"value":"Deceleration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5209","parentNodeId":"ns=1;i=5195","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11175"},{"referenceType":"HasComponent","target":"ns=1;i=12629"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12633"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11175","parentNodeId":"ns=1;i=5209","references":[{"referenceType":"HasProperty","target":"ns=1;i=11680"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5209"},{"referenceType":"HasProperty","target":"ns=1;i=11176"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11177"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11680","parentNodeId":"ns=1;i=11175","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11175"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11176","parentNodeId":"ns=1;i=11175","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11175"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11177","parentNodeId":"ns=1;i=11175","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11175"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12629","parentNodeId":"ns=1;i=5209","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12630"},{"referenceType":"HasProperty","target":"ns=1;i=12631"},{"referenceType":"HasProperty","target":"ns=1;i=12632"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5209"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12630","parentNodeId":"ns=1;i=12629","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12629"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12631","parentNodeId":"ns=1;i=12629","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12629"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12632","parentNodeId":"ns=1;i=12629","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12629"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12633","parentNodeId":"ns=1;i=5209","references":[{"referenceType":"HasProperty","target":"ns=1;i=12634"},{"referenceType":"HasProperty","target":"ns=1;i=12635"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5209"},{"referenceType":"HasProperty","target":"ns=1;i=12636"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12634","parentNodeId":"ns=1;i=12633","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12633"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12635","parentNodeId":"ns=1;i=12633","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12633"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12636","parentNodeId":"ns=1;i=12633","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12633"}],"typeDefinition":"i=68"},{"browseName":"1:FlushValveOpen","description":[{"value":"This element serves a feedback about the open state of the flush valve."}],"displayName":[{"value":"FlushValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5210","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11178"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12493"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12497"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11178","parentNodeId":"ns=1;i=5210","references":[{"referenceType":"HasProperty","target":"ns=1;i=11681"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5210"},{"referenceType":"HasProperty","target":"ns=1;i=11179"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11180"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11681","parentNodeId":"ns=1;i=11178","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11178"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11179","parentNodeId":"ns=1;i=11178","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11178"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11180","parentNodeId":"ns=1;i=11178","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11178"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12493","parentNodeId":"ns=1;i=5210","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12494"},{"referenceType":"HasProperty","target":"ns=1;i=12495"},{"referenceType":"HasProperty","target":"ns=1;i=12496"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5210"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12494","parentNodeId":"ns=1;i=12493","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12493"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12495","parentNodeId":"ns=1;i=12493","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12493"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12496","parentNodeId":"ns=1;i=12493","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12493"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12497","parentNodeId":"ns=1;i=5210","references":[{"referenceType":"HasProperty","target":"ns=1;i=12498"},{"referenceType":"HasProperty","target":"ns=1;i=12499"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5210"},{"referenceType":"HasProperty","target":"ns=1;i=12500"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12498","parentNodeId":"ns=1;i=12497","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12497"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12499","parentNodeId":"ns=1;i=12497","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12497"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12500","parentNodeId":"ns=1;i=12497","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12497"}],"typeDefinition":"i=68"},{"browseName":"1:GasDilValveOpen","description":[{"value":"This element serves a feedback about the open state of the gas dilution valve."}],"displayName":[{"value":"GasDilValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5211","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11181"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12505"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11181","parentNodeId":"ns=1;i=5211","references":[{"referenceType":"HasProperty","target":"ns=1;i=11682"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5211"},{"referenceType":"HasProperty","target":"ns=1;i=11182"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11183"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11682","parentNodeId":"ns=1;i=11181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11181"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11182","parentNodeId":"ns=1;i=11181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11181"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11183","parentNodeId":"ns=1;i=11181","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11181"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12501","parentNodeId":"ns=1;i=5211","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12502"},{"referenceType":"HasProperty","target":"ns=1;i=12503"},{"referenceType":"HasProperty","target":"ns=1;i=12504"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5211"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12502","parentNodeId":"ns=1;i=12501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12503","parentNodeId":"ns=1;i=12501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12504","parentNodeId":"ns=1;i=12501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12505","parentNodeId":"ns=1;i=5211","references":[{"referenceType":"HasProperty","target":"ns=1;i=12506"},{"referenceType":"HasProperty","target":"ns=1;i=12507"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5211"},{"referenceType":"HasProperty","target":"ns=1;i=12508"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12506","parentNodeId":"ns=1;i=12505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12505"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12507","parentNodeId":"ns=1;i=12505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12505"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12508","parentNodeId":"ns=1;i=12505","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12505"}],"typeDefinition":"i=68"},{"browseName":"1:InletValveOpen","description":[{"value":"This element serves a feedback about the open state of the inlet valve."}],"displayName":[{"value":"InletValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5212","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11184"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12513"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11184","parentNodeId":"ns=1;i=5212","references":[{"referenceType":"HasProperty","target":"ns=1;i=11683"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5212"},{"referenceType":"HasProperty","target":"ns=1;i=11185"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11186"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11683","parentNodeId":"ns=1;i=11184","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11184"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11185","parentNodeId":"ns=1;i=11184","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11184"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11186","parentNodeId":"ns=1;i=11184","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11184"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12509","parentNodeId":"ns=1;i=5212","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12510"},{"referenceType":"HasProperty","target":"ns=1;i=12511"},{"referenceType":"HasProperty","target":"ns=1;i=12512"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5212"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12510","parentNodeId":"ns=1;i=12509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12511","parentNodeId":"ns=1;i=12509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12512","parentNodeId":"ns=1;i=12509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12513","parentNodeId":"ns=1;i=5212","references":[{"referenceType":"HasProperty","target":"ns=1;i=12514"},{"referenceType":"HasProperty","target":"ns=1;i=12515"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5212"},{"referenceType":"HasProperty","target":"ns=1;i=12516"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12514","parentNodeId":"ns=1;i=12513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12515","parentNodeId":"ns=1;i=12513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12513"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12516","parentNodeId":"ns=1;i=12513","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12513"}],"typeDefinition":"i=68"},{"browseName":"1:NoRotation","description":[{"value":"This element serves a feedback that the pump stands still."}],"displayName":[{"value":"NoRotation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5213","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11187"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12521"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11187","parentNodeId":"ns=1;i=5213","references":[{"referenceType":"HasProperty","target":"ns=1;i=11684"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5213"},{"referenceType":"HasProperty","target":"ns=1;i=11188"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11189"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11684","parentNodeId":"ns=1;i=11187","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11187"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11188","parentNodeId":"ns=1;i=11187","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11187"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11189","parentNodeId":"ns=1;i=11187","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11187"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12517","parentNodeId":"ns=1;i=5213","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12518"},{"referenceType":"HasProperty","target":"ns=1;i=12519"},{"referenceType":"HasProperty","target":"ns=1;i=12520"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5213"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12518","parentNodeId":"ns=1;i=12517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12519","parentNodeId":"ns=1;i=12517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12520","parentNodeId":"ns=1;i=12517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12521","parentNodeId":"ns=1;i=5213","references":[{"referenceType":"HasProperty","target":"ns=1;i=12522"},{"referenceType":"HasProperty","target":"ns=1;i=12523"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5213"},{"referenceType":"HasProperty","target":"ns=1;i=12524"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12522","parentNodeId":"ns=1;i=12521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12521"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12523","parentNodeId":"ns=1;i=12521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12521"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12524","parentNodeId":"ns=1;i=12521","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12521"}],"typeDefinition":"i=68"},{"browseName":"1:OutletValveOpen","description":[{"value":"This element serves a feedback about the open state of the outlet valve."}],"displayName":[{"value":"OutletValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5214","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11190"},{"referenceType":"HasComponent","target":"ns=1;i=12525"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12529"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11190","parentNodeId":"ns=1;i=5214","references":[{"referenceType":"HasProperty","target":"ns=1;i=11685"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5214"},{"referenceType":"HasProperty","target":"ns=1;i=11191"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11192"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11685","parentNodeId":"ns=1;i=11190","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11190"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11191","parentNodeId":"ns=1;i=11190","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11190"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11192","parentNodeId":"ns=1;i=11190","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11190"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12525","parentNodeId":"ns=1;i=5214","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12526"},{"referenceType":"HasProperty","target":"ns=1;i=12527"},{"referenceType":"HasProperty","target":"ns=1;i=12528"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5214"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12526","parentNodeId":"ns=1;i=12525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12527","parentNodeId":"ns=1;i=12525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12528","parentNodeId":"ns=1;i=12525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12529","parentNodeId":"ns=1;i=5214","references":[{"referenceType":"HasProperty","target":"ns=1;i=12530"},{"referenceType":"HasProperty","target":"ns=1;i=12531"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5214"},{"referenceType":"HasProperty","target":"ns=1;i=12532"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12530","parentNodeId":"ns=1;i=12529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12529"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12531","parentNodeId":"ns=1;i=12529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12529"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12532","parentNodeId":"ns=1;i=12529","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12529"}],"typeDefinition":"i=68"},{"browseName":"1:ProcessIsActive","description":[{"value":"This element serves a feedback that the process is active."}],"displayName":[{"value":"ProcessIsActive"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5215","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11193"},{"referenceType":"HasComponent","target":"ns=1;i=12533"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12537"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11193","parentNodeId":"ns=1;i=5215","references":[{"referenceType":"HasProperty","target":"ns=1;i=11686"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5215"},{"referenceType":"HasProperty","target":"ns=1;i=11194"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11198"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11686","parentNodeId":"ns=1;i=11193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11194","parentNodeId":"ns=1;i=11193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11193"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11198","parentNodeId":"ns=1;i=11193","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11193"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12533","parentNodeId":"ns=1;i=5215","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12534"},{"referenceType":"HasProperty","target":"ns=1;i=12535"},{"referenceType":"HasProperty","target":"ns=1;i=12536"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5215"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12534","parentNodeId":"ns=1;i=12533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12533"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12535","parentNodeId":"ns=1;i=12533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12533"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12536","parentNodeId":"ns=1;i=12533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12533"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12537","parentNodeId":"ns=1;i=5215","references":[{"referenceType":"HasProperty","target":"ns=1;i=12538"},{"referenceType":"HasProperty","target":"ns=1;i=12539"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5215"},{"referenceType":"HasProperty","target":"ns=1;i=12540"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12538","parentNodeId":"ns=1;i=12537","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12537"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12539","parentNodeId":"ns=1;i=12537","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12537"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12540","parentNodeId":"ns=1;i=12537","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12537"}],"typeDefinition":"i=68"},{"browseName":"1:PumpActivation","description":[{"value":"This element serves a feedback about the activation state of the pump. The activation state takes into account that control mechanisms are active. Never the less the pump is not necessarily running"}],"displayName":[{"value":"PumpActivation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5216","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11199"},{"referenceType":"HasComponent","target":"ns=1;i=12541"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12545"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11199","parentNodeId":"ns=1;i=5216","references":[{"referenceType":"HasProperty","target":"ns=1;i=11687"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5216"},{"referenceType":"HasProperty","target":"ns=1;i=11200"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11201"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11687","parentNodeId":"ns=1;i=11199","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11199"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11200","parentNodeId":"ns=1;i=11199","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11199"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11201","parentNodeId":"ns=1;i=11199","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11199"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12541","parentNodeId":"ns=1;i=5216","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12542"},{"referenceType":"HasProperty","target":"ns=1;i=12543"},{"referenceType":"HasProperty","target":"ns=1;i=12544"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5216"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12542","parentNodeId":"ns=1;i=12541","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12541"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12543","parentNodeId":"ns=1;i=12541","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12541"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12544","parentNodeId":"ns=1;i=12541","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12541"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12545","parentNodeId":"ns=1;i=5216","references":[{"referenceType":"HasProperty","target":"ns=1;i=12546"},{"referenceType":"HasProperty","target":"ns=1;i=12547"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5216"},{"referenceType":"HasProperty","target":"ns=1;i=12548"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12546","parentNodeId":"ns=1;i=12545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12545"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12547","parentNodeId":"ns=1;i=12545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12545"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12548","parentNodeId":"ns=1;i=12545","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12545"}],"typeDefinition":"i=68"},{"browseName":"1:PumpDirection","description":[{"value":"This element serves a feedback of the pumps direction of rotation."}],"displayName":[{"value":"PumpDirection"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5217","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11202"},{"referenceType":"HasComponent","target":"ns=1;i=12549"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12553"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11202","parentNodeId":"ns=1;i=5217","references":[{"referenceType":"HasProperty","target":"ns=1;i=11688"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5217"},{"referenceType":"HasProperty","target":"ns=1;i=11203"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11204"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11688","parentNodeId":"ns=1;i=11202","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11202"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11203","parentNodeId":"ns=1;i=11202","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11202"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11204","parentNodeId":"ns=1;i=11202","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11202"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12549","parentNodeId":"ns=1;i=5217","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12550"},{"referenceType":"HasProperty","target":"ns=1;i=12551"},{"referenceType":"HasProperty","target":"ns=1;i=12552"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5217"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12550","parentNodeId":"ns=1;i=12549","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12549"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12551","parentNodeId":"ns=1;i=12549","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12549"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12552","parentNodeId":"ns=1;i=12549","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12549"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12553","parentNodeId":"ns=1;i=5217","references":[{"referenceType":"HasProperty","target":"ns=1;i=12554"},{"referenceType":"HasProperty","target":"ns=1;i=12555"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5217"},{"referenceType":"HasProperty","target":"ns=1;i=12556"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12554","parentNodeId":"ns=1;i=12553","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12553"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12555","parentNodeId":"ns=1;i=12553","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12553"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12556","parentNodeId":"ns=1;i=12553","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12553"}],"typeDefinition":"i=68"},{"browseName":"1:PumpOperation","description":[{"value":"This element serves a feedback about the operation state of the pump. In the operation state the pump rotor is rotating."}],"displayName":[{"value":"PumpOperation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5218","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11205"},{"referenceType":"HasComponent","target":"ns=1;i=12557"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12561"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11205","parentNodeId":"ns=1;i=5218","references":[{"referenceType":"HasProperty","target":"ns=1;i=11689"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5218"},{"referenceType":"HasProperty","target":"ns=1;i=11206"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11207"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11689","parentNodeId":"ns=1;i=11205","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11205"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11206","parentNodeId":"ns=1;i=11205","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11205"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11207","parentNodeId":"ns=1;i=11205","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11205"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12557","parentNodeId":"ns=1;i=5218","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12558"},{"referenceType":"HasProperty","target":"ns=1;i=12559"},{"referenceType":"HasProperty","target":"ns=1;i=12560"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5218"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12558","parentNodeId":"ns=1;i=12557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12557"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12559","parentNodeId":"ns=1;i=12557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12557"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12560","parentNodeId":"ns=1;i=12557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12557"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12561","parentNodeId":"ns=1;i=5218","references":[{"referenceType":"HasProperty","target":"ns=1;i=12562"},{"referenceType":"HasProperty","target":"ns=1;i=12563"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5218"},{"referenceType":"HasProperty","target":"ns=1;i=12564"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12562","parentNodeId":"ns=1;i=12561","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12561"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12563","parentNodeId":"ns=1;i=12561","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12561"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12564","parentNodeId":"ns=1;i=12561","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12561"}],"typeDefinition":"i=68"},{"browseName":"1:PumpPowerMax","description":[{"value":"This element serves a feedback of pump operating at maximum power."}],"displayName":[{"value":"PumpPowerMax"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5219","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11208"},{"referenceType":"HasComponent","target":"ns=1;i=12565"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12569"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11208","parentNodeId":"ns=1;i=5219","references":[{"referenceType":"HasProperty","target":"ns=1;i=11690"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5219"},{"referenceType":"HasProperty","target":"ns=1;i=11209"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11210"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11690","parentNodeId":"ns=1;i=11208","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11208"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11209","parentNodeId":"ns=1;i=11208","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11208"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11210","parentNodeId":"ns=1;i=11208","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11208"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12565","parentNodeId":"ns=1;i=5219","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12566"},{"referenceType":"HasProperty","target":"ns=1;i=12567"},{"referenceType":"HasProperty","target":"ns=1;i=12568"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5219"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12566","parentNodeId":"ns=1;i=12565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12565"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12567","parentNodeId":"ns=1;i=12565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12565"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12568","parentNodeId":"ns=1;i=12565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12565"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12569","parentNodeId":"ns=1;i=5219","references":[{"referenceType":"HasProperty","target":"ns=1;i=12570"},{"referenceType":"HasProperty","target":"ns=1;i=12571"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5219"},{"referenceType":"HasProperty","target":"ns=1;i=12572"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12570","parentNodeId":"ns=1;i=12569","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12569"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12571","parentNodeId":"ns=1;i=12569","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12569"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12572","parentNodeId":"ns=1;i=12569","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12569"}],"typeDefinition":"i=68"},{"browseName":"1:PumpSpeedMax","description":[{"value":"This element serves a feedback of pump operating at maximum speed."}],"displayName":[{"value":"PumpSpeedMax"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5220","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11211"},{"referenceType":"HasComponent","target":"ns=1;i=12573"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12577"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11211","parentNodeId":"ns=1;i=5220","references":[{"referenceType":"HasProperty","target":"ns=1;i=11691"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5220"},{"referenceType":"HasProperty","target":"ns=1;i=11212"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11213"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11691","parentNodeId":"ns=1;i=11211","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11211"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11212","parentNodeId":"ns=1;i=11211","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11211"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11213","parentNodeId":"ns=1;i=11211","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11211"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12573","parentNodeId":"ns=1;i=5220","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12574"},{"referenceType":"HasProperty","target":"ns=1;i=12575"},{"referenceType":"HasProperty","target":"ns=1;i=12576"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5220"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12574","parentNodeId":"ns=1;i=12573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12575","parentNodeId":"ns=1;i=12573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12576","parentNodeId":"ns=1;i=12573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12577","parentNodeId":"ns=1;i=5220","references":[{"referenceType":"HasProperty","target":"ns=1;i=12578"},{"referenceType":"HasProperty","target":"ns=1;i=12579"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5220"},{"referenceType":"HasProperty","target":"ns=1;i=12580"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12578","parentNodeId":"ns=1;i=12577","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12577"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12579","parentNodeId":"ns=1;i=12577","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12577"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12580","parentNodeId":"ns=1;i=12577","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12577"}],"typeDefinition":"i=68"},{"browseName":"1:PumpSpeedMin","description":[{"value":"This element serves a feedback that the pump operates at minimum speed."}],"displayName":[{"value":"PumpSpeedMin"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5221","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11214"},{"referenceType":"HasComponent","target":"ns=1;i=12581"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12585"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11214","parentNodeId":"ns=1;i=5221","references":[{"referenceType":"HasProperty","target":"ns=1;i=11692"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5221"},{"referenceType":"HasProperty","target":"ns=1;i=11215"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11216"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11692","parentNodeId":"ns=1;i=11214","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11214"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11215","parentNodeId":"ns=1;i=11214","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11214"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11216","parentNodeId":"ns=1;i=11214","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11214"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12581","parentNodeId":"ns=1;i=5221","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12582"},{"referenceType":"HasProperty","target":"ns=1;i=12583"},{"referenceType":"HasProperty","target":"ns=1;i=12584"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5221"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12582","parentNodeId":"ns=1;i=12581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12583","parentNodeId":"ns=1;i=12581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12584","parentNodeId":"ns=1;i=12581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12585","parentNodeId":"ns=1;i=5221","references":[{"referenceType":"HasProperty","target":"ns=1;i=12586"},{"referenceType":"HasProperty","target":"ns=1;i=12587"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5221"},{"referenceType":"HasProperty","target":"ns=1;i=12588"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12586","parentNodeId":"ns=1;i=12585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12587","parentNodeId":"ns=1;i=12585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12585"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12588","parentNodeId":"ns=1;i=12585","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12585"}],"typeDefinition":"i=68"},{"browseName":"1:PurgeValveOpen","description":[{"value":"This element serves a feedback about the open state of the purge valve."}],"displayName":[{"value":"PurgeValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5222","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11217"},{"referenceType":"HasComponent","target":"ns=1;i=12589"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12593"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11217","parentNodeId":"ns=1;i=5222","references":[{"referenceType":"HasProperty","target":"ns=1;i=11693"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5222"},{"referenceType":"HasProperty","target":"ns=1;i=11218"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11219"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11693","parentNodeId":"ns=1;i=11217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11217"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11218","parentNodeId":"ns=1;i=11217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11217"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11219","parentNodeId":"ns=1;i=11217","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11217"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12589","parentNodeId":"ns=1;i=5222","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12590"},{"referenceType":"HasProperty","target":"ns=1;i=12591"},{"referenceType":"HasProperty","target":"ns=1;i=12592"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5222"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12590","parentNodeId":"ns=1;i=12589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12591","parentNodeId":"ns=1;i=12589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12592","parentNodeId":"ns=1;i=12589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12593","parentNodeId":"ns=1;i=5222","references":[{"referenceType":"HasProperty","target":"ns=1;i=12594"},{"referenceType":"HasProperty","target":"ns=1;i=12595"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5222"},{"referenceType":"HasProperty","target":"ns=1;i=12596"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12594","parentNodeId":"ns=1;i=12593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12593"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12595","parentNodeId":"ns=1;i=12593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12593"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12596","parentNodeId":"ns=1;i=12593","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12593"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","description":[{"value":"This element serves a feedback that the pump rotation is at rated speed."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5223","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11220"},{"referenceType":"HasComponent","target":"ns=1;i=12597"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12601"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11220","parentNodeId":"ns=1;i=5223","references":[{"referenceType":"HasProperty","target":"ns=1;i=11694"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5223"},{"referenceType":"HasProperty","target":"ns=1;i=11221"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11222"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11694","parentNodeId":"ns=1;i=11220","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11220"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11221","parentNodeId":"ns=1;i=11220","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11220"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11222","parentNodeId":"ns=1;i=11220","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11220"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12597","parentNodeId":"ns=1;i=5223","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12598"},{"referenceType":"HasProperty","target":"ns=1;i=12599"},{"referenceType":"HasProperty","target":"ns=1;i=12600"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5223"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12598","parentNodeId":"ns=1;i=12597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12599","parentNodeId":"ns=1;i=12597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12600","parentNodeId":"ns=1;i=12597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12601","parentNodeId":"ns=1;i=5223","references":[{"referenceType":"HasProperty","target":"ns=1;i=12602"},{"referenceType":"HasProperty","target":"ns=1;i=12603"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5223"},{"referenceType":"HasProperty","target":"ns=1;i=12604"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12602","parentNodeId":"ns=1;i=12601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12603","parentNodeId":"ns=1;i=12601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12601"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12604","parentNodeId":"ns=1;i=12601","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12601"}],"typeDefinition":"i=68"},{"browseName":"1:StandBy","description":[{"value":"This element serves a feedback about the process standby of the pump. In the stand by state the pump is ready for operation."}],"displayName":[{"value":"StandBy"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5224","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11223"},{"referenceType":"HasComponent","target":"ns=1;i=12469"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12473"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11223","parentNodeId":"ns=1;i=5224","references":[{"referenceType":"HasProperty","target":"ns=1;i=11695"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5224"},{"referenceType":"HasProperty","target":"ns=1;i=11224"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11225"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11695","parentNodeId":"ns=1;i=11223","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11223"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11224","parentNodeId":"ns=1;i=11223","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11223"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11225","parentNodeId":"ns=1;i=11223","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11223"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12469","parentNodeId":"ns=1;i=5224","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12470"},{"referenceType":"HasProperty","target":"ns=1;i=12471"},{"referenceType":"HasProperty","target":"ns=1;i=12472"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5224"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12470","parentNodeId":"ns=1;i=12469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12471","parentNodeId":"ns=1;i=12469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12472","parentNodeId":"ns=1;i=12469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12473","parentNodeId":"ns=1;i=5224","references":[{"referenceType":"HasProperty","target":"ns=1;i=12474"},{"referenceType":"HasProperty","target":"ns=1;i=12475"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5224"},{"referenceType":"HasProperty","target":"ns=1;i=12476"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12474","parentNodeId":"ns=1;i=12473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12473"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12475","parentNodeId":"ns=1;i=12473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12473"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12476","parentNodeId":"ns=1;i=12473","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12473"}],"typeDefinition":"i=68"},{"browseName":"1:StandBySpeed","description":[{"value":"This element serves a feedback that the pump rotation is at standby speed."}],"displayName":[{"value":"StandBySpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5225","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11226"},{"referenceType":"HasComponent","target":"ns=1;i=12605"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"},{"referenceType":"HasComponent","target":"ns=1;i=12609"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11226","parentNodeId":"ns=1;i=5225","references":[{"referenceType":"HasProperty","target":"ns=1;i=11696"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5225"},{"referenceType":"HasProperty","target":"ns=1;i=11227"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11228"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11696","parentNodeId":"ns=1;i=11226","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11226"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11227","parentNodeId":"ns=1;i=11226","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11226"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11228","parentNodeId":"ns=1;i=11226","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11226"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12605","parentNodeId":"ns=1;i=5225","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12606"},{"referenceType":"HasProperty","target":"ns=1;i=12607"},{"referenceType":"HasProperty","target":"ns=1;i=12608"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5225"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12606","parentNodeId":"ns=1;i=12605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12605"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12607","parentNodeId":"ns=1;i=12605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12605"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12608","parentNodeId":"ns=1;i=12605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12605"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12609","parentNodeId":"ns=1;i=5225","references":[{"referenceType":"HasProperty","target":"ns=1;i=12610"},{"referenceType":"HasProperty","target":"ns=1;i=12611"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5225"},{"referenceType":"HasProperty","target":"ns=1;i=12612"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12610","parentNodeId":"ns=1;i=12609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12609"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12611","parentNodeId":"ns=1;i=12609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12609"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12612","parentNodeId":"ns=1;i=12609","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12609"}],"typeDefinition":"i=68"},{"browseName":"1:TargetSpeed","description":[{"value":"This element serves a feedback that the pump is at target speed."}],"displayName":[{"value":"TargetSpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5226","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11229"},{"referenceType":"HasComponent","target":"ns=1;i=12613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12617"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11229","parentNodeId":"ns=1;i=5226","references":[{"referenceType":"HasProperty","target":"ns=1;i=11697"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5226"},{"referenceType":"HasProperty","target":"ns=1;i=11230"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11231"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11697","parentNodeId":"ns=1;i=11229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11229"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11230","parentNodeId":"ns=1;i=11229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11229"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11231","parentNodeId":"ns=1;i=11229","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11229"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12613","parentNodeId":"ns=1;i=5226","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12614"},{"referenceType":"HasProperty","target":"ns=1;i=12615"},{"referenceType":"HasProperty","target":"ns=1;i=12616"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5226"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12614","parentNodeId":"ns=1;i=12613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12615","parentNodeId":"ns=1;i=12613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12616","parentNodeId":"ns=1;i=12613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12613"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12617","parentNodeId":"ns=1;i=5226","references":[{"referenceType":"HasProperty","target":"ns=1;i=12618"},{"referenceType":"HasProperty","target":"ns=1;i=12619"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5226"},{"referenceType":"HasProperty","target":"ns=1;i=12620"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12618","parentNodeId":"ns=1;i=12617","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12617"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12619","parentNodeId":"ns=1;i=12617","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12617"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12620","parentNodeId":"ns=1;i=12617","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12617"}],"typeDefinition":"i=68"},{"browseName":"1:VentValveOpen","description":[{"value":"This element serves a feedback about the open state of the vent valve."}],"displayName":[{"value":"VentValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5227","parentNodeId":"ns=1;i=5195","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=11232"},{"referenceType":"HasComponent","target":"ns=1;i=12621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12625"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5195"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11232","parentNodeId":"ns=1;i=5227","references":[{"referenceType":"HasProperty","target":"ns=1;i=11698"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5227"},{"referenceType":"HasProperty","target":"ns=1;i=11233"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11234"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11698","parentNodeId":"ns=1;i=11232","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11232"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11233","parentNodeId":"ns=1;i=11232","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11232"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11234","parentNodeId":"ns=1;i=11232","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11232"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12621","parentNodeId":"ns=1;i=5227","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12622"},{"referenceType":"HasProperty","target":"ns=1;i=12623"},{"referenceType":"HasProperty","target":"ns=1;i=12624"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5227"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12622","parentNodeId":"ns=1;i=12621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12623","parentNodeId":"ns=1;i=12621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12624","parentNodeId":"ns=1;i=12621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12625","parentNodeId":"ns=1;i=5227","references":[{"referenceType":"HasProperty","target":"ns=1;i=12626"},{"referenceType":"HasProperty","target":"ns=1;i=12627"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5227"},{"referenceType":"HasProperty","target":"ns=1;i=12628"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12626","parentNodeId":"ns=1;i=12625","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12625"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12627","parentNodeId":"ns=1;i=12625","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12625"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12628","parentNodeId":"ns=1;i=12625","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12625"}],"typeDefinition":"i=68"},{"browseName":"1:ThrottleValveActuation","description":[{"value":"Actuation parameters for a throttle valve of a pump."}],"displayName":[{"value":"ThrottleValveActuation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5194","parentNodeId":"ns=1;i=1053","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1025"},{"referenceType":"HasComponent","target":"ns=1;i=11235"},{"referenceType":"HasComponent","target":"ns=1;i=11238"},{"referenceType":"HasComponent","target":"ns=1;i=11239"},{"referenceType":"HasComponent","target":"ns=1;i=11241"},{"referenceType":"HasComponent","target":"ns=1;i=11242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11245"},{"referenceType":"HasComponent","target":"ns=1;i=11247"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1053"}],"typeDefinition":"ns=1;i=1025"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11235","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasProperty","target":"ns=1;i=11632"},{"referenceType":"HasProperty","target":"ns=1;i=11236"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11237"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11632","parentNodeId":"ns=1;i=11235","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11235"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11236","parentNodeId":"ns=1;i=11235","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11235"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11237","parentNodeId":"ns=1;i=11235","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11235"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11238","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11633"},{"referenceType":"HasProperty","target":"ns=1;i=11634"},{"referenceType":"HasProperty","target":"ns=1;i=11635"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11633","parentNodeId":"ns=1;i=11238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11634","parentNodeId":"ns=1;i=11238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11635","parentNodeId":"ns=1;i=11238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11239","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11636"},{"referenceType":"HasProperty","target":"ns=1;i=11240"},{"referenceType":"HasProperty","target":"ns=1;i=11637"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11636","parentNodeId":"ns=1;i=11239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11239"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11240","parentNodeId":"ns=1;i=11239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11239"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11637","parentNodeId":"ns=1;i=11239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11239"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11241","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11640"},{"referenceType":"HasProperty","target":"ns=1;i=11641"},{"referenceType":"HasProperty","target":"ns=1;i=11642"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11640","parentNodeId":"ns=1;i=11241","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11641","parentNodeId":"ns=1;i=11241","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11642","parentNodeId":"ns=1;i=11241","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11242","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasProperty","target":"ns=1;i=11630"},{"referenceType":"HasProperty","target":"ns=1;i=11243"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11244"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11630","parentNodeId":"ns=1;i=11242","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11243","parentNodeId":"ns=1;i=11242","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11242"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11244","parentNodeId":"ns=1;i=11242","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11242"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11245","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11638"},{"referenceType":"HasProperty","target":"ns=1;i=11246"},{"referenceType":"HasProperty","target":"ns=1;i=11639"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11638","parentNodeId":"ns=1;i=11245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11246","parentNodeId":"ns=1;i=11245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11245"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11639","parentNodeId":"ns=1;i=11245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11247","parentNodeId":"ns=1;i=5194","references":[{"referenceType":"HasProperty","target":"ns=1;i=11631"},{"referenceType":"HasProperty","target":"ns=1;i=11248"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5194"},{"referenceType":"HasProperty","target":"ns=1;i=11249"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11631","parentNodeId":"ns=1;i=11247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11248","parentNodeId":"ns=1;i=11247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11247"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11249","parentNodeId":"ns=1;i=11247","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11247"}],"typeDefinition":"i=68"},{"browseName":"1:OutletConnectionMeasurementsType","displayName":[{"value":"OutletConnectionMeasurementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.51","nodeClass":"ObjectType","nodeId":"ns=1;i=1049","references":[{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasComponent","target":"ns=1;i=9423"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=9428"}],"superType":"ns=3;i=1005"},{"browseName":"1:MeanVelocityAtOutlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump outlet connection divided by the outlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9423","parentNodeId":"ns=1;i=1049","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9425"},{"referenceType":"HasProperty","target":"ns=1;i=9427"},{"referenceType":"HasProperty","target":"ns=1;i=9426"},{"referenceType":"HasProperty","target":"ns=1;i=14959"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1049"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9425","parentNodeId":"ns=1;i=9423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9427","parentNodeId":"ns=1;i=9423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9426","parentNodeId":"ns=1;i=9423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14959","parentNodeId":"ns=1;i=9423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:OutletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the outlet area of the pump."}],"displayName":[{"value":"OutletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9428","parentNodeId":"ns=1;i=1049","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9430"},{"referenceType":"HasProperty","target":"ns=1;i=9432"},{"referenceType":"HasProperty","target":"ns=1;i=9431"},{"referenceType":"HasProperty","target":"ns=1;i=14968"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1049"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9430","parentNodeId":"ns=1;i=9428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9432","parentNodeId":"ns=1;i=9428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9431","parentNodeId":"ns=1;i=9428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14968","parentNodeId":"ns=1;i=9428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:OutletConnectionSystemRequirementsType","displayName":[{"value":"OutletConnectionSystemRequirementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.45","nodeClass":"ObjectType","nodeId":"ns=1;i=1044","references":[{"referenceType":"HasComponent","target":"ns=1;i=9381"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:BackingPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of a vacuum pump."}],"displayName":[{"value":"BackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9381","parentNodeId":"ns=1;i=1044","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1044"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9382"},{"referenceType":"HasProperty","target":"ns=1;i=9384"},{"referenceType":"HasProperty","target":"ns=1;i=9383"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9382","parentNodeId":"ns=1;i=9381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9384","parentNodeId":"ns=1;i=9381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9383","parentNodeId":"ns=1;i=9381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PortsGroupType","displayName":[{"value":"PortsGroupType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.35","nodeClass":"ObjectType","nodeId":"ns=1;i=1034","references":[{"referenceType":"HasComponent","target":"ns=1;i=5104"},{"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasComponent","target":"ns=1;i=5106"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"browseName":"1:\u003CDrive\u003E","description":[{"value":"Port for the connection of the drive."}],"displayName":[{"value":"\u003CDrive\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5104","parentNodeId":"ns=1;i=1034","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1034"},{"referenceType":"HasComponent","target":"ns=1;i=11195"},{"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasComponent","target":"ns=1;i=11196"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1038"},{"referenceType":"HasComponent","target":"ns=1;i=11197"},{"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasModellingRule","target":"i=11508"}],"symbolicName":"Drive","typeDefinition":"ns=1;i=1038"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11195","parentNodeId":"ns=1;i=5104","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5104"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11739"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11739","parentNodeId":"ns=1;i=11195","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11195"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the drive."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5189","parentNodeId":"ns=1;i=5104","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5104"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1043"},{"referenceType":"HasComponent","target":"ns=1;i=11104"},{"referenceType":"HasComponent","target":"ns=1;i=11106"},{"referenceType":"HasComponent","target":"ns=1;i=11111"},{"referenceType":"HasComponent","target":"ns=1;i=11115"},{"referenceType":"HasComponent","target":"ns=1;i=11119"},{"referenceType":"HasComponent","target":"ns=1;i=11123"},{"referenceType":"HasComponent","target":"ns=1;i=11129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11133"},{"referenceType":"HasComponent","target":"ns=1;i=11098"},{"referenceType":"HasComponent","target":"ns=1;i=11137"},{"referenceType":"HasComponent","target":"ns=1;i=11141"},{"referenceType":"HasComponent","target":"ns=1;i=11145"}],"typeDefinition":"ns=1;i=1043"},{"browseName":"1:EnergyEfficiencyClassOfMotor","dataType":"String","description":[{"value":"Characterization of the energy efficiency of electric motors according to international standards."}],"displayName":[{"value":"EnergyEfficiencyClassOfMotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11104","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11105"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11105","parentNodeId":"ns=1;i=11104","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11104"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaxNominalFrequency","dataType":"Double","description":[{"value":"A suitable, maximum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MaxNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11106","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11108"},{"referenceType":"HasProperty","target":"ns=1;i=11109"},{"referenceType":"HasProperty","target":"ns=1;i=11110"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11108","parentNodeId":"ns=1;i=11106","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11109","parentNodeId":"ns=1;i=11106","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11110","parentNodeId":"ns=1;i=11106","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinNominalFrequency","dataType":"Double","description":[{"value":"A suitable minimum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MinNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11111","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11112"},{"referenceType":"HasProperty","target":"ns=1;i=11113"},{"referenceType":"HasProperty","target":"ns=1;i=11114"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11112","parentNodeId":"ns=1;i=11111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11113","parentNodeId":"ns=1;i=11111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11114","parentNodeId":"ns=1;i=11111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Proportion of the motor power input P_mot delivered as pump power input P_mot, u."}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11115","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11116"},{"referenceType":"HasProperty","target":"ns=1;i=11117"},{"referenceType":"HasProperty","target":"ns=1;i=11118"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11116","parentNodeId":"ns=1;i=11115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11117","parentNodeId":"ns=1;i=11115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11118","parentNodeId":"ns=1;i=11115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalFrequency","dataType":"Double","description":[{"value":"Design of the object at a certain frequency, which is repeated regularly."}],"displayName":[{"value":"NominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11119","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11120"},{"referenceType":"HasProperty","target":"ns=1;i=11121"},{"referenceType":"HasProperty","target":"ns=1;i=11122"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11120","parentNodeId":"ns=1;i=11119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11121","parentNodeId":"ns=1;i=11119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11122","parentNodeId":"ns=1;i=11119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPowerConsumption","dataType":"Double","description":[{"value":"Indication of the rated power consumption in watts."}],"displayName":[{"value":"NominalPowerConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11123","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11124"},{"referenceType":"HasProperty","target":"ns=1;i=11125"},{"referenceType":"HasProperty","target":"ns=1;i=11126"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11124","parentNodeId":"ns=1;i=11123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11125","parentNodeId":"ns=1;i=11123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11126","parentNodeId":"ns=1;i=11123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalVoltage","dataType":"Double","description":[{"value":"Rated voltage is the value of the electrical voltage in normal operation specified by the manufacturer or supplier."}],"displayName":[{"value":"NominalVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11129","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11130"},{"referenceType":"HasProperty","target":"ns=1;i=11131"},{"referenceType":"HasProperty","target":"ns=1;i=11132"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11130","parentNodeId":"ns=1;i=11129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11131","parentNodeId":"ns=1;i=11129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11132","parentNodeId":"ns=1;i=11129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Ratio of the amount of active power to apparent power."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11133","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11134"},{"referenceType":"HasProperty","target":"ns=1;i=11135"},{"referenceType":"HasProperty","target":"ns=1;i=11136"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11134","parentNodeId":"ns=1;i=11133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11135","parentNodeId":"ns=1;i=11133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11136","parentNodeId":"ns=1;i=11133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProtectionClass","dataType":"String","description":[{"value":"Protection class of an enclosure, expressed as NEMA or IP rating."}],"displayName":[{"value":"ProtectionClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11098","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11103"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11103","parentNodeId":"ns=1;i=11098","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11098"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedCurrent","dataType":"Double","description":[{"value":"Appropriate (usually rounded) value of a current to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"RatedCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11137","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11138"},{"referenceType":"HasProperty","target":"ns=1;i=11139"},{"referenceType":"HasProperty","target":"ns=1;i=11140"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11138","parentNodeId":"ns=1;i=11137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11139","parentNodeId":"ns=1;i=11137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11140","parentNodeId":"ns=1;i=11137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Speed corresponding to the rated data of the motor used."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11141","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11142"},{"referenceType":"HasProperty","target":"ns=1;i=11143"},{"referenceType":"HasProperty","target":"ns=1;i=11144"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11142","parentNodeId":"ns=1;i=11141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11143","parentNodeId":"ns=1;i=11141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11144","parentNodeId":"ns=1;i=11141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TorqueAtNominalSpeedOfDrive","dataType":"Double","description":[{"value":"The torque transmittable by the equipment."}],"displayName":[{"value":"TorqueAtNominalSpeedOfDrive"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11145","parentNodeId":"ns=1;i=5189","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11146"},{"referenceType":"HasProperty","target":"ns=1;i=11147"},{"referenceType":"HasProperty","target":"ns=1;i=11148"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5189"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11146","parentNodeId":"ns=1;i=11145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11147","parentNodeId":"ns=1;i=11145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11148","parentNodeId":"ns=1;i=11145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11196","parentNodeId":"ns=1;i=5104","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11738"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5104"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11738","parentNodeId":"ns=1;i=11196","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11196"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11197","parentNodeId":"ns=1;i=5104","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11740"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5104"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11740","parentNodeId":"ns=1;i=11197","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11197"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All operation measurements that describe the drive."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5172","parentNodeId":"ns=1;i=5104","references":[{"referenceType":"HasComponent","target":"ns=1;i=10972"},{"referenceType":"HasComponent","target":"ns=1;i=10974"},{"referenceType":"HasComponent","target":"ns=1;i=10976"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1051"},{"referenceType":"HasComponent","target":"ns=1;i=10978"},{"referenceType":"HasComponent","target":"ns=1;i=10980"},{"referenceType":"HasComponent","target":"ns=1;i=10982"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5104"},{"referenceType":"HasComponent","target":"ns=1;i=10984"},{"referenceType":"HasComponent","target":"ns=1;i=10986"},{"referenceType":"HasComponent","target":"ns=1;i=10988"},{"referenceType":"HasComponent","target":"ns=1;i=10990"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10992"},{"referenceType":"HasComponent","target":"ns=1;i=10994"},{"referenceType":"HasComponent","target":"ns=1;i=10996"}],"typeDefinition":"ns=1;i=1051"},{"browseName":"1:Current","dataType":"Double","description":[{"value":"Measured consumed mains current of the whole unit of the motor."}],"displayName":[{"value":"Current"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10972","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasProperty","target":"ns=1;i=11699"},{"referenceType":"HasProperty","target":"ns=1;i=11700"},{"referenceType":"HasProperty","target":"ns=1;i=11701"},{"referenceType":"HasProperty","target":"ns=1;i=14882"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11699","parentNodeId":"ns=1;i=10972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11700","parentNodeId":"ns=1;i=10972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11701","parentNodeId":"ns=1;i=10972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14882","parentNodeId":"ns=1;i=10972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkCurrent","dataType":"Double","description":[{"value":"Measured actual electrical dc current of the converter."}],"displayName":[{"value":"DCLinkCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10974","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasProperty","target":"ns=1;i=11702"},{"referenceType":"HasProperty","target":"ns=1;i=11703"},{"referenceType":"HasProperty","target":"ns=1;i=11704"},{"referenceType":"HasProperty","target":"ns=1;i=14886"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11702","parentNodeId":"ns=1;i=10974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11703","parentNodeId":"ns=1;i=10974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11704","parentNodeId":"ns=1;i=10974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14886","parentNodeId":"ns=1;i=10974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkVoltage","dataType":"Double","description":[{"value":"Measured actual electrical dc voltage of the converter."}],"displayName":[{"value":"DCLinkVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10976","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasProperty","target":"ns=1;i=11705"},{"referenceType":"HasProperty","target":"ns=1;i=11706"},{"referenceType":"HasProperty","target":"ns=1;i=11707"},{"referenceType":"HasProperty","target":"ns=1;i=14890"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11705","parentNodeId":"ns=1;i=10976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11706","parentNodeId":"ns=1;i=10976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11707","parentNodeId":"ns=1;i=10976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14890","parentNodeId":"ns=1;i=10976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:DriverPowerInput","dataType":"Double","description":[{"value":"Measured power absorbed by the motor."}],"displayName":[{"value":"DriverPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10978","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11708"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasProperty","target":"ns=1;i=11709"},{"referenceType":"HasProperty","target":"ns=1;i=11710"},{"referenceType":"HasProperty","target":"ns=1;i=14894"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11708","parentNodeId":"ns=1;i=10978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11709","parentNodeId":"ns=1;i=10978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11710","parentNodeId":"ns=1;i=10978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14894","parentNodeId":"ns=1;i=10978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:EnergyConsumption","dataType":"Double","description":[{"value":"Measured energy consumption of the unit of the motor."}],"displayName":[{"value":"EnergyConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10980","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11711"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasProperty","target":"ns=1;i=11712"},{"referenceType":"HasProperty","target":"ns=1;i=11713"},{"referenceType":"HasProperty","target":"ns=1;i=14898"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11711","parentNodeId":"ns=1;i=10980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11712","parentNodeId":"ns=1;i=10980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11713","parentNodeId":"ns=1;i=10980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14898","parentNodeId":"ns=1;i=10980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:Frequency","dataType":"Double","description":[{"value":"Measured output frequency of the frequency converter."}],"displayName":[{"value":"Frequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10982","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11714"},{"referenceType":"HasProperty","target":"ns=1;i=11715"},{"referenceType":"HasProperty","target":"ns=1;i=11716"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasProperty","target":"ns=1;i=14902"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11714","parentNodeId":"ns=1;i=10982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11715","parentNodeId":"ns=1;i=10982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11716","parentNodeId":"ns=1;i=10982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14902","parentNodeId":"ns=1;i=10982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:MotorCurrent","dataType":"Double","description":[{"value":"Measured actual motor current."}],"displayName":[{"value":"MotorCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10984","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11717"},{"referenceType":"HasProperty","target":"ns=1;i=11718"},{"referenceType":"HasProperty","target":"ns=1;i=11719"},{"referenceType":"HasProperty","target":"ns=1;i=14906"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11717","parentNodeId":"ns=1;i=10984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11718","parentNodeId":"ns=1;i=10984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11719","parentNodeId":"ns=1;i=10984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14906","parentNodeId":"ns=1;i=10984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the motor power input P_mot delivered as pump power input P_mot, u"}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10986","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11720"},{"referenceType":"HasProperty","target":"ns=1;i=11721"},{"referenceType":"HasProperty","target":"ns=1;i=11722"},{"referenceType":"HasProperty","target":"ns=1;i=14910"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11720","parentNodeId":"ns=1;i=10986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11721","parentNodeId":"ns=1;i=10986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11722","parentNodeId":"ns=1;i=10986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14910","parentNodeId":"ns=1;i=10986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MotorTemperature","dataType":"Double","description":[{"value":"Measured temperature of the motor."}],"displayName":[{"value":"MotorTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10988","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11723"},{"referenceType":"HasProperty","target":"ns=1;i=11724"},{"referenceType":"HasProperty","target":"ns=1;i=11725"},{"referenceType":"HasProperty","target":"ns=1;i=14914"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11723","parentNodeId":"ns=1;i=10988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11724","parentNodeId":"ns=1;i=10988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11725","parentNodeId":"ns=1;i=10988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14914","parentNodeId":"ns=1;i=10988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MotorVoltage","dataType":"Double","description":[{"value":"Measured actual motor voltage."}],"displayName":[{"value":"MotorVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10990","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11726"},{"referenceType":"HasProperty","target":"ns=1;i=11727"},{"referenceType":"HasProperty","target":"ns=1;i=11728"},{"referenceType":"HasProperty","target":"ns=1;i=14918"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11726","parentNodeId":"ns=1;i=10990","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10990"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11727","parentNodeId":"ns=1;i=10990","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10990"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11728","parentNodeId":"ns=1;i=10990","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10990"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14918","parentNodeId":"ns=1;i=10990","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10990"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Determined power factor of the motor."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10992","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11729"},{"referenceType":"HasProperty","target":"ns=1;i=11730"},{"referenceType":"HasProperty","target":"ns=1;i=11731"},{"referenceType":"HasProperty","target":"ns=1;i=14923"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11729","parentNodeId":"ns=1;i=10992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11730","parentNodeId":"ns=1;i=10992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11731","parentNodeId":"ns=1;i=10992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14923","parentNodeId":"ns=1;i=10992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:Torque","dataType":"Double","description":[{"value":"Measured torque of the motor."}],"displayName":[{"value":"Torque"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10994","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11732"},{"referenceType":"HasProperty","target":"ns=1;i=11733"},{"referenceType":"HasProperty","target":"ns=1;i=11734"},{"referenceType":"HasProperty","target":"ns=1;i=14931"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11732","parentNodeId":"ns=1;i=10994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11733","parentNodeId":"ns=1;i=10994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20053\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u00B7m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11734","parentNodeId":"ns=1;i=10994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity described by the vector product M=r * F where r is position vector with respect to the axis of rotation and F is force"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14931","parentNodeId":"ns=1;i=10994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emoment of force\u003C/uax:String\u003E"},{"browseName":"1:Voltage","dataType":"Double","description":[{"value":"Measured actual mains voltage of the motor."}],"displayName":[{"value":"Voltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10996","parentNodeId":"ns=1;i=5172","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11735"},{"referenceType":"HasProperty","target":"ns=1;i=11736"},{"referenceType":"HasProperty","target":"ns=1;i=11737"},{"referenceType":"HasProperty","target":"ns=1;i=14939"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5172"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11735","parentNodeId":"ns=1;i=10996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11736","parentNodeId":"ns=1;i=10996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11737","parentNodeId":"ns=1;i=10996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14939","parentNodeId":"ns=1;i=10996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:\u003CInletConnection\u003E","description":[{"value":"Port for the inlet connection."}],"displayName":[{"value":"\u003CInletConnection\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5105","parentNodeId":"ns=1;i=1034","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1034"},{"referenceType":"HasComponent","target":"ns=1;i=10998"},{"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasComponent","target":"ns=1;i=10999"},{"referenceType":"HasComponent","target":"ns=1;i=11000"},{"referenceType":"HasComponent","target":"ns=1;i=5174"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1036"},{"referenceType":"HasComponent","target":"ns=1;i=5175"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=5176"}],"symbolicName":"InletConnection","typeDefinition":"ns=1;i=1036"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10998","parentNodeId":"ns=1;i=5105","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11023"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11023","parentNodeId":"ns=1;i=10998","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10998"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the inlet connection."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5173","parentNodeId":"ns=1;i=5105","references":[{"referenceType":"HasComponent","target":"ns=1;i=11029"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasComponent","target":"ns=1;i=11030"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1041"},{"referenceType":"HasComponent","target":"ns=1;i=11031"},{"referenceType":"HasComponent","target":"ns=1;i=11032"},{"referenceType":"HasComponent","target":"ns=1;i=11033"},{"referenceType":"HasComponent","target":"ns=1;i=11034"},{"referenceType":"HasComponent","target":"ns=1;i=11035"},{"referenceType":"HasComponent","target":"ns=1;i=11036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11037"}],"typeDefinition":"ns=1;i=1041"},{"browseName":"1:CriticalBackingPressure","dataType":"Double","description":[{"value":"Maximum backing pressure for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump."}],"displayName":[{"value":"CriticalBackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11029","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasProperty","target":"ns=1;i=11741"},{"referenceType":"HasProperty","target":"ns=1;i=11742"},{"referenceType":"HasProperty","target":"ns=1;i=11743"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11741","parentNodeId":"ns=1;i=11029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11742","parentNodeId":"ns=1;i=11029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11743","parentNodeId":"ns=1;i=11029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the entry opening in the inlet connection of the pump."}],"displayName":[{"value":"InletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11030","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11744"},{"referenceType":"HasProperty","target":"ns=1;i=11745"},{"referenceType":"HasProperty","target":"ns=1;i=11746"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11744","parentNodeId":"ns=1;i=11030","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11030"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11745","parentNodeId":"ns=1;i=11030","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11030"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11746","parentNodeId":"ns=1;i=11030","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11030"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumAllowableInletPressure","dataType":"Double","description":[{"value":"Highest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11031","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11747"},{"referenceType":"HasProperty","target":"ns=1;i=11748"},{"referenceType":"HasProperty","target":"ns=1;i=11749"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11747","parentNodeId":"ns=1;i=11031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11748","parentNodeId":"ns=1;i=11031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11749","parentNodeId":"ns=1;i=11031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumTolerableWaterVaporInletPressure","dataType":"Double","description":[{"value":"The highest water vapor inlet pressure at which a gas ballast pump, under normal ambient conditions, can pump and exhaust pure water vapor in continuous Operation."}],"displayName":[{"value":"MaximumTolerableWaterVaporInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11032","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11750"},{"referenceType":"HasProperty","target":"ns=1;i=11751"},{"referenceType":"HasProperty","target":"ns=1;i=11752"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11750","parentNodeId":"ns=1;i=11032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11751","parentNodeId":"ns=1;i=11032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11752","parentNodeId":"ns=1;i=11032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumWorkingPressure","dataType":"Double","description":[{"value":"instantaneous inlet pressure with adequate margin above the minimum liquid vapor pressure expected."}],"displayName":[{"value":"MaximumWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11033","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11753"},{"referenceType":"HasProperty","target":"ns=1;i=11754"},{"referenceType":"HasProperty","target":"ns=1;i=11755"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11753","parentNodeId":"ns=1;i=11033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11754","parentNodeId":"ns=1;i=11033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11755","parentNodeId":"ns=1;i=11033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableInletPressure","dataType":"Double","description":[{"value":"Lowest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11034","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11756"},{"referenceType":"HasProperty","target":"ns=1;i=11757"},{"referenceType":"HasProperty","target":"ns=1;i=11758"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11756","parentNodeId":"ns=1;i=11034","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11034"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11757","parentNodeId":"ns=1;i=11034","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11034"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11758","parentNodeId":"ns=1;i=11034","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11034"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NetPositiveInletPressureRequired","dataType":"Double","description":[{"value":"Total inlet pressure required to ensure there is enough margin to maintain the minimum."}],"displayName":[{"value":"NetPositiveInletPressureRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11035","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11759"},{"referenceType":"HasProperty","target":"ns=1;i=11760"},{"referenceType":"HasProperty","target":"ns=1;i=11761"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11759","parentNodeId":"ns=1;i=11035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11035"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11760","parentNodeId":"ns=1;i=11035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11035"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11761","parentNodeId":"ns=1;i=11035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11035"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11036","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11762"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11762","parentNodeId":"ns=1;i=11036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:WaterVaporCapacity","dataType":"Double","description":[{"value":"Mass of water which can be conveyed by the pump without condensation per time."}],"displayName":[{"value":"WaterVaporCapacity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11037","parentNodeId":"ns=1;i=5173","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11763"},{"referenceType":"HasProperty","target":"ns=1;i=11764"},{"referenceType":"HasProperty","target":"ns=1;i=11765"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5173"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11763","parentNodeId":"ns=1;i=11037","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11037"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11764","parentNodeId":"ns=1;i=11037","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11037"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4600375\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eg/h\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Egram per hour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11765","parentNodeId":"ns=1;i=11037","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11037"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10999","parentNodeId":"ns=1;i=5105","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11024"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11024","parentNodeId":"ns=1;i=10999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11000","parentNodeId":"ns=1;i=5105","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11025"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11025","parentNodeId":"ns=1;i=11000","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11000"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Implementation","description":[{"value":"Properties that describe the specific installation and operational situation of the inlet connection."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5174","parentNodeId":"ns=1;i=5105","references":[{"referenceType":"HasComponent","target":"ns=1;i=11047"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1047"},{"referenceType":"HasComponent","target":"ns=1;i=11048"},{"referenceType":"HasComponent","target":"ns=1;i=11049"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11050"},{"referenceType":"HasComponent","target":"ns=1;i=11051"}],"typeDefinition":"ns=1;i=1047"},{"accessLevel":3,"browseName":"1:HeightOfTheInletConnection","dataType":"Double","description":[{"value":"Height of the center of the inlet connection of the pump"}],"displayName":[{"value":"HeightOfTheInletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11047","parentNodeId":"ns=1;i=5174","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11766"},{"referenceType":"HasProperty","target":"ns=1;i=11767"},{"referenceType":"HasProperty","target":"ns=1;i=11768"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5174"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11766","parentNodeId":"ns=1;i=11047","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11047"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11767","parentNodeId":"ns=1;i=11047","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11047"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11768","parentNodeId":"ns=1;i=11047","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11047"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtInlet","dataType":"Double","description":[{"value":"Rated flow at pump inlet connection divided by the inlet area of the pump"}],"displayName":[{"value":"MeanRatedVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11048","parentNodeId":"ns=1;i=5174","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11769"},{"referenceType":"HasProperty","target":"ns=1;i=11770"},{"referenceType":"HasProperty","target":"ns=1;i=11771"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5174"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11769","parentNodeId":"ns=1;i=11048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11770","parentNodeId":"ns=1;i=11048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11771","parentNodeId":"ns=1;i=11048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11049","parentNodeId":"ns=1;i=5174","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11772"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5174"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11772","parentNodeId":"ns=1;i=11049","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11049"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressure","dataType":"Double","description":[{"value":"Inlet pressure of the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11050","parentNodeId":"ns=1;i=5174","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11773"},{"referenceType":"HasProperty","target":"ns=1;i=11774"},{"referenceType":"HasProperty","target":"ns=1;i=11775"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5174"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11773","parentNodeId":"ns=1;i=11050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11774","parentNodeId":"ns=1;i=11050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11775","parentNodeId":"ns=1;i=11050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at inlet area of the pump, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11051","parentNodeId":"ns=1;i=5174","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11776"},{"referenceType":"HasProperty","target":"ns=1;i=11777"},{"referenceType":"HasProperty","target":"ns=1;i=11778"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5174"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11776","parentNodeId":"ns=1;i=11051","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11777","parentNodeId":"ns=1;i=11051","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11778","parentNodeId":"ns=1;i=11051","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All measurements of the operation which describe the inlet connection."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5175","parentNodeId":"ns=1;i=5105","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1050"},{"referenceType":"HasComponent","target":"ns=1;i=11057"},{"referenceType":"HasComponent","target":"ns=1;i=11059"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"ns=1;i=1050"},{"browseName":"1:InletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the inlet area of the pump."}],"displayName":[{"value":"InletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11057","parentNodeId":"ns=1;i=5175","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11779"},{"referenceType":"HasProperty","target":"ns=1;i=11780"},{"referenceType":"HasProperty","target":"ns=1;i=11781"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5175"},{"referenceType":"HasProperty","target":"ns=1;i=14947"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11779","parentNodeId":"ns=1;i=11057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11780","parentNodeId":"ns=1;i=11057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11781","parentNodeId":"ns=1;i=11057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14947","parentNodeId":"ns=1;i=11057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtInlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump inlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11059","parentNodeId":"ns=1;i=5175","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11782"},{"referenceType":"HasProperty","target":"ns=1;i=11783"},{"referenceType":"HasProperty","target":"ns=1;i=11784"},{"referenceType":"HasProperty","target":"ns=1;i=14955"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5175"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11782","parentNodeId":"ns=1;i=11059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11783","parentNodeId":"ns=1;i=11059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11784","parentNodeId":"ns=1;i=11059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14955","parentNodeId":"ns=1;i=11059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:SystemRequirements","description":[{"value":"Buyer\u0027s properties that describe the installation situation of the inlet port."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5176","parentNodeId":"ns=1;i=5105","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1045"},{"referenceType":"HasComponent","target":"ns=1;i=11065"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5105"}],"typeDefinition":"ns=1;i=1045"},{"accessLevel":3,"browseName":"1:InletPressure","dataType":"Double","description":[{"value":"Pressure at the inlet of the pump, measured at a defined location in the test dome."}],"displayName":[{"value":"InletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11065","parentNodeId":"ns=1;i=5176","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11785"},{"referenceType":"HasProperty","target":"ns=1;i=11786"},{"referenceType":"HasProperty","target":"ns=1;i=11787"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5176"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11785","parentNodeId":"ns=1;i=11065","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11065"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11786","parentNodeId":"ns=1;i=11065","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11065"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11787","parentNodeId":"ns=1;i=11065","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11065"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:\u003COutletConnection\u003E","description":[{"value":"Port for the outlet connection."}],"displayName":[{"value":"\u003COutletConnection\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5106","parentNodeId":"ns=1;i=1034","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1034"},{"referenceType":"HasComponent","target":"ns=1;i=11067"},{"referenceType":"HasComponent","target":"ns=1;i=5181"},{"referenceType":"HasComponent","target":"ns=1;i=11068"},{"referenceType":"HasComponent","target":"ns=1;i=11069"},{"referenceType":"HasComponent","target":"ns=1;i=5182"},{"referenceType":"HasComponent","target":"ns=1;i=5183"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1037"},{"referenceType":"HasComponent","target":"ns=1;i=5184"}],"symbolicName":"OutletConnection","typeDefinition":"ns=1;i=1037"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11067","parentNodeId":"ns=1;i=5106","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11833"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11833","parentNodeId":"ns=1;i=11067","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11067"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the outlet connection."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5181","parentNodeId":"ns=1;i=5106","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"},{"referenceType":"HasComponent","target":"ns=1;i=11073"},{"referenceType":"HasComponent","target":"ns=1;i=11074"},{"referenceType":"HasComponent","target":"ns=1;i=11075"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11076"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1042"},{"referenceType":"HasComponent","target":"ns=1;i=11077"},{"referenceType":"HasComponent","target":"ns=1;i=11078"},{"referenceType":"HasComponent","target":"ns=1;i=11079"},{"referenceType":"HasComponent","target":"ns=1;i=11080"}],"typeDefinition":"ns=1;i=1042"},{"browseName":"1:MaximumAllowableOutletPressure","dataType":"Double","description":[{"value":"Highest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11073","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11788"},{"referenceType":"HasProperty","target":"ns=1;i=11789"},{"referenceType":"HasProperty","target":"ns=1;i=11790"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11788","parentNodeId":"ns=1;i=11073","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11073"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11789","parentNodeId":"ns=1;i=11073","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11073"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11790","parentNodeId":"ns=1;i=11073","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11073"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableOutetPressure","dataType":"Double","description":[{"value":"Lowest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableOutetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11074","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11791"},{"referenceType":"HasProperty","target":"ns=1;i=11792"},{"referenceType":"HasProperty","target":"ns=1;i=11793"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11791","parentNodeId":"ns=1;i=11074","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11074"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11792","parentNodeId":"ns=1;i=11074","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11074"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11793","parentNodeId":"ns=1;i=11074","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11074"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11075","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11794"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11794","parentNodeId":"ns=1;i=11075","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11075"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the orifice in the outlet connection of the pump."}],"displayName":[{"value":"OutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11076","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11795"},{"referenceType":"HasProperty","target":"ns=1;i=11796"},{"referenceType":"HasProperty","target":"ns=1;i=11797"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11795","parentNodeId":"ns=1;i=11076","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11796","parentNodeId":"ns=1;i=11076","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11797","parentNodeId":"ns=1;i=11076","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveAccumulationPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will pass the total pump flow."}],"displayName":[{"value":"ReliefValveAccumulationPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11077","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11798"},{"referenceType":"HasProperty","target":"ns=1;i=11799"},{"referenceType":"HasProperty","target":"ns=1;i=11800"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11798","parentNodeId":"ns=1;i=11077","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11799","parentNodeId":"ns=1;i=11077","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11800","parentNodeId":"ns=1;i=11077","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11077"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveBackPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of the relief valve when the valve is closed."}],"displayName":[{"value":"ReliefValveBackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11078","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11801"},{"referenceType":"HasProperty","target":"ns=1;i=11802"},{"referenceType":"HasProperty","target":"ns=1;i=11803"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11801","parentNodeId":"ns=1;i=11078","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11078"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11802","parentNodeId":"ns=1;i=11078","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11078"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11803","parentNodeId":"ns=1;i=11078","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11078"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveReseatPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will close after passing the total pump flow."}],"displayName":[{"value":"ReliefValveReseatPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11079","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11804"},{"referenceType":"HasProperty","target":"ns=1;i=11805"},{"referenceType":"HasProperty","target":"ns=1;i=11806"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11804","parentNodeId":"ns=1;i=11079","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11079"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11805","parentNodeId":"ns=1;i=11079","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11079"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11806","parentNodeId":"ns=1;i=11079","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11079"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveSetPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve begins to open."}],"displayName":[{"value":"ReliefValveSetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11080","parentNodeId":"ns=1;i=5181","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11807"},{"referenceType":"HasProperty","target":"ns=1;i=11808"},{"referenceType":"HasProperty","target":"ns=1;i=11809"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5181"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11807","parentNodeId":"ns=1;i=11080","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11080"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11808","parentNodeId":"ns=1;i=11080","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11080"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11809","parentNodeId":"ns=1;i=11080","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11080"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11068","parentNodeId":"ns=1;i=5106","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11832"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11832","parentNodeId":"ns=1;i=11068","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11068"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11069","parentNodeId":"ns=1;i=5106","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11834"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11834","parentNodeId":"ns=1;i=11069","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11069"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Implementation","description":[{"value":"Properties that describe the specific installation and operational situation of the outlet connection."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5182","parentNodeId":"ns=1;i=5106","references":[{"referenceType":"HasComponent","target":"ns=1;i=11089"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"},{"referenceType":"HasComponent","target":"ns=1;i=11090"},{"referenceType":"HasComponent","target":"ns=1;i=11091"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1048"},{"referenceType":"HasComponent","target":"ns=1;i=11092"},{"referenceType":"HasComponent","target":"ns=1;i=11093"}],"typeDefinition":"ns=1;i=1048"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletConnection","dataType":"Double","description":[{"value":"Height of the center of the outlet connection of the pump."}],"displayName":[{"value":"HeightOfTheOutletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11089","parentNodeId":"ns=1;i=5182","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11810"},{"referenceType":"HasProperty","target":"ns=1;i=11811"},{"referenceType":"HasProperty","target":"ns=1;i=11812"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5182"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11810","parentNodeId":"ns=1;i=11089","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11089"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11811","parentNodeId":"ns=1;i=11089","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11089"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11812","parentNodeId":"ns=1;i=11089","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11089"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtOutlet","dataType":"Double","description":[{"value":"Rated flow at pump outlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanRatedVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11090","parentNodeId":"ns=1;i=5182","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11813"},{"referenceType":"HasProperty","target":"ns=1;i=11814"},{"referenceType":"HasProperty","target":"ns=1;i=11815"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5182"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11813","parentNodeId":"ns=1;i=11090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11814","parentNodeId":"ns=1;i=11090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11815","parentNodeId":"ns=1;i=11090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11091","parentNodeId":"ns=1;i=5182","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11816"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5182"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11816","parentNodeId":"ns=1;i=11091","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11091"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedOutletPressure","dataType":"Double","description":[{"value":"Outlet pressure of the pump at the guarantee point with rated flow and rated speed, as well as rated inlet pressure, for rotodynamic pumps only."}],"displayName":[{"value":"RatedOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11092","parentNodeId":"ns=1;i=5182","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11817"},{"referenceType":"HasProperty","target":"ns=1;i=11818"},{"referenceType":"HasProperty","target":"ns=1;i=11819"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5182"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11817","parentNodeId":"ns=1;i=11092","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11092"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11818","parentNodeId":"ns=1;i=11092","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11092"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11819","parentNodeId":"ns=1;i=11092","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11092"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at outlet area of the pump, corresponding to the sum of the height, pressure head and velocity head."}],"displayName":[{"value":"TotalHeadAtOutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11093","parentNodeId":"ns=1;i=5182","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11820"},{"referenceType":"HasProperty","target":"ns=1;i=11821"},{"referenceType":"HasProperty","target":"ns=1;i=11822"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5182"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11820","parentNodeId":"ns=1;i=11093","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11093"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11821","parentNodeId":"ns=1;i=11093","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11093"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11822","parentNodeId":"ns=1;i=11093","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11093"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All measurements of the operation which describe the outlet connection."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5183","parentNodeId":"ns=1;i=5106","references":[{"referenceType":"HasComponent","target":"ns=1;i=11099"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1049"},{"referenceType":"HasComponent","target":"ns=1;i=11101"}],"typeDefinition":"ns=1;i=1049"},{"browseName":"1:MeanVelocityAtOutlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump outlet connection divided by the outlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11099","parentNodeId":"ns=1;i=5183","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11823"},{"referenceType":"HasProperty","target":"ns=1;i=11824"},{"referenceType":"HasProperty","target":"ns=1;i=11825"},{"referenceType":"HasProperty","target":"ns=1;i=14963"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5183"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11823","parentNodeId":"ns=1;i=11099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11824","parentNodeId":"ns=1;i=11099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11825","parentNodeId":"ns=1;i=11099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14963","parentNodeId":"ns=1;i=11099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:OutletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the outlet area of the pump."}],"displayName":[{"value":"OutletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11101","parentNodeId":"ns=1;i=5183","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11826"},{"referenceType":"HasProperty","target":"ns=1;i=11827"},{"referenceType":"HasProperty","target":"ns=1;i=11828"},{"referenceType":"HasProperty","target":"ns=1;i=14972"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5183"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11826","parentNodeId":"ns=1;i=11101","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11101"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11827","parentNodeId":"ns=1;i=11101","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11101"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11828","parentNodeId":"ns=1;i=11101","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11101"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14972","parentNodeId":"ns=1;i=11101","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11101"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:SystemRequirements","description":[{"value":"Buyer\u0027s properties that describe the installation situation of the outlet port."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5184","parentNodeId":"ns=1;i=5106","references":[{"referenceType":"HasComponent","target":"ns=1;i=11107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1044"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5106"}],"typeDefinition":"ns=1;i=1044"},{"accessLevel":3,"browseName":"1:BackingPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of a vacuum pump."}],"displayName":[{"value":"BackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11107","parentNodeId":"ns=1;i=5184","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5184"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11829"},{"referenceType":"HasProperty","target":"ns=1;i=11830"},{"referenceType":"HasProperty","target":"ns=1;i=11831"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11829","parentNodeId":"ns=1;i=11107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11830","parentNodeId":"ns=1;i=11107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11831","parentNodeId":"ns=1;i=11107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PreventiveMaintenanceType","displayName":[{"value":"PreventiveMaintenanceType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.9","nodeClass":"ObjectType","nodeId":"ns=1;i=1009","references":[{"referenceType":"HasComponent","target":"ns=1;i=6540"},{"referenceType":"HasComponent","target":"ns=1;i=6548"},{"referenceType":"HasComponent","target":"ns=1;i=6550"},{"referenceType":"HasComponent","target":"ns=1;i=6551"},{"referenceType":"HasComponent","target":"ns=1;i=6552"},{"referenceType":"HasComponent","target":"ns=1;i=6553"},{"referenceType":"HasComponent","target":"ns=1;i=6544"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:ActivePreventiveMaintenanceTime","dataType":"Double","description":[{"value":"This attribute indicates the date of installation or commissioning of the device."}],"displayName":[{"value":"ActivePreventiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6540","parentNodeId":"ns=1;i=1009","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6541"},{"referenceType":"HasProperty","target":"ns=1;i=6543"},{"referenceType":"HasProperty","target":"ns=1;i=6542"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6541","parentNodeId":"ns=1;i=6540","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6540"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6543","parentNodeId":"ns=1;i=6540","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6540"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6542","parentNodeId":"ns=1;i=6540","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6540"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:InstallationDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device was last inspected."}],"displayName":[{"value":"InstallationDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6548","parentNodeId":"ns=1;i=1009","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6549"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6549","parentNodeId":"ns=1;i=6548","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6548"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:LastInspectionDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device is scheduled for the next inspection."}],"displayName":[{"value":"LastInspectionDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6550","parentNodeId":"ns=1;i=1009","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6554"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6554","parentNodeId":"ns=1;i=6550","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6550"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:LastServicingDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device is scheduled for the next servicing."}],"displayName":[{"value":"LastServicingDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6551","parentNodeId":"ns=1;i=1009","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6555"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6555","parentNodeId":"ns=1;i=6551","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6551"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NextInspectionDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device was last serviced."}],"displayName":[{"value":"NextInspectionDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6552","parentNodeId":"ns=1;i=1009","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6556"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6556","parentNodeId":"ns=1;i=6552","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6552"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NextServicingDate","dataType":"DateTime","description":[{"value":"Part of maintenance time when preventive maintenance is carried out on an item, including technical, logistic and internal administrative delays"}],"displayName":[{"value":"NextServicingDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6553","parentNodeId":"ns=1;i=1009","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=6557"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6557","parentNodeId":"ns=1;i=6553","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6553"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PreventiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the active maintenance time taken to perform a preventive maintenance"}],"displayName":[{"value":"PreventiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6544","parentNodeId":"ns=1;i=1009","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=6545"},{"referenceType":"HasProperty","target":"ns=1;i=6547"},{"referenceType":"HasProperty","target":"ns=1;i=6546"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1009"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6545","parentNodeId":"ns=1;i=6544","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6544"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6547","parentNodeId":"ns=1;i=6544","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6544"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6546","parentNodeId":"ns=1;i=6544","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6544"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SignalsType","displayName":[{"value":"SignalsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.31","nodeClass":"ObjectType","nodeId":"ns=1;i=1033","references":[{"referenceType":"HasComponent","target":"ns=1;i=5084"},{"referenceType":"HasComponent","target":"ns=1;i=5085"},{"referenceType":"HasComponent","target":"ns=1;i=5103"},{"referenceType":"HasComponent","target":"ns=1;i=5086"},{"referenceType":"HasComponent","target":"ns=1;i=5087"},{"referenceType":"HasComponent","target":"ns=1;i=5088"},{"referenceType":"HasComponent","target":"ns=1;i=5089"},{"referenceType":"HasComponent","target":"ns=1;i=5090"},{"referenceType":"HasComponent","target":"ns=1;i=5091"},{"referenceType":"HasComponent","target":"ns=1;i=5092"},{"referenceType":"HasComponent","target":"ns=1;i=5093"},{"referenceType":"HasComponent","target":"ns=1;i=5094"},{"referenceType":"HasComponent","target":"ns=1;i=5095"},{"referenceType":"HasComponent","target":"ns=1;i=5096"},{"referenceType":"HasComponent","target":"ns=1;i=5097"},{"referenceType":"HasComponent","target":"ns=1;i=5098"},{"referenceType":"HasComponent","target":"ns=1;i=5099"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=5083"},{"referenceType":"HasComponent","target":"ns=1;i=5100"},{"referenceType":"HasComponent","target":"ns=1;i=5101"},{"referenceType":"HasComponent","target":"ns=1;i=5102"}],"superType":"ns=3;i=1005"},{"browseName":"1:Acceleration","description":[{"value":"This element serves a feedback that the pump rotation accelerates."}],"displayName":[{"value":"Acceleration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5084","parentNodeId":"ns=1;i=1033","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9005"},{"referenceType":"HasComponent","target":"ns=1;i=9063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9064"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9005","parentNodeId":"ns=1;i=5084","references":[{"referenceType":"HasProperty","target":"ns=1;i=9062"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5084"},{"referenceType":"HasProperty","target":"ns=1;i=9006"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9007"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9062","parentNodeId":"ns=1;i=9005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9006","parentNodeId":"ns=1;i=9005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9005"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9007","parentNodeId":"ns=1;i=9005","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9005"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9063","parentNodeId":"ns=1;i=5084","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9067"},{"referenceType":"HasProperty","target":"ns=1;i=9069"},{"referenceType":"HasProperty","target":"ns=1;i=9068"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5084"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9067","parentNodeId":"ns=1;i=9063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9069","parentNodeId":"ns=1;i=9063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9068","parentNodeId":"ns=1;i=9063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9064","parentNodeId":"ns=1;i=5084","references":[{"referenceType":"HasProperty","target":"ns=1;i=9070"},{"referenceType":"HasProperty","target":"ns=1;i=9065"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5084"},{"referenceType":"HasProperty","target":"ns=1;i=9066"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9070","parentNodeId":"ns=1;i=9064","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9064"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9065","parentNodeId":"ns=1;i=9064","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9064"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9066","parentNodeId":"ns=1;i=9064","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9064"}],"typeDefinition":"i=68"},{"browseName":"1:CleanValveOpen","description":[{"value":"This element serves a feedback about the open state of the cleaning valve."}],"displayName":[{"value":"CleanValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5085","parentNodeId":"ns=1;i=1033","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9008"},{"referenceType":"HasComponent","target":"ns=1;i=9072"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9073"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9008","parentNodeId":"ns=1;i=5085","references":[{"referenceType":"HasProperty","target":"ns=1;i=9071"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5085"},{"referenceType":"HasProperty","target":"ns=1;i=9009"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9010"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9071","parentNodeId":"ns=1;i=9008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9008"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9009","parentNodeId":"ns=1;i=9008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9008"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9010","parentNodeId":"ns=1;i=9008","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9008"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9072","parentNodeId":"ns=1;i=5085","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9076"},{"referenceType":"HasProperty","target":"ns=1;i=9078"},{"referenceType":"HasProperty","target":"ns=1;i=9077"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5085"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9076","parentNodeId":"ns=1;i=9072","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9072"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9078","parentNodeId":"ns=1;i=9072","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9072"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9077","parentNodeId":"ns=1;i=9072","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9072"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9073","parentNodeId":"ns=1;i=5085","references":[{"referenceType":"HasProperty","target":"ns=1;i=9079"},{"referenceType":"HasProperty","target":"ns=1;i=9074"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5085"},{"referenceType":"HasProperty","target":"ns=1;i=9075"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9079","parentNodeId":"ns=1;i=9073","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9073"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9074","parentNodeId":"ns=1;i=9073","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9073"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9075","parentNodeId":"ns=1;i=9073","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9073"}],"typeDefinition":"i=68"},{"browseName":"1:Deceleration","description":[{"value":"This element serves a feedback that the pump rotation decelerates."}],"displayName":[{"value":"Deceleration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5103","parentNodeId":"ns=1;i=1033","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9098"},{"referenceType":"HasComponent","target":"ns=1;i=9102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9103"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9098","parentNodeId":"ns=1;i=5103","references":[{"referenceType":"HasProperty","target":"ns=1;i=9101"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5103"},{"referenceType":"HasProperty","target":"ns=1;i=9099"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9100"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9101","parentNodeId":"ns=1;i=9098","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9098"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9099","parentNodeId":"ns=1;i=9098","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9098"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9100","parentNodeId":"ns=1;i=9098","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9098"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9102","parentNodeId":"ns=1;i=5103","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9106"},{"referenceType":"HasProperty","target":"ns=1;i=9108"},{"referenceType":"HasProperty","target":"ns=1;i=9107"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5103"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9106","parentNodeId":"ns=1;i=9102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9108","parentNodeId":"ns=1;i=9102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9107","parentNodeId":"ns=1;i=9102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9103","parentNodeId":"ns=1;i=5103","references":[{"referenceType":"HasProperty","target":"ns=1;i=9109"},{"referenceType":"HasProperty","target":"ns=1;i=9104"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5103"},{"referenceType":"HasProperty","target":"ns=1;i=9105"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9109","parentNodeId":"ns=1;i=9103","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9103"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9104","parentNodeId":"ns=1;i=9103","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9103"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9105","parentNodeId":"ns=1;i=9103","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9103"}],"typeDefinition":"i=68"},{"browseName":"1:FlushValveOpen","description":[{"value":"This element serves a feedback about the open state of the flush valve."}],"displayName":[{"value":"FlushValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5086","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9011"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9082"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9011","parentNodeId":"ns=1;i=5086","references":[{"referenceType":"HasProperty","target":"ns=1;i=9080"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5086"},{"referenceType":"HasProperty","target":"ns=1;i=9012"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9013"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9080","parentNodeId":"ns=1;i=9011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9012","parentNodeId":"ns=1;i=9011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9011"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9013","parentNodeId":"ns=1;i=9011","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9011"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9081","parentNodeId":"ns=1;i=5086","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9085"},{"referenceType":"HasProperty","target":"ns=1;i=9087"},{"referenceType":"HasProperty","target":"ns=1;i=9086"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5086"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9085","parentNodeId":"ns=1;i=9081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9087","parentNodeId":"ns=1;i=9081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9086","parentNodeId":"ns=1;i=9081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9082","parentNodeId":"ns=1;i=5086","references":[{"referenceType":"HasProperty","target":"ns=1;i=9088"},{"referenceType":"HasProperty","target":"ns=1;i=9083"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5086"},{"referenceType":"HasProperty","target":"ns=1;i=9084"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9088","parentNodeId":"ns=1;i=9082","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9082"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9083","parentNodeId":"ns=1;i=9082","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9082"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9084","parentNodeId":"ns=1;i=9082","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9082"}],"typeDefinition":"i=68"},{"browseName":"1:GasDilValveOpen","description":[{"value":"This element serves a feedback about the open state of the gas dilution valve."}],"displayName":[{"value":"GasDilValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5087","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9014"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9091"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9014","parentNodeId":"ns=1;i=5087","references":[{"referenceType":"HasProperty","target":"ns=1;i=9089"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5087"},{"referenceType":"HasProperty","target":"ns=1;i=9015"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9016"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9089","parentNodeId":"ns=1;i=9014","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9014"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9015","parentNodeId":"ns=1;i=9014","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9014"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9016","parentNodeId":"ns=1;i=9014","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9014"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9090","parentNodeId":"ns=1;i=5087","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9094"},{"referenceType":"HasProperty","target":"ns=1;i=9096"},{"referenceType":"HasProperty","target":"ns=1;i=9095"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5087"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9094","parentNodeId":"ns=1;i=9090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9096","parentNodeId":"ns=1;i=9090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9095","parentNodeId":"ns=1;i=9090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9091","parentNodeId":"ns=1;i=5087","references":[{"referenceType":"HasProperty","target":"ns=1;i=9097"},{"referenceType":"HasProperty","target":"ns=1;i=9092"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5087"},{"referenceType":"HasProperty","target":"ns=1;i=9093"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9097","parentNodeId":"ns=1;i=9091","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9091"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9092","parentNodeId":"ns=1;i=9091","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9091"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9093","parentNodeId":"ns=1;i=9091","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9091"}],"typeDefinition":"i=68"},{"browseName":"1:InletValveOpen","description":[{"value":"This element serves a feedback about the open state of the inlet valve."}],"displayName":[{"value":"InletValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5088","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9017"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9112"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9017","parentNodeId":"ns=1;i=5088","references":[{"referenceType":"HasProperty","target":"ns=1;i=9110"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5088"},{"referenceType":"HasProperty","target":"ns=1;i=9018"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9019"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9110","parentNodeId":"ns=1;i=9017","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9018","parentNodeId":"ns=1;i=9017","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9017"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9019","parentNodeId":"ns=1;i=9017","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9017"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9111","parentNodeId":"ns=1;i=5088","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9115"},{"referenceType":"HasProperty","target":"ns=1;i=9117"},{"referenceType":"HasProperty","target":"ns=1;i=9116"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5088"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9115","parentNodeId":"ns=1;i=9111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9117","parentNodeId":"ns=1;i=9111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9116","parentNodeId":"ns=1;i=9111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9112","parentNodeId":"ns=1;i=5088","references":[{"referenceType":"HasProperty","target":"ns=1;i=9118"},{"referenceType":"HasProperty","target":"ns=1;i=9113"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5088"},{"referenceType":"HasProperty","target":"ns=1;i=9114"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9118","parentNodeId":"ns=1;i=9112","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9112"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9113","parentNodeId":"ns=1;i=9112","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9112"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9114","parentNodeId":"ns=1;i=9112","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9112"}],"typeDefinition":"i=68"},{"browseName":"1:NoRotation","description":[{"value":"This element serves a feedback that the pump stands still."}],"displayName":[{"value":"NoRotation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5089","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9020"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9121"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9020","parentNodeId":"ns=1;i=5089","references":[{"referenceType":"HasProperty","target":"ns=1;i=9119"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5089"},{"referenceType":"HasProperty","target":"ns=1;i=9021"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9022"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9119","parentNodeId":"ns=1;i=9020","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9021","parentNodeId":"ns=1;i=9020","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9020"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9022","parentNodeId":"ns=1;i=9020","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9020"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9120","parentNodeId":"ns=1;i=5089","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9124"},{"referenceType":"HasProperty","target":"ns=1;i=9126"},{"referenceType":"HasProperty","target":"ns=1;i=9125"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5089"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9124","parentNodeId":"ns=1;i=9120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9126","parentNodeId":"ns=1;i=9120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9125","parentNodeId":"ns=1;i=9120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9121","parentNodeId":"ns=1;i=5089","references":[{"referenceType":"HasProperty","target":"ns=1;i=9127"},{"referenceType":"HasProperty","target":"ns=1;i=9122"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5089"},{"referenceType":"HasProperty","target":"ns=1;i=9123"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9127","parentNodeId":"ns=1;i=9121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9122","parentNodeId":"ns=1;i=9121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9121"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9123","parentNodeId":"ns=1;i=9121","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9121"}],"typeDefinition":"i=68"},{"browseName":"1:OutletValveOpen","description":[{"value":"This element serves a feedback about the open state of the outlet valve."}],"displayName":[{"value":"OutletValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5090","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9023"},{"referenceType":"HasComponent","target":"ns=1;i=9129"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9130"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9023","parentNodeId":"ns=1;i=5090","references":[{"referenceType":"HasProperty","target":"ns=1;i=9128"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5090"},{"referenceType":"HasProperty","target":"ns=1;i=9024"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9025"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9128","parentNodeId":"ns=1;i=9023","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9023"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9024","parentNodeId":"ns=1;i=9023","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9023"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9025","parentNodeId":"ns=1;i=9023","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9023"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9129","parentNodeId":"ns=1;i=5090","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9133"},{"referenceType":"HasProperty","target":"ns=1;i=9135"},{"referenceType":"HasProperty","target":"ns=1;i=9134"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5090"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9133","parentNodeId":"ns=1;i=9129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9135","parentNodeId":"ns=1;i=9129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9134","parentNodeId":"ns=1;i=9129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9130","parentNodeId":"ns=1;i=5090","references":[{"referenceType":"HasProperty","target":"ns=1;i=9136"},{"referenceType":"HasProperty","target":"ns=1;i=9131"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5090"},{"referenceType":"HasProperty","target":"ns=1;i=9132"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9136","parentNodeId":"ns=1;i=9130","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9130"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9131","parentNodeId":"ns=1;i=9130","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9130"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9132","parentNodeId":"ns=1;i=9130","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9130"}],"typeDefinition":"i=68"},{"browseName":"1:ProcessIsActive","description":[{"value":"This element serves a feedback that the process is active."}],"displayName":[{"value":"ProcessIsActive"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5091","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9026"},{"referenceType":"HasComponent","target":"ns=1;i=9138"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9139"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9026","parentNodeId":"ns=1;i=5091","references":[{"referenceType":"HasProperty","target":"ns=1;i=9137"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5091"},{"referenceType":"HasProperty","target":"ns=1;i=9027"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9028"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9137","parentNodeId":"ns=1;i=9026","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9026"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9027","parentNodeId":"ns=1;i=9026","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9026"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9028","parentNodeId":"ns=1;i=9026","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9026"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9138","parentNodeId":"ns=1;i=5091","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9142"},{"referenceType":"HasProperty","target":"ns=1;i=9144"},{"referenceType":"HasProperty","target":"ns=1;i=9143"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5091"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9142","parentNodeId":"ns=1;i=9138","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9138"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9144","parentNodeId":"ns=1;i=9138","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9138"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9143","parentNodeId":"ns=1;i=9138","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9138"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9139","parentNodeId":"ns=1;i=5091","references":[{"referenceType":"HasProperty","target":"ns=1;i=9145"},{"referenceType":"HasProperty","target":"ns=1;i=9140"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5091"},{"referenceType":"HasProperty","target":"ns=1;i=9141"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9145","parentNodeId":"ns=1;i=9139","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9139"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9140","parentNodeId":"ns=1;i=9139","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9139"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9141","parentNodeId":"ns=1;i=9139","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9139"}],"typeDefinition":"i=68"},{"browseName":"1:PumpActivation","description":[{"value":"This element serves a feedback about the activation state of the pump. The activation state takes into account that control mechanisms are active. Never the less the pump is not necessarily running"}],"displayName":[{"value":"PumpActivation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5092","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9029"},{"referenceType":"HasComponent","target":"ns=1;i=9147"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9148"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9029","parentNodeId":"ns=1;i=5092","references":[{"referenceType":"HasProperty","target":"ns=1;i=9146"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5092"},{"referenceType":"HasProperty","target":"ns=1;i=9030"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9031"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9146","parentNodeId":"ns=1;i=9029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9030","parentNodeId":"ns=1;i=9029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9029"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9031","parentNodeId":"ns=1;i=9029","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9029"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9147","parentNodeId":"ns=1;i=5092","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9151"},{"referenceType":"HasProperty","target":"ns=1;i=9153"},{"referenceType":"HasProperty","target":"ns=1;i=9152"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5092"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9151","parentNodeId":"ns=1;i=9147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9153","parentNodeId":"ns=1;i=9147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9152","parentNodeId":"ns=1;i=9147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9148","parentNodeId":"ns=1;i=5092","references":[{"referenceType":"HasProperty","target":"ns=1;i=9154"},{"referenceType":"HasProperty","target":"ns=1;i=9149"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5092"},{"referenceType":"HasProperty","target":"ns=1;i=9150"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9154","parentNodeId":"ns=1;i=9148","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9148"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9149","parentNodeId":"ns=1;i=9148","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9148"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9150","parentNodeId":"ns=1;i=9148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9148"}],"typeDefinition":"i=68"},{"browseName":"1:PumpDirection","description":[{"value":"This element serves a feedback of the pumps direction of rotation."}],"displayName":[{"value":"PumpDirection"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5093","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9032"},{"referenceType":"HasComponent","target":"ns=1;i=9156"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9157"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9032","parentNodeId":"ns=1;i=5093","references":[{"referenceType":"HasProperty","target":"ns=1;i=9155"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5093"},{"referenceType":"HasProperty","target":"ns=1;i=9033"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9034"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9155","parentNodeId":"ns=1;i=9032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9033","parentNodeId":"ns=1;i=9032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9032"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9034","parentNodeId":"ns=1;i=9032","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9032"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9156","parentNodeId":"ns=1;i=5093","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9160"},{"referenceType":"HasProperty","target":"ns=1;i=9162"},{"referenceType":"HasProperty","target":"ns=1;i=9161"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5093"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9160","parentNodeId":"ns=1;i=9156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9162","parentNodeId":"ns=1;i=9156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9161","parentNodeId":"ns=1;i=9156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9157","parentNodeId":"ns=1;i=5093","references":[{"referenceType":"HasProperty","target":"ns=1;i=9163"},{"referenceType":"HasProperty","target":"ns=1;i=9158"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5093"},{"referenceType":"HasProperty","target":"ns=1;i=9159"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9163","parentNodeId":"ns=1;i=9157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9158","parentNodeId":"ns=1;i=9157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9157"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9159","parentNodeId":"ns=1;i=9157","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9157"}],"typeDefinition":"i=68"},{"browseName":"1:PumpOperation","description":[{"value":"This element serves a feedback about the operation state of the pump. In the operation state the pump rotor is rotating."}],"displayName":[{"value":"PumpOperation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5094","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9035"},{"referenceType":"HasComponent","target":"ns=1;i=9165"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9166"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9035","parentNodeId":"ns=1;i=5094","references":[{"referenceType":"HasProperty","target":"ns=1;i=9164"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5094"},{"referenceType":"HasProperty","target":"ns=1;i=9036"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9037"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9164","parentNodeId":"ns=1;i=9035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9035"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9036","parentNodeId":"ns=1;i=9035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9035"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9037","parentNodeId":"ns=1;i=9035","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9035"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9165","parentNodeId":"ns=1;i=5094","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9169"},{"referenceType":"HasProperty","target":"ns=1;i=9171"},{"referenceType":"HasProperty","target":"ns=1;i=9170"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5094"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9169","parentNodeId":"ns=1;i=9165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9171","parentNodeId":"ns=1;i=9165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9170","parentNodeId":"ns=1;i=9165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9166","parentNodeId":"ns=1;i=5094","references":[{"referenceType":"HasProperty","target":"ns=1;i=9172"},{"referenceType":"HasProperty","target":"ns=1;i=9167"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5094"},{"referenceType":"HasProperty","target":"ns=1;i=9168"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9172","parentNodeId":"ns=1;i=9166","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9166"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9167","parentNodeId":"ns=1;i=9166","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9166"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9168","parentNodeId":"ns=1;i=9166","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9166"}],"typeDefinition":"i=68"},{"browseName":"1:PumpPowerMax","description":[{"value":"This element serves a feedback of pump operating at maximum power."}],"displayName":[{"value":"PumpPowerMax"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5095","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9038"},{"referenceType":"HasComponent","target":"ns=1;i=9174"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9175"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9038","parentNodeId":"ns=1;i=5095","references":[{"referenceType":"HasProperty","target":"ns=1;i=9173"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5095"},{"referenceType":"HasProperty","target":"ns=1;i=9039"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9040"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9173","parentNodeId":"ns=1;i=9038","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9038"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9039","parentNodeId":"ns=1;i=9038","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9038"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9040","parentNodeId":"ns=1;i=9038","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9038"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9174","parentNodeId":"ns=1;i=5095","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9178"},{"referenceType":"HasProperty","target":"ns=1;i=9180"},{"referenceType":"HasProperty","target":"ns=1;i=9179"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5095"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9178","parentNodeId":"ns=1;i=9174","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9174"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9180","parentNodeId":"ns=1;i=9174","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9174"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9179","parentNodeId":"ns=1;i=9174","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9174"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9175","parentNodeId":"ns=1;i=5095","references":[{"referenceType":"HasProperty","target":"ns=1;i=9181"},{"referenceType":"HasProperty","target":"ns=1;i=9176"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5095"},{"referenceType":"HasProperty","target":"ns=1;i=9177"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9181","parentNodeId":"ns=1;i=9175","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9175"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9176","parentNodeId":"ns=1;i=9175","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9175"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9177","parentNodeId":"ns=1;i=9175","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9175"}],"typeDefinition":"i=68"},{"browseName":"1:PumpSpeedMax","description":[{"value":"This element serves a feedback of pump operating at maximum speed."}],"displayName":[{"value":"PumpSpeedMax"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5096","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9041"},{"referenceType":"HasComponent","target":"ns=1;i=9183"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9184"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9041","parentNodeId":"ns=1;i=5096","references":[{"referenceType":"HasProperty","target":"ns=1;i=9182"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5096"},{"referenceType":"HasProperty","target":"ns=1;i=9042"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9043"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9182","parentNodeId":"ns=1;i=9041","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9041"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9042","parentNodeId":"ns=1;i=9041","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9041"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9043","parentNodeId":"ns=1;i=9041","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9041"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9183","parentNodeId":"ns=1;i=5096","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9187"},{"referenceType":"HasProperty","target":"ns=1;i=9189"},{"referenceType":"HasProperty","target":"ns=1;i=9188"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5096"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9187","parentNodeId":"ns=1;i=9183","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9183"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9189","parentNodeId":"ns=1;i=9183","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9183"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9188","parentNodeId":"ns=1;i=9183","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9183"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9184","parentNodeId":"ns=1;i=5096","references":[{"referenceType":"HasProperty","target":"ns=1;i=9190"},{"referenceType":"HasProperty","target":"ns=1;i=9185"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5096"},{"referenceType":"HasProperty","target":"ns=1;i=9186"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9190","parentNodeId":"ns=1;i=9184","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9184"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9185","parentNodeId":"ns=1;i=9184","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9184"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9186","parentNodeId":"ns=1;i=9184","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9184"}],"typeDefinition":"i=68"},{"browseName":"1:PumpSpeedMin","description":[{"value":"This element serves a feedback that the pump operates at minimum speed."}],"displayName":[{"value":"PumpSpeedMin"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5097","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9044"},{"referenceType":"HasComponent","target":"ns=1;i=9192"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9193"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9044","parentNodeId":"ns=1;i=5097","references":[{"referenceType":"HasProperty","target":"ns=1;i=9191"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5097"},{"referenceType":"HasProperty","target":"ns=1;i=9045"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9046"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9191","parentNodeId":"ns=1;i=9044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9045","parentNodeId":"ns=1;i=9044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9044"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9046","parentNodeId":"ns=1;i=9044","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9044"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9192","parentNodeId":"ns=1;i=5097","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9196"},{"referenceType":"HasProperty","target":"ns=1;i=9198"},{"referenceType":"HasProperty","target":"ns=1;i=9197"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5097"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9196","parentNodeId":"ns=1;i=9192","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9192"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9198","parentNodeId":"ns=1;i=9192","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9192"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9197","parentNodeId":"ns=1;i=9192","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9192"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9193","parentNodeId":"ns=1;i=5097","references":[{"referenceType":"HasProperty","target":"ns=1;i=9199"},{"referenceType":"HasProperty","target":"ns=1;i=9194"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5097"},{"referenceType":"HasProperty","target":"ns=1;i=9195"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9199","parentNodeId":"ns=1;i=9193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9194","parentNodeId":"ns=1;i=9193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9193"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9195","parentNodeId":"ns=1;i=9193","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9193"}],"typeDefinition":"i=68"},{"browseName":"1:PurgeValveOpen","description":[{"value":"This element serves a feedback about the open state of the purge valve."}],"displayName":[{"value":"PurgeValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5098","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9047"},{"referenceType":"HasComponent","target":"ns=1;i=9201"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9202"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9047","parentNodeId":"ns=1;i=5098","references":[{"referenceType":"HasProperty","target":"ns=1;i=9200"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5098"},{"referenceType":"HasProperty","target":"ns=1;i=9048"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9049"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9200","parentNodeId":"ns=1;i=9047","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9047"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9048","parentNodeId":"ns=1;i=9047","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9047"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9049","parentNodeId":"ns=1;i=9047","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9047"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9201","parentNodeId":"ns=1;i=5098","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9205"},{"referenceType":"HasProperty","target":"ns=1;i=9207"},{"referenceType":"HasProperty","target":"ns=1;i=9206"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5098"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9205","parentNodeId":"ns=1;i=9201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9207","parentNodeId":"ns=1;i=9201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9206","parentNodeId":"ns=1;i=9201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9202","parentNodeId":"ns=1;i=5098","references":[{"referenceType":"HasProperty","target":"ns=1;i=9208"},{"referenceType":"HasProperty","target":"ns=1;i=9203"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5098"},{"referenceType":"HasProperty","target":"ns=1;i=9204"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9208","parentNodeId":"ns=1;i=9202","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9202"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9203","parentNodeId":"ns=1;i=9202","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9202"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9204","parentNodeId":"ns=1;i=9202","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9202"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","description":[{"value":"This element serves a feedback that the pump rotation is at rated speed."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5099","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9050"},{"referenceType":"HasComponent","target":"ns=1;i=9210"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9211"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9050","parentNodeId":"ns=1;i=5099","references":[{"referenceType":"HasProperty","target":"ns=1;i=9209"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5099"},{"referenceType":"HasProperty","target":"ns=1;i=9051"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9052"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9209","parentNodeId":"ns=1;i=9050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9051","parentNodeId":"ns=1;i=9050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9050"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9052","parentNodeId":"ns=1;i=9050","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9050"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9210","parentNodeId":"ns=1;i=5099","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9214"},{"referenceType":"HasProperty","target":"ns=1;i=9216"},{"referenceType":"HasProperty","target":"ns=1;i=9215"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5099"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9214","parentNodeId":"ns=1;i=9210","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9210"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9216","parentNodeId":"ns=1;i=9210","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9210"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9215","parentNodeId":"ns=1;i=9210","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9210"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9211","parentNodeId":"ns=1;i=5099","references":[{"referenceType":"HasProperty","target":"ns=1;i=9217"},{"referenceType":"HasProperty","target":"ns=1;i=9212"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5099"},{"referenceType":"HasProperty","target":"ns=1;i=9213"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9217","parentNodeId":"ns=1;i=9211","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9211"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9212","parentNodeId":"ns=1;i=9211","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9211"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9213","parentNodeId":"ns=1;i=9211","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9211"}],"typeDefinition":"i=68"},{"browseName":"1:StandBy","description":[{"value":"This element serves a feedback about the process standby of the pump. In the stand by state the pump is ready for operation."}],"displayName":[{"value":"StandBy"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5083","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=8993"},{"referenceType":"HasComponent","target":"ns=1;i=8997"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=8998"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8993","parentNodeId":"ns=1;i=5083","references":[{"referenceType":"HasProperty","target":"ns=1;i=8996"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5083"},{"referenceType":"HasProperty","target":"ns=1;i=8994"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=8995"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8996","parentNodeId":"ns=1;i=8993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8994","parentNodeId":"ns=1;i=8993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8993"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8995","parentNodeId":"ns=1;i=8993","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8993"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8997","parentNodeId":"ns=1;i=5083","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9001"},{"referenceType":"HasProperty","target":"ns=1;i=9003"},{"referenceType":"HasProperty","target":"ns=1;i=9002"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5083"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9001","parentNodeId":"ns=1;i=8997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9003","parentNodeId":"ns=1;i=8997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9002","parentNodeId":"ns=1;i=8997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8998","parentNodeId":"ns=1;i=5083","references":[{"referenceType":"HasProperty","target":"ns=1;i=9004"},{"referenceType":"HasProperty","target":"ns=1;i=8999"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5083"},{"referenceType":"HasProperty","target":"ns=1;i=9000"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9004","parentNodeId":"ns=1;i=8998","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8998"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=8999","parentNodeId":"ns=1;i=8998","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8998"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9000","parentNodeId":"ns=1;i=8998","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8998"}],"typeDefinition":"i=68"},{"browseName":"1:StandBySpeed","description":[{"value":"This element serves a feedback that the pump rotation is at standby speed."}],"displayName":[{"value":"StandBySpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5100","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9053"},{"referenceType":"HasComponent","target":"ns=1;i=9219"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=9220"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9053","parentNodeId":"ns=1;i=5100","references":[{"referenceType":"HasProperty","target":"ns=1;i=9218"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5100"},{"referenceType":"HasProperty","target":"ns=1;i=9054"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9055"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9218","parentNodeId":"ns=1;i=9053","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9054","parentNodeId":"ns=1;i=9053","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9053"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9055","parentNodeId":"ns=1;i=9053","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9053"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9219","parentNodeId":"ns=1;i=5100","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9223"},{"referenceType":"HasProperty","target":"ns=1;i=9225"},{"referenceType":"HasProperty","target":"ns=1;i=9224"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5100"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9223","parentNodeId":"ns=1;i=9219","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9219"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9225","parentNodeId":"ns=1;i=9219","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9219"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9224","parentNodeId":"ns=1;i=9219","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9219"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9220","parentNodeId":"ns=1;i=5100","references":[{"referenceType":"HasProperty","target":"ns=1;i=9226"},{"referenceType":"HasProperty","target":"ns=1;i=9221"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5100"},{"referenceType":"HasProperty","target":"ns=1;i=9222"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9226","parentNodeId":"ns=1;i=9220","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9220"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9221","parentNodeId":"ns=1;i=9220","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9220"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9222","parentNodeId":"ns=1;i=9220","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9220"}],"typeDefinition":"i=68"},{"browseName":"1:TargetSpeed","description":[{"value":"This element serves a feedback that the pump is at target speed."}],"displayName":[{"value":"TargetSpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5101","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9056"},{"referenceType":"HasComponent","target":"ns=1;i=9228"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9229"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9056","parentNodeId":"ns=1;i=5101","references":[{"referenceType":"HasProperty","target":"ns=1;i=9227"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5101"},{"referenceType":"HasProperty","target":"ns=1;i=9057"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9058"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9227","parentNodeId":"ns=1;i=9056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9057","parentNodeId":"ns=1;i=9056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9056"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9058","parentNodeId":"ns=1;i=9056","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9056"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9228","parentNodeId":"ns=1;i=5101","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9232"},{"referenceType":"HasProperty","target":"ns=1;i=9234"},{"referenceType":"HasProperty","target":"ns=1;i=9233"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5101"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9232","parentNodeId":"ns=1;i=9228","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9228"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9234","parentNodeId":"ns=1;i=9228","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9228"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9233","parentNodeId":"ns=1;i=9228","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9228"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9229","parentNodeId":"ns=1;i=5101","references":[{"referenceType":"HasProperty","target":"ns=1;i=9235"},{"referenceType":"HasProperty","target":"ns=1;i=9230"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5101"},{"referenceType":"HasProperty","target":"ns=1;i=9231"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9235","parentNodeId":"ns=1;i=9229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9229"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9230","parentNodeId":"ns=1;i=9229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9229"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9231","parentNodeId":"ns=1;i=9229","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9229"}],"typeDefinition":"i=68"},{"browseName":"1:VentValveOpen","description":[{"value":"This element serves a feedback about the open state of the vent valve."}],"displayName":[{"value":"VentValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5102","parentNodeId":"ns=1;i=1033","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=9059"},{"referenceType":"HasComponent","target":"ns=1;i=9237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9238"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1033"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9059","parentNodeId":"ns=1;i=5102","references":[{"referenceType":"HasProperty","target":"ns=1;i=9236"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5102"},{"referenceType":"HasProperty","target":"ns=1;i=9060"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9061"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9236","parentNodeId":"ns=1;i=9059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9060","parentNodeId":"ns=1;i=9059","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9059"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9061","parentNodeId":"ns=1;i=9059","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9059"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9237","parentNodeId":"ns=1;i=5102","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9241"},{"referenceType":"HasProperty","target":"ns=1;i=9243"},{"referenceType":"HasProperty","target":"ns=1;i=9242"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5102"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9241","parentNodeId":"ns=1;i=9237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9243","parentNodeId":"ns=1;i=9237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9242","parentNodeId":"ns=1;i=9237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9238","parentNodeId":"ns=1;i=5102","references":[{"referenceType":"HasProperty","target":"ns=1;i=9244"},{"referenceType":"HasProperty","target":"ns=1;i=9239"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5102"},{"referenceType":"HasProperty","target":"ns=1;i=9240"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9244","parentNodeId":"ns=1;i=9238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9239","parentNodeId":"ns=1;i=9238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9238"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9240","parentNodeId":"ns=1;i=9238","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9238"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionAuxiliaryDeviceType","description":[{"value":"Supervision auxiliary device specifies information for monitoring an additional device."}],"displayName":[{"value":"SupervisionAuxiliaryDeviceType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.17","nodeClass":"ObjectType","nodeId":"ns=1;i=1017","references":[{"referenceType":"HasComponent","target":"ns=1;i=6960"},{"referenceType":"HasComponent","target":"ns=1;i=6963"},{"referenceType":"HasComponent","target":"ns=1;i=6966"},{"referenceType":"HasComponent","target":"ns=1;i=6969"},{"referenceType":"HasComponent","target":"ns=1;i=6972"},{"referenceType":"HasComponent","target":"ns=1;i=6975"},{"referenceType":"HasComponent","target":"ns=1;i=6978"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=6981"},{"referenceType":"HasComponent","target":"ns=1;i=6984"},{"referenceType":"HasComponent","target":"ns=1;i=6987"},{"referenceType":"HasComponent","target":"ns=1;i=6990"},{"referenceType":"HasComponent","target":"ns=1;i=6993"},{"referenceType":"HasComponent","target":"ns=1;i=6996"},{"referenceType":"HasComponent","target":"ns=1;i=6999"},{"referenceType":"HasComponent","target":"ns=1;i=7152"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"HasComponent","target":"ns=1;i=7155"},{"referenceType":"HasComponent","target":"ns=1;i=7158"},{"referenceType":"HasComponent","target":"ns=1;i=7161"},{"referenceType":"HasComponent","target":"ns=1;i=7164"},{"referenceType":"HasComponent","target":"ns=1;i=7167"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"HasComponent","target":"ns=1;i=7170"},{"referenceType":"HasComponent","target":"ns=1;i=7173"},{"referenceType":"HasComponent","target":"ns=1;i=7176"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=7179"},{"referenceType":"HasComponent","target":"ns=1;i=7182"},{"referenceType":"HasComponent","target":"ns=1;i=7185"},{"referenceType":"HasComponent","target":"ns=1;i=7188"},{"referenceType":"HasComponent","target":"ns=1;i=7191"},{"referenceType":"HasComponent","target":"ns=1;i=7194"},{"referenceType":"HasComponent","target":"ns=1;i=7197"},{"referenceType":"HasComponent","target":"ns=1;i=7200"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=7203"},{"referenceType":"HasComponent","target":"ns=1;i=7206"},{"referenceType":"HasComponent","target":"ns=1;i=7209"},{"referenceType":"HasComponent","target":"ns=1;i=7212"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:ActuatorElement","dataType":"Boolean","description":[{"value":"This property indicates a fault in an actuator element."}],"displayName":[{"value":"ActuatorElement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6960","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7278"},{"referenceType":"HasProperty","target":"ns=1;i=6961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6962"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7278","parentNodeId":"ns=1;i=6960","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6960"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6961","parentNodeId":"ns=1;i=6960","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6960"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6962","parentNodeId":"ns=1;i=6960","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6960"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AmbientTemperature","dataType":"Boolean","description":[{"value":"This property indicates an abnormal ambient temperature."}],"displayName":[{"value":"AmbientTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6963","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12090"},{"referenceType":"HasProperty","target":"ns=1;i=6964"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6965"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12090","parentNodeId":"ns=1;i=6963","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6963"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6964","parentNodeId":"ns=1;i=6963","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6963"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6965","parentNodeId":"ns=1;i=6963","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6963"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryDeviceFault","dataType":"Boolean","description":[{"value":"This property indicates a generic failure of an auxiliary device."}],"displayName":[{"value":"AuxiliaryDeviceFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6966","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12093"},{"referenceType":"HasProperty","target":"ns=1;i=6967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6968"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12093","parentNodeId":"ns=1;i=6966","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6966"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6967","parentNodeId":"ns=1;i=6966","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6966"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6968","parentNodeId":"ns=1;i=6966","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6966"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryMediumAbsence","dataType":"Boolean","description":[{"value":"This property indicates an absence of or wrong auxiliary medium."}],"displayName":[{"value":"AuxiliaryMediumAbsence"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6969","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12096"},{"referenceType":"HasProperty","target":"ns=1;i=6970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6971"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12096","parentNodeId":"ns=1;i=6969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6970","parentNodeId":"ns=1;i=6969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6969"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6971","parentNodeId":"ns=1;i=6969","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6969"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryMediumInsufficiency","dataType":"Boolean","description":[{"value":"This property indicates an insufficiency of auxiliary medium."}],"displayName":[{"value":"AuxiliaryMediumInsufficiency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6972","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12099"},{"referenceType":"HasProperty","target":"ns=1;i=6973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6974"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12099","parentNodeId":"ns=1;i=6972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6973","parentNodeId":"ns=1;i=6972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6972"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6974","parentNodeId":"ns=1;i=6972","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6972"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryPowerPole","dataType":"Boolean","description":[{"value":"This property indicates an auxiliary power supply wrongly poled."}],"displayName":[{"value":"AuxiliaryPowerPole"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6975","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12102"},{"referenceType":"HasProperty","target":"ns=1;i=6976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6977"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12102","parentNodeId":"ns=1;i=6975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6976","parentNodeId":"ns=1;i=6975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6975"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6977","parentNodeId":"ns=1;i=6975","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6975"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryPowerRange","dataType":"Boolean","description":[{"value":"This property indicates an off-spec of the auxiliary power range."}],"displayName":[{"value":"AuxiliaryPowerRange"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6978","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12105"},{"referenceType":"HasProperty","target":"ns=1;i=6979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6980"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12105","parentNodeId":"ns=1;i=6978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6979","parentNodeId":"ns=1;i=6978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6978"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6980","parentNodeId":"ns=1;i=6978","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6978"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CommunicationError","dataType":"Boolean","description":[{"value":"This property indicates a communication error."}],"displayName":[{"value":"CommunicationError"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6981","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12108"},{"referenceType":"HasProperty","target":"ns=1;i=6982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6983"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12108","parentNodeId":"ns=1;i=6981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6982","parentNodeId":"ns=1;i=6981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6981"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6983","parentNodeId":"ns=1;i=6981","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6981"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Corrosion","dataType":"Boolean","description":[{"value":"This property indicates corrosion/abrasion in parts in contact with medium."}],"displayName":[{"value":"Corrosion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6984","parentNodeId":"ns=1;i=1017","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=12111"},{"referenceType":"HasProperty","target":"ns=1;i=6985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6986"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12111","parentNodeId":"ns=1;i=6984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6985","parentNodeId":"ns=1;i=6984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6984"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6986","parentNodeId":"ns=1;i=6984","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6984"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Deviation","dataType":"Boolean","description":[{"value":"This property indicates an inadmissible deviation from measurement."}],"displayName":[{"value":"Deviation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6987","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12114"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=6988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6989"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12114","parentNodeId":"ns=1;i=6987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6988","parentNodeId":"ns=1;i=6987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6987"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6989","parentNodeId":"ns=1;i=6987","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6987"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectromagneticInterference","dataType":"Boolean","description":[{"value":"This property indicates an abnormal electromagnetic interference."}],"displayName":[{"value":"ElectromagneticInterference"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6990","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12117"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=6991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6992"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12117","parentNodeId":"ns=1;i=6990","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6990"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6991","parentNodeId":"ns=1;i=6990","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6990"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6992","parentNodeId":"ns=1;i=6990","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6990"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectronicFault","dataType":"Boolean","description":[{"value":"This property indicates a fault in the device electronics."}],"displayName":[{"value":"ElectronicFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6993","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12120"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=6994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6995"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12120","parentNodeId":"ns=1;i=6993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6994","parentNodeId":"ns=1;i=6993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6993"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6995","parentNodeId":"ns=1;i=6993","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6993"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:EnergySupply","dataType":"Boolean","description":[{"value":"This property indicates an error in internal energy supply."}],"displayName":[{"value":"EnergySupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6996","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12123"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=6997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6998"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12123","parentNodeId":"ns=1;i=6996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6997","parentNodeId":"ns=1;i=6996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6996"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6998","parentNodeId":"ns=1;i=6996","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6996"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:EvaluationElectronics","dataType":"Boolean","description":[{"value":"This property indicates an error in evaluation electronics."}],"displayName":[{"value":"EvaluationElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6999","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12126"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7000"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7151"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12126","parentNodeId":"ns=1;i=6999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7000","parentNodeId":"ns=1;i=6999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6999"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7151","parentNodeId":"ns=1;i=6999","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6999"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ExciterError","dataType":"Boolean","description":[{"value":"This property indicates an error in the exciter of the sensor element."}],"displayName":[{"value":"ExciterError"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7152","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12129"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7154"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12129","parentNodeId":"ns=1;i=7152","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7152"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7153","parentNodeId":"ns=1;i=7152","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7152"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7154","parentNodeId":"ns=1;i=7152","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7152"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Fouling","dataType":"Boolean","description":[{"value":"This property indicates a fouling on sensor element."}],"displayName":[{"value":"Fouling"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7155","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12132"},{"referenceType":"HasProperty","target":"ns=1;i=7156"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7157"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12132","parentNodeId":"ns=1;i=7155","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7155"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7156","parentNodeId":"ns=1;i=7155","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7155"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7157","parentNodeId":"ns=1;i=7155","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7155"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:HumidityElectronics","dataType":"Boolean","description":[{"value":"This property indicates an abnormal amount of humidity in electronics area."}],"displayName":[{"value":"HumidityElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7158","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12135"},{"referenceType":"HasProperty","target":"ns=1;i=7159"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7160"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12135","parentNodeId":"ns=1;i=7158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7158"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7159","parentNodeId":"ns=1;i=7158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7158"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7160","parentNodeId":"ns=1;i=7158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7158"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Installation","dataType":"Boolean","description":[{"value":"This property indicates an installation fault."}],"displayName":[{"value":"Installation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7161","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12189"},{"referenceType":"HasProperty","target":"ns=1;i=7162"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7163"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12189","parentNodeId":"ns=1;i=7161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7162","parentNodeId":"ns=1;i=7161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7161"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7163","parentNodeId":"ns=1;i=7161","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7161"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Interruption","dataType":"Boolean","description":[{"value":"This property indicates an interruption of signal path or short circuit."}],"displayName":[{"value":"Interruption"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7164","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12138"},{"referenceType":"HasProperty","target":"ns=1;i=7165"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7166"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12138","parentNodeId":"ns=1;i=7164","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7164"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7165","parentNodeId":"ns=1;i=7164","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7164"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7166","parentNodeId":"ns=1;i=7164","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7164"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:LineLength","dataType":"Boolean","description":[{"value":"This property indicates that the maximum line length is exceeded."}],"displayName":[{"value":"LineLength"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7167","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12141"},{"referenceType":"HasProperty","target":"ns=1;i=7168"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7169"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12141","parentNodeId":"ns=1;i=7167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7167"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7168","parentNodeId":"ns=1;i=7167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7167"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7169","parentNodeId":"ns=1;i=7167","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7167"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaterialElectronics","dataType":"Boolean","description":[{"value":"This property indicates a foreign material in electronics area."}],"displayName":[{"value":"MaterialElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7170","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12144"},{"referenceType":"HasProperty","target":"ns=1;i=7171"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7172"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12144","parentNodeId":"ns=1;i=7170","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7170"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7171","parentNodeId":"ns=1;i=7170","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7170"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7172","parentNodeId":"ns=1;i=7170","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7170"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MeasuredMaterialElectronics","dataType":"Boolean","description":[{"value":"This property indicates measured material in electronics area."}],"displayName":[{"value":"MeasuredMaterialElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7173","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12147"},{"referenceType":"HasProperty","target":"ns=1;i=7174"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7175"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12147","parentNodeId":"ns=1;i=7173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7173"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7174","parentNodeId":"ns=1;i=7173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7173"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7175","parentNodeId":"ns=1;i=7173","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7173"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MechanicalDamage","dataType":"Boolean","description":[{"value":"This property indicates a mechanical damage."}],"displayName":[{"value":"MechanicalDamage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7176","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12153"},{"referenceType":"HasProperty","target":"ns=1;i=7177"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7178"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12153","parentNodeId":"ns=1;i=7176","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7176"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7177","parentNodeId":"ns=1;i=7176","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7176"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7178","parentNodeId":"ns=1;i=7176","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7176"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OperatingConditions","dataType":"Boolean","description":[{"value":"This property indicates a fault due to non-compliance with specified operating conditions."}],"displayName":[{"value":"OperatingConditions"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7179","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12150"},{"referenceType":"HasProperty","target":"ns=1;i=7180"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7181"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12150","parentNodeId":"ns=1;i=7179","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7179"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7180","parentNodeId":"ns=1;i=7179","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7179"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7181","parentNodeId":"ns=1;i=7179","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7179"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Other","dataType":"Boolean","description":[{"value":"This property indicates other faults."}],"displayName":[{"value":"Other"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7182","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12156"},{"referenceType":"HasProperty","target":"ns=1;i=7183"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7184"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12156","parentNodeId":"ns=1;i=7182","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7182"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7183","parentNodeId":"ns=1;i=7182","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7182"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7184","parentNodeId":"ns=1;i=7182","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7182"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Overloading","dataType":"Boolean","description":[{"value":"This property indicates an overloading."}],"displayName":[{"value":"Overloading"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7185","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12186"},{"referenceType":"HasProperty","target":"ns=1;i=7186"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7187"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12186","parentNodeId":"ns=1;i=7185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7185"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7186","parentNodeId":"ns=1;i=7185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7185"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7187","parentNodeId":"ns=1;i=7185","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7185"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ParameterSetting","dataType":"Boolean","description":[{"value":"This property indicates a parameter setting error."}],"displayName":[{"value":"ParameterSetting"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7188","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12159"},{"referenceType":"HasProperty","target":"ns=1;i=7189"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7190"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12159","parentNodeId":"ns=1;i=7188","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7188"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7189","parentNodeId":"ns=1;i=7188","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7188"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7190","parentNodeId":"ns=1;i=7188","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7188"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Peripheral","dataType":"Boolean","description":[{"value":"This property indicates an error in peripherals."}],"displayName":[{"value":"Peripheral"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7191","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12162"},{"referenceType":"HasProperty","target":"ns=1;i=7192"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7193"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12162","parentNodeId":"ns=1;i=7191","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7191"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7192","parentNodeId":"ns=1;i=7191","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7191"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7193","parentNodeId":"ns=1;i=7191","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7191"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ProcessInfluence","dataType":"Boolean","description":[{"value":"This property indicates a fault due to process influence."}],"displayName":[{"value":"ProcessInfluence"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7194","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12165"},{"referenceType":"HasProperty","target":"ns=1;i=7195"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7196"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12165","parentNodeId":"ns=1;i=7194","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7194"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7195","parentNodeId":"ns=1;i=7194","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7194"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7196","parentNodeId":"ns=1;i=7194","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7194"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SensorElement","dataType":"Boolean","description":[{"value":"This property indicates a fault in a sensor element."}],"displayName":[{"value":"SensorElement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7197","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12168"},{"referenceType":"HasProperty","target":"ns=1;i=7198"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7199"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12168","parentNodeId":"ns=1;i=7197","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7197"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7198","parentNodeId":"ns=1;i=7197","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7197"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7199","parentNodeId":"ns=1;i=7197","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7197"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:StartUp","dataType":"Boolean","description":[{"value":"This property indicate an installation fault or fault during start-up."}],"displayName":[{"value":"StartUp"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7200","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12183"},{"referenceType":"HasProperty","target":"ns=1;i=7201"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7202"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12183","parentNodeId":"ns=1;i=7200","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7200"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7201","parentNodeId":"ns=1;i=7200","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7200"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7202","parentNodeId":"ns=1;i=7200","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7200"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TemperatureShock","dataType":"Boolean","description":[{"value":"This property indicates an excessive temperature shock."}],"displayName":[{"value":"TemperatureShock"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7203","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12171"},{"referenceType":"HasProperty","target":"ns=1;i=7204"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"},{"referenceType":"HasProperty","target":"ns=1;i=7205"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12171","parentNodeId":"ns=1;i=7203","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7203"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7204","parentNodeId":"ns=1;i=7203","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7203"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7205","parentNodeId":"ns=1;i=7203","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7203"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Vibration","dataType":"Boolean","description":[{"value":"This property indicates an excessive vibration or impact load."}],"displayName":[{"value":"Vibration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7206","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12174"},{"referenceType":"HasProperty","target":"ns=1;i=7207"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7208"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12174","parentNodeId":"ns=1;i=7206","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7206"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7207","parentNodeId":"ns=1;i=7206","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7206"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7208","parentNodeId":"ns=1;i=7206","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7206"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveOperation","dataType":"Boolean","description":[{"value":"This property indicates that the wear reserve is used up by operation."}],"displayName":[{"value":"WearReserveOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7209","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12177"},{"referenceType":"HasProperty","target":"ns=1;i=7210"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7211"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12177","parentNodeId":"ns=1;i=7209","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7209"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7210","parentNodeId":"ns=1;i=7209","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7209"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7211","parentNodeId":"ns=1;i=7209","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7209"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveWear","dataType":"Boolean","description":[{"value":"This property indicates that the wear reserve is used up by wear."}],"displayName":[{"value":"WearReserveWear"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7212","parentNodeId":"ns=1;i=1017","references":[{"referenceType":"HasProperty","target":"ns=1;i=12180"},{"referenceType":"HasProperty","target":"ns=1;i=7213"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7214"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1017"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12180","parentNodeId":"ns=1;i=7212","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7212"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7213","parentNodeId":"ns=1;i=7212","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7212"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7214","parentNodeId":"ns=1;i=7212","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7212"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionElectronicsType","description":[{"value":"Supervision Electrics specifies information for monitoring the electronics."}],"displayName":[{"value":"SupervisionElectronicsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.18","nodeClass":"ObjectType","nodeId":"ns=1;i=1018","references":[{"referenceType":"HasComponent","target":"ns=1;i=7215"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=7218"},{"referenceType":"HasComponent","target":"ns=1;i=7221"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"HasComponent","target":"ns=1;i=7224"},{"referenceType":"HasComponent","target":"ns=1;i=7227"},{"referenceType":"HasComponent","target":"ns=1;i=7230"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=7233"},{"referenceType":"HasComponent","target":"ns=1;i=7236"},{"referenceType":"HasComponent","target":"ns=1;i=7239"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=7242"},{"referenceType":"HasComponent","target":"ns=1;i=7245"},{"referenceType":"HasComponent","target":"ns=1;i=7248"},{"referenceType":"HasComponent","target":"ns=1;i=7251"},{"referenceType":"HasComponent","target":"ns=1;i=7254"},{"referenceType":"HasComponent","target":"ns=1;i=7257"},{"referenceType":"HasComponent","target":"ns=1;i=7260"},{"referenceType":"HasComponent","target":"ns=1;i=7263"},{"referenceType":"HasComponent","target":"ns=1;i=7266"},{"referenceType":"HasComponent","target":"ns=1;i=7269"},{"referenceType":"HasComponent","target":"ns=1;i=7272"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:ArmatureCircuit","dataType":"Boolean","description":[{"value":"This property indicates a failure in armature circuit."}],"displayName":[{"value":"ArmatureCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7215","parentNodeId":"ns=1;i=1018","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=12192"},{"referenceType":"HasProperty","target":"ns=1;i=7216"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7217"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12192","parentNodeId":"ns=1;i=7215","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7215"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7216","parentNodeId":"ns=1;i=7215","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7215"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7217","parentNodeId":"ns=1;i=7215","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7215"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CurrentInsideDevice","dataType":"Boolean","description":[{"value":"This property indicates unacceptable current inside the device."}],"displayName":[{"value":"CurrentInsideDevice"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7218","parentNodeId":"ns=1;i=1018","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=12195"},{"referenceType":"HasProperty","target":"ns=1;i=7219"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7220"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12195","parentNodeId":"ns=1;i=7218","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7218"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7219","parentNodeId":"ns=1;i=7218","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7218"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7220","parentNodeId":"ns=1;i=7218","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7218"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectricalFault","dataType":"Boolean","description":[{"value":"This property indicates a generic electrical fault."}],"displayName":[{"value":"ElectricalFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7221","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12198"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7222"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7223"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12198","parentNodeId":"ns=1;i=7221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7222","parentNodeId":"ns=1;i=7221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7221"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7223","parentNodeId":"ns=1;i=7221","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7221"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:FieldCircuit","dataType":"Boolean","description":[{"value":"This property indicates a failure in field circuit."}],"displayName":[{"value":"FieldCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7224","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12201"},{"referenceType":"HasProperty","target":"ns=1;i=7225"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7226"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12201","parentNodeId":"ns=1;i=7224","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7224"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7225","parentNodeId":"ns=1;i=7224","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7224"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7226","parentNodeId":"ns=1;i=7224","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7224"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:InstallationFault","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable electrical installation, e.g. mixed up phases."}],"displayName":[{"value":"InstallationFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7227","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12204"},{"referenceType":"HasProperty","target":"ns=1;i=7228"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7229"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12204","parentNodeId":"ns=1;i=7227","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7227"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7228","parentNodeId":"ns=1;i=7227","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7227"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7229","parentNodeId":"ns=1;i=7227","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7227"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:InsulationResistance","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable low winding resistance."}],"displayName":[{"value":"InsulationResistance"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7230","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12207"},{"referenceType":"HasProperty","target":"ns=1;i=7231"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7232"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12207","parentNodeId":"ns=1;i=7230","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7230"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7231","parentNodeId":"ns=1;i=7230","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7230"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7232","parentNodeId":"ns=1;i=7230","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7230"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PhaseFailure","dataType":"Boolean","description":[{"value":"This property indicates a phase failure."}],"displayName":[{"value":"PhaseFailure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7233","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12210"},{"referenceType":"HasProperty","target":"ns=1;i=7234"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7235"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12210","parentNodeId":"ns=1;i=7233","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7233"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7234","parentNodeId":"ns=1;i=7233","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7233"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7235","parentNodeId":"ns=1;i=7233","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7233"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ShortCircuit","dataType":"Boolean","description":[{"value":"This property indicates a short circuit."}],"displayName":[{"value":"ShortCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7236","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12213"},{"referenceType":"HasProperty","target":"ns=1;i=7237"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7238"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12213","parentNodeId":"ns=1;i=7236","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7237","parentNodeId":"ns=1;i=7236","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7236"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7238","parentNodeId":"ns=1;i=7236","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7236"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ShortToEarth","dataType":"Boolean","description":[{"value":"This property indicates a short to earth."}],"displayName":[{"value":"ShortToEarth"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7239","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12216"},{"referenceType":"HasProperty","target":"ns=1;i=7240"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7241"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12216","parentNodeId":"ns=1;i=7239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7239"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7240","parentNodeId":"ns=1;i=7239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7239"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7241","parentNodeId":"ns=1;i=7239","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7239"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrent","dataType":"Boolean","description":[{"value":"This property indicates a failure of supply current."}],"displayName":[{"value":"SupplyCurrent"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7242","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12219"},{"referenceType":"HasProperty","target":"ns=1;i=7243"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7244"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12219","parentNodeId":"ns=1;i=7242","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7243","parentNodeId":"ns=1;i=7242","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7242"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7244","parentNodeId":"ns=1;i=7242","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7242"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrentHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply current."}],"displayName":[{"value":"SupplyCurrentHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7245","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12222"},{"referenceType":"HasProperty","target":"ns=1;i=7246"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7247"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12222","parentNodeId":"ns=1;i=7245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7246","parentNodeId":"ns=1;i=7245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7245"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7247","parentNodeId":"ns=1;i=7245","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7245"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrentLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply current."}],"displayName":[{"value":"SupplyCurrentLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7248","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12225"},{"referenceType":"HasProperty","target":"ns=1;i=7249"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7250"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12225","parentNodeId":"ns=1;i=7248","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7248"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7249","parentNodeId":"ns=1;i=7248","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7248"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7250","parentNodeId":"ns=1;i=7248","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7248"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequency","dataType":"Boolean","description":[{"value":"This property indicates unacceptable supply frequency."}],"displayName":[{"value":"SupplyFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7251","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12228"},{"referenceType":"HasProperty","target":"ns=1;i=7252"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7253"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12228","parentNodeId":"ns=1;i=7251","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7251"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7252","parentNodeId":"ns=1;i=7251","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7251"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7253","parentNodeId":"ns=1;i=7251","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7251"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequencyHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply frequency."}],"displayName":[{"value":"SupplyFrequencyHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7254","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12231"},{"referenceType":"HasProperty","target":"ns=1;i=7255"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7256"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12231","parentNodeId":"ns=1;i=7254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7254"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7255","parentNodeId":"ns=1;i=7254","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7254"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7256","parentNodeId":"ns=1;i=7254","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7254"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequencyLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply frequency."}],"displayName":[{"value":"SupplyFrequencyLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7257","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12234"},{"referenceType":"HasProperty","target":"ns=1;i=7258"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7259"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12234","parentNodeId":"ns=1;i=7257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7258","parentNodeId":"ns=1;i=7257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7257"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7259","parentNodeId":"ns=1;i=7257","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7257"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltage","dataType":"Boolean","description":[{"value":"This property indicates a failure of supply voltage."}],"displayName":[{"value":"SupplyVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7260","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12237"},{"referenceType":"HasProperty","target":"ns=1;i=7261"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7262"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12237","parentNodeId":"ns=1;i=7260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7260"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7261","parentNodeId":"ns=1;i=7260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7260"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7262","parentNodeId":"ns=1;i=7260","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7260"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltageHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply voltage."}],"displayName":[{"value":"SupplyVoltageHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7263","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12240"},{"referenceType":"HasProperty","target":"ns=1;i=7264"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7265"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12240","parentNodeId":"ns=1;i=7263","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7263"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7264","parentNodeId":"ns=1;i=7263","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7263"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7265","parentNodeId":"ns=1;i=7263","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7263"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltageLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply voltage."}],"displayName":[{"value":"SupplyVoltageLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7266","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12243"},{"referenceType":"HasProperty","target":"ns=1;i=7267"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"},{"referenceType":"HasProperty","target":"ns=1;i=7268"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12243","parentNodeId":"ns=1;i=7266","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7266"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7267","parentNodeId":"ns=1;i=7266","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7266"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7268","parentNodeId":"ns=1;i=7266","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7266"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VoltageInsideDevice","dataType":"Boolean","description":[{"value":"This property indicates unacceptable voltage inside the device."}],"displayName":[{"value":"VoltageInsideDevice"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7269","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12246"},{"referenceType":"HasProperty","target":"ns=1;i=7270"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7271"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12246","parentNodeId":"ns=1;i=7269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7269"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7270","parentNodeId":"ns=1;i=7269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7269"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7271","parentNodeId":"ns=1;i=7269","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7269"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WindingTemperature","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable winding temperature."}],"displayName":[{"value":"WindingTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7272","parentNodeId":"ns=1;i=1018","references":[{"referenceType":"HasProperty","target":"ns=1;i=12249"},{"referenceType":"HasProperty","target":"ns=1;i=7273"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7274"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1018"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12249","parentNodeId":"ns=1;i=7272","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7272"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7273","parentNodeId":"ns=1;i=7272","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7272"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7274","parentNodeId":"ns=1;i=7272","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7272"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionHardwareType","description":[{"value":"Supervision hardware specifies supervising information related to device hardware."}],"displayName":[{"value":"SupervisionHardwareType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.13","nodeClass":"ObjectType","nodeId":"ns=1;i=1013","references":[{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=6752"},{"referenceType":"HasComponent","target":"ns=1;i=6755"},{"referenceType":"HasComponent","target":"ns=1;i=6758"},{"referenceType":"HasComponent","target":"ns=1;i=6761"},{"referenceType":"HasComponent","target":"ns=1;i=6764"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"HasComponent","target":"ns=1;i=6767"},{"referenceType":"HasComponent","target":"ns=1;i=6770"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"HasComponent","target":"ns=1;i=6773"},{"referenceType":"HasComponent","target":"ns=1;i=6785"},{"referenceType":"HasComponent","target":"ns=1;i=6776"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=6779"},{"referenceType":"HasComponent","target":"ns=1;i=6782"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:Communication","dataType":"Boolean","description":[{"value":"This attribute indicates a communication failure."}],"displayName":[{"value":"Communication"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6752","parentNodeId":"ns=1;i=1013","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=11399"},{"referenceType":"HasProperty","target":"ns=1;i=6753"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6754"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11399","parentNodeId":"ns=1;i=6752","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6752"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6753","parentNodeId":"ns=1;i=6752","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6752"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6754","parentNodeId":"ns=1;i=6752","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6752"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ComputingCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the computing elements of device hardware."}],"displayName":[{"value":"ComputingCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6755","parentNodeId":"ns=1;i=1013","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=11402"},{"referenceType":"HasProperty","target":"ns=1;i=6756"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6757"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11402","parentNodeId":"ns=1;i=6755","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6755"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6756","parentNodeId":"ns=1;i=6755","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6755"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6757","parentNodeId":"ns=1;i=6755","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6755"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ControlCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the control elements of device hardware."}],"displayName":[{"value":"ControlCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6758","parentNodeId":"ns=1;i=1013","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=11405"},{"referenceType":"HasProperty","target":"ns=1;i=6759"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6760"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11405","parentNodeId":"ns=1;i=6758","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6758"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6759","parentNodeId":"ns=1;i=6758","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6758"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6760","parentNodeId":"ns=1;i=6758","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6758"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DCLinkSupply","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the dc power supply of device hardware."}],"displayName":[{"value":"DCLinkSupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6761","parentNodeId":"ns=1;i=1013","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=11408"},{"referenceType":"HasProperty","target":"ns=1;i=6762"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6763"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11408","parentNodeId":"ns=1;i=6761","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6761"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6762","parentNodeId":"ns=1;i=6761","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6761"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6763","parentNodeId":"ns=1;i=6761","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6761"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Eprom","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of an eprom."}],"displayName":[{"value":"Eprom"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6764","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11411"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=6765"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6766"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11411","parentNodeId":"ns=1;i=6764","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6764"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6765","parentNodeId":"ns=1;i=6764","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6764"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6766","parentNodeId":"ns=1;i=6764","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6764"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:HardwareFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of device hardware."}],"displayName":[{"value":"HardwareFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6767","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11414"},{"referenceType":"HasProperty","target":"ns=1;i=6768"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6769"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11414","parentNodeId":"ns=1;i=6767","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6767"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6768","parentNodeId":"ns=1;i=6767","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6767"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6769","parentNodeId":"ns=1;i=6767","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6767"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:IONA","dataType":"Boolean","description":[{"value":"This attribute indicates a disconnection between processing unit and device."}],"displayName":[{"value":"IONA"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6770","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11417"},{"referenceType":"HasProperty","target":"ns=1;i=6771"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6772"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11417","parentNodeId":"ns=1;i=6770","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6770"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6771","parentNodeId":"ns=1;i=6770","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6770"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6772","parentNodeId":"ns=1;i=6770","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6770"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MeasureCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the measurement elements of device hardware."}],"displayName":[{"value":"MeasureCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6773","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11420"},{"referenceType":"HasProperty","target":"ns=1;i=6774"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6775"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11420","parentNodeId":"ns=1;i=6773","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6773"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6774","parentNodeId":"ns=1;i=6773","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6773"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6775","parentNodeId":"ns=1;i=6773","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6773"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MicroProcessor","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the micro processor."}],"displayName":[{"value":"MicroProcessor"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6785","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11432"},{"referenceType":"HasProperty","target":"ns=1;i=6786"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6787"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11432","parentNodeId":"ns=1;i=6785","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6785"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6786","parentNodeId":"ns=1;i=6785","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6785"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6787","parentNodeId":"ns=1;i=6785","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6785"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:NetworkNA","dataType":"Boolean","description":[{"value":"This attribute indicates a disconnection of the device."}],"displayName":[{"value":"NetworkNA"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6776","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11423"},{"referenceType":"HasProperty","target":"ns=1;i=6777"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6778"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11423","parentNodeId":"ns=1;i=6776","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6776"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6777","parentNodeId":"ns=1;i=6776","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6776"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6778","parentNodeId":"ns=1;i=6776","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6776"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PowerSupply","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the power supply of device hardware."}],"displayName":[{"value":"PowerSupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6779","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11426"},{"referenceType":"HasProperty","target":"ns=1;i=6780"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=6781"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11426","parentNodeId":"ns=1;i=6779","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6779"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6780","parentNodeId":"ns=1;i=6779","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6779"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6781","parentNodeId":"ns=1;i=6779","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6779"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Ram","dataType":"Boolean","description":[{"value":"This attribute indicates a ram failure."}],"displayName":[{"value":"Ram"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6782","parentNodeId":"ns=1;i=1013","references":[{"referenceType":"HasProperty","target":"ns=1;i=11429"},{"referenceType":"HasProperty","target":"ns=1;i=6783"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1013"},{"referenceType":"HasProperty","target":"ns=1;i=6784"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11429","parentNodeId":"ns=1;i=6782","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6782"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6783","parentNodeId":"ns=1;i=6782","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6782"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6784","parentNodeId":"ns=1;i=6782","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6782"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionMechanicsType","description":[{"value":"Supervision mechanics specifies supervising information related to device mechanics."}],"displayName":[{"value":"SupervisionMechanicsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.12","nodeClass":"ObjectType","nodeId":"ns=1;i=1012","references":[{"referenceType":"HasComponent","target":"ns=1;i=6704"},{"referenceType":"HasComponent","target":"ns=1;i=6707"},{"referenceType":"HasComponent","target":"ns=1;i=6710"},{"referenceType":"HasComponent","target":"ns=1;i=6713"},{"referenceType":"HasComponent","target":"ns=1;i=6716"},{"referenceType":"HasComponent","target":"ns=1;i=6719"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=6722"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"HasComponent","target":"ns=1;i=6725"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"HasComponent","target":"ns=1;i=6728"},{"referenceType":"HasComponent","target":"ns=1;i=6731"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=6734"},{"referenceType":"HasComponent","target":"ns=1;i=6737"},{"referenceType":"HasComponent","target":"ns=1;i=6740"},{"referenceType":"HasComponent","target":"ns=1;i=6743"},{"referenceType":"HasComponent","target":"ns=1;i=6746"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=6749"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:AxialBearingAbrasion","dataType":"Boolean","description":[{"value":"This attribute indicates an unacceptable abrasion of the axial bearing."}],"displayName":[{"value":"AxialBearingAbrasion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6704","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=12252"},{"referenceType":"HasProperty","target":"ns=1;i=6705"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6706"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12252","parentNodeId":"ns=1;i=6704","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6704"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6705","parentNodeId":"ns=1;i=6704","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6704"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6706","parentNodeId":"ns=1;i=6704","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6704"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AxialBearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the axial bearing."}],"displayName":[{"value":"AxialBearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6707","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=12255"},{"referenceType":"HasProperty","target":"ns=1;i=6708"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6709"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12255","parentNodeId":"ns=1;i=6707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6707"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6708","parentNodeId":"ns=1;i=6707","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6707"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6709","parentNodeId":"ns=1;i=6707","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6707"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AxialBearingOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the axial bearing."}],"displayName":[{"value":"AxialBearingOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6710","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=12258"},{"referenceType":"HasProperty","target":"ns=1;i=6711"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6712"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12258","parentNodeId":"ns=1;i=6710","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6710"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6711","parentNodeId":"ns=1;i=6710","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6710"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6712","parentNodeId":"ns=1;i=6710","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6710"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic bearing failure."}],"displayName":[{"value":"BearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6713","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=12261"},{"referenceType":"HasProperty","target":"ns=1;i=6714"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6715"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12261","parentNodeId":"ns=1;i=6713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6713"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6714","parentNodeId":"ns=1;i=6713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6713"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6715","parentNodeId":"ns=1;i=6713","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6713"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BrakeChopper","dataType":"Boolean","description":[{"value":"This attribute indicates a problem of the brake chopper."}],"displayName":[{"value":"BrakeChopper"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6716","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=12264"},{"referenceType":"HasProperty","target":"ns=1;i=6717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6718"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12264","parentNodeId":"ns=1;i=6716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6717","parentNodeId":"ns=1;i=6716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6716"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6718","parentNodeId":"ns=1;i=6716","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6716"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BrakeOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a brake."}],"displayName":[{"value":"BrakeOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6719","parentNodeId":"ns=1;i=1012","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=12267"},{"referenceType":"HasProperty","target":"ns=1;i=6720"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6721"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12267","parentNodeId":"ns=1;i=6719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6720","parentNodeId":"ns=1;i=6719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6719"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6721","parentNodeId":"ns=1;i=6719","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6719"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ExcessVibration","dataType":"Boolean","description":[{"value":"This attribute indicates unacceptable high mechanical vibration."}],"displayName":[{"value":"ExcessVibration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6722","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12270"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6723"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6724"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12270","parentNodeId":"ns=1;i=6722","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6722"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6723","parentNodeId":"ns=1;i=6722","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6722"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6724","parentNodeId":"ns=1;i=6722","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6722"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapWear","dataType":"Boolean","description":[{"value":"This attribute indicates a mechanical wear at gap."}],"displayName":[{"value":"GapWear"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6725","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12273"},{"referenceType":"HasProperty","target":"ns=1;i=6726"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6727"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12273","parentNodeId":"ns=1;i=6725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6725"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6726","parentNodeId":"ns=1;i=6725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6725"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6727","parentNodeId":"ns=1;i=6725","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6725"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MechanicalFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic mechanical fault."}],"displayName":[{"value":"MechanicalFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6728","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12276"},{"referenceType":"HasProperty","target":"ns=1;i=6729"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6730"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12276","parentNodeId":"ns=1;i=6728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6728"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6729","parentNodeId":"ns=1;i=6728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6728"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6730","parentNodeId":"ns=1;i=6728","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6728"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Misalignment","dataType":"Boolean","description":[{"value":"This attribute indicates a misalignment."}],"displayName":[{"value":"Misalignment"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6731","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12279"},{"referenceType":"HasProperty","target":"ns=1;i=6732"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6733"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12279","parentNodeId":"ns=1;i=6731","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6731"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6732","parentNodeId":"ns=1;i=6731","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6731"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6733","parentNodeId":"ns=1;i=6731","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6731"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingAbrasion","dataType":"Boolean","description":[{"value":"This attribute indicates an unacceptable abrasion of the radial bearing."}],"displayName":[{"value":"RadialBearingAbrasion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6734","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12282"},{"referenceType":"HasProperty","target":"ns=1;i=6735"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6736"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12282","parentNodeId":"ns=1;i=6734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6734"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6735","parentNodeId":"ns=1;i=6734","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6734"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6736","parentNodeId":"ns=1;i=6734","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6734"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the radial bearing."}],"displayName":[{"value":"RadialBearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6737","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12285"},{"referenceType":"HasProperty","target":"ns=1;i=6738"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6739"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12285","parentNodeId":"ns=1;i=6737","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6737"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6738","parentNodeId":"ns=1;i=6737","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6737"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6739","parentNodeId":"ns=1;i=6737","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6737"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the radial bearing."}],"displayName":[{"value":"RadialBearingOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6740","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12288"},{"referenceType":"HasProperty","target":"ns=1;i=6741"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6742"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12288","parentNodeId":"ns=1;i=6740","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6740"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6741","parentNodeId":"ns=1;i=6740","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6740"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6742","parentNodeId":"ns=1;i=6740","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6740"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotorBlocked","dataType":"Boolean","description":[{"value":"This attribute indicates a blocked rotor."}],"displayName":[{"value":"RotorBlocked"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6743","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12291"},{"referenceType":"HasProperty","target":"ns=1;i=6744"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6745"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12291","parentNodeId":"ns=1;i=6743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6744","parentNodeId":"ns=1;i=6743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6743"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6745","parentNodeId":"ns=1;i=6743","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6743"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotorStationRubbing","dataType":"Boolean","description":[{"value":"This attribute indicates the rubbing of stator and rotor."}],"displayName":[{"value":"RotorStationRubbing"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6746","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12294"},{"referenceType":"HasProperty","target":"ns=1;i=6747"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"},{"referenceType":"HasProperty","target":"ns=1;i=6748"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12294","parentNodeId":"ns=1;i=6746","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6746"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6747","parentNodeId":"ns=1;i=6746","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6746"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6748","parentNodeId":"ns=1;i=6746","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6746"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Unbalance","dataType":"Boolean","description":[{"value":"This attribute indicates an unbalance."}],"displayName":[{"value":"Unbalance"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6749","parentNodeId":"ns=1;i=1012","references":[{"referenceType":"HasProperty","target":"ns=1;i=12297"},{"referenceType":"HasProperty","target":"ns=1;i=6750"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6751"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1012"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12297","parentNodeId":"ns=1;i=6749","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6749"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6750","parentNodeId":"ns=1;i=6749","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6749"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6751","parentNodeId":"ns=1;i=6749","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6749"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionProcessFluidType","description":[{"value":"Supervision process fluid specifies information for monitoring the fluid of a pump."}],"displayName":[{"value":"SupervisionProcessFluidType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.15","nodeClass":"ObjectType","nodeId":"ns=1;i=1015","references":[{"referenceType":"HasComponent","target":"ns=1;i=6812"},{"referenceType":"HasComponent","target":"ns=1;i=6815"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=6818"},{"referenceType":"HasComponent","target":"ns=1;i=6821"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"HasComponent","target":"ns=1;i=6824"},{"referenceType":"HasComponent","target":"ns=1;i=6827"},{"referenceType":"HasComponent","target":"ns=1;i=6830"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=6833"},{"referenceType":"HasComponent","target":"ns=1;i=6836"},{"referenceType":"HasComponent","target":"ns=1;i=6839"},{"referenceType":"HasComponent","target":"ns=1;i=6842"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=6845"},{"referenceType":"HasComponent","target":"ns=1;i=6848"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:Blockage","dataType":"Boolean","description":[{"value":"This attribute indicates a closed valve operation."}],"displayName":[{"value":"Blockage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6812","parentNodeId":"ns=1;i=1015","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=12300"},{"referenceType":"HasProperty","target":"ns=1;i=6813"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6814"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12300","parentNodeId":"ns=1;i=6812","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6812"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6813","parentNodeId":"ns=1;i=6812","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6812"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6814","parentNodeId":"ns=1;i=6812","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6812"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Cavitation","dataType":"Boolean","description":[{"value":"This attribute indicates cavitation of the pump liquid."}],"displayName":[{"value":"Cavitation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6815","parentNodeId":"ns=1;i=1015","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=12303"},{"referenceType":"HasProperty","target":"ns=1;i=6816"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6817"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12303","parentNodeId":"ns=1;i=6815","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6815"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6816","parentNodeId":"ns=1;i=6815","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6815"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6817","parentNodeId":"ns=1;i=6815","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6815"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Condensation","dataType":"Boolean","description":[{"value":"This attribute indicates abnormal condensation in flow medium."}],"displayName":[{"value":"Condensation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6818","parentNodeId":"ns=1;i=1015","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=12306"},{"referenceType":"HasProperty","target":"ns=1;i=6819"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6820"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12306","parentNodeId":"ns=1;i=6818","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6818"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6819","parentNodeId":"ns=1;i=6818","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6818"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6820","parentNodeId":"ns=1;i=6818","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6818"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Dry","dataType":"Boolean","description":[{"value":"This attribute indicates a dry running."}],"displayName":[{"value":"Dry"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6821","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=6822"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6823"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12309","parentNodeId":"ns=1;i=6821","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6821"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6822","parentNodeId":"ns=1;i=6821","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6821"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6823","parentNodeId":"ns=1;i=6821","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6821"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Flow","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal flow of the pump fluid."}],"displayName":[{"value":"Flow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6824","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12312"},{"referenceType":"HasProperty","target":"ns=1;i=6825"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6826"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12312","parentNodeId":"ns=1;i=6824","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6824"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6825","parentNodeId":"ns=1;i=6824","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6824"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6826","parentNodeId":"ns=1;i=6824","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6824"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Gas","dataType":"Boolean","description":[{"value":"This attribute indicates a significant amount of gas in the pump liquid."}],"displayName":[{"value":"Gas"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6827","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12315"},{"referenceType":"HasProperty","target":"ns=1;i=6828"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6829"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12315","parentNodeId":"ns=1;i=6827","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6827"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6828","parentNodeId":"ns=1;i=6827","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6827"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6829","parentNodeId":"ns=1;i=6827","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6827"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Liquid","dataType":"Boolean","description":[{"value":"This attribute indicates a significant amount of liquid in the flow medium."}],"displayName":[{"value":"Liquid"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6830","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12318"},{"referenceType":"HasProperty","target":"ns=1;i=6831"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6832"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12318","parentNodeId":"ns=1;i=6830","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6830"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6831","parentNodeId":"ns=1;i=6830","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6830"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6832","parentNodeId":"ns=1;i=6830","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6830"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Pressure","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal pressure of the pump fluid."}],"displayName":[{"value":"Pressure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6833","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12321"},{"referenceType":"HasProperty","target":"ns=1;i=6834"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=6835"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12321","parentNodeId":"ns=1;i=6833","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6833"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6834","parentNodeId":"ns=1;i=6833","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6833"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6835","parentNodeId":"ns=1;i=6833","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6833"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ProcessFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic process problem."}],"displayName":[{"value":"ProcessFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6836","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12324"},{"referenceType":"HasProperty","target":"ns=1;i=6837"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=6838"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12324","parentNodeId":"ns=1;i=6836","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6836"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6837","parentNodeId":"ns=1;i=6836","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6836"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6838","parentNodeId":"ns=1;i=6836","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6836"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Solid","dataType":"Boolean","description":[{"value":"This attribute indicates an significant amount of solid in the pump fluid."}],"displayName":[{"value":"Solid"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6839","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12327"},{"referenceType":"HasProperty","target":"ns=1;i=6840"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=6841"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12327","parentNodeId":"ns=1;i=6839","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6839"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6840","parentNodeId":"ns=1;i=6839","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6839"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6841","parentNodeId":"ns=1;i=6839","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6839"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Stall","dataType":"Boolean","description":[{"value":"This attribute indicates a stall of the pump liquid."}],"displayName":[{"value":"Stall"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6842","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12330"},{"referenceType":"HasProperty","target":"ns=1;i=6843"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=6844"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12330","parentNodeId":"ns=1;i=6842","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6842"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6843","parentNodeId":"ns=1;i=6842","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6842"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6844","parentNodeId":"ns=1;i=6842","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6842"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Temperature","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal temperature of the pump fluid."}],"displayName":[{"value":"Temperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6845","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12333"},{"referenceType":"HasProperty","target":"ns=1;i=6846"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"},{"referenceType":"HasProperty","target":"ns=1;i=6847"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12333","parentNodeId":"ns=1;i=6845","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6845"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6846","parentNodeId":"ns=1;i=6845","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6845"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6847","parentNodeId":"ns=1;i=6845","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6845"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Viscosity","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal viscosity of the pump liquid."}],"displayName":[{"value":"Viscosity"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6848","parentNodeId":"ns=1;i=1015","references":[{"referenceType":"HasProperty","target":"ns=1;i=12336"},{"referenceType":"HasProperty","target":"ns=1;i=6849"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6850"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1015"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12336","parentNodeId":"ns=1;i=6848","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6848"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6849","parentNodeId":"ns=1;i=6848","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6848"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6850","parentNodeId":"ns=1;i=6848","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6848"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionPumpOperationType","description":[{"value":"Supervision pump operation specifies information for monitoring the pump operation."}],"displayName":[{"value":"SupervisionPumpOperationType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.16","nodeClass":"ObjectType","nodeId":"ns=1;i=1016","references":[{"referenceType":"HasComponent","target":"ns=1;i=6851"},{"referenceType":"HasComponent","target":"ns=1;i=6854"},{"referenceType":"HasComponent","target":"ns=1;i=6857"},{"referenceType":"HasComponent","target":"ns=1;i=6860"},{"referenceType":"HasComponent","target":"ns=1;i=6863"},{"referenceType":"HasComponent","target":"ns=1;i=6866"},{"referenceType":"HasComponent","target":"ns=1;i=6869"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=6872"},{"referenceType":"HasComponent","target":"ns=1;i=12084"},{"referenceType":"HasComponent","target":"ns=1;i=6875"},{"referenceType":"HasComponent","target":"ns=1;i=6878"},{"referenceType":"HasComponent","target":"ns=1;i=6881"},{"referenceType":"HasComponent","target":"ns=1;i=6884"},{"referenceType":"HasComponent","target":"ns=1;i=6887"},{"referenceType":"HasComponent","target":"ns=1;i=6890"},{"referenceType":"HasComponent","target":"ns=1;i=6893"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"HasComponent","target":"ns=1;i=6896"},{"referenceType":"HasComponent","target":"ns=1;i=6899"},{"referenceType":"HasComponent","target":"ns=1;i=6902"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"HasComponent","target":"ns=1;i=6905"},{"referenceType":"HasComponent","target":"ns=1;i=6908"},{"referenceType":"HasComponent","target":"ns=1;i=6911"},{"referenceType":"HasComponent","target":"ns=1;i=6914"},{"referenceType":"HasComponent","target":"ns=1;i=6917"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=6920"},{"referenceType":"HasComponent","target":"ns=1;i=6923"},{"referenceType":"HasComponent","target":"ns=1;i=6926"},{"referenceType":"HasComponent","target":"ns=1;i=6929"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=6932"},{"referenceType":"HasComponent","target":"ns=1;i=6935"},{"referenceType":"HasComponent","target":"ns=1;i=6938"},{"referenceType":"HasComponent","target":"ns=1;i=6941"},{"referenceType":"HasComponent","target":"ns=1;i=6944"},{"referenceType":"HasComponent","target":"ns=1;i=6947"},{"referenceType":"HasComponent","target":"ns=1;i=6950"},{"referenceType":"HasComponent","target":"ns=1;i=6953"},{"referenceType":"HasComponent","target":"ns=1;i=6956"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:AccessoryLiquidFlow","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the accessory liquid flow, e.g. the buffer fluid flow or operating fluid flow."}],"displayName":[{"value":"AccessoryLiquidFlow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6851","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6959"},{"referenceType":"HasProperty","target":"ns=1;i=6852"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6853"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6959","parentNodeId":"ns=1;i=6851","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6851"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6852","parentNodeId":"ns=1;i=6851","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6851"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6853","parentNodeId":"ns=1;i=6851","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6851"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidHigh","dataType":"Boolean","description":[{"value":"This attribute indicates a high limited accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6854","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12339"},{"referenceType":"HasProperty","target":"ns=1;i=6855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6856"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12339","parentNodeId":"ns=1;i=6854","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6854"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6855","parentNodeId":"ns=1;i=6854","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6854"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6856","parentNodeId":"ns=1;i=6854","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6854"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidLow","dataType":"Boolean","description":[{"value":"This attribute indicates a low limited accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6857","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12342"},{"referenceType":"HasProperty","target":"ns=1;i=6858"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6859"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12342","parentNodeId":"ns=1;i=6857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6857"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6858","parentNodeId":"ns=1;i=6857","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6857"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6859","parentNodeId":"ns=1;i=6857","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6857"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6860","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12345"},{"referenceType":"HasProperty","target":"ns=1;i=6861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6862"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12345","parentNodeId":"ns=1;i=6860","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6860"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6861","parentNodeId":"ns=1;i=6860","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6860"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6862","parentNodeId":"ns=1;i=6860","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6860"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidPressure","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal pressure of the accessory liquid, e.g. the buffer fluid pressure or operating fluid pressure."}],"displayName":[{"value":"AccessoryLiquidPressure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6863","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12348"},{"referenceType":"HasProperty","target":"ns=1;i=6864"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6865"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12348","parentNodeId":"ns=1;i=6863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6863"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6864","parentNodeId":"ns=1;i=6863","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6863"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6865","parentNodeId":"ns=1;i=6863","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6863"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AmbientTemperature","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal ambient temperature."}],"displayName":[{"value":"AmbientTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6866","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12351"},{"referenceType":"HasProperty","target":"ns=1;i=6867"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6868"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12351","parentNodeId":"ns=1;i=6866","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6866"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6867","parentNodeId":"ns=1;i=6866","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6866"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6868","parentNodeId":"ns=1;i=6866","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6866"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CaseOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the case."}],"displayName":[{"value":"CaseOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6869","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12354"},{"referenceType":"HasProperty","target":"ns=1;i=6870"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6871"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12354","parentNodeId":"ns=1;i=6869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6870","parentNodeId":"ns=1;i=6869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6869"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6871","parentNodeId":"ns=1;i=6869","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6869"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ControllerOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a controller."}],"displayName":[{"value":"ControllerOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6872","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12357"},{"referenceType":"HasProperty","target":"ns=1;i=6873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6874"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12357","parentNodeId":"ns=1;i=6872","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6872"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6873","parentNodeId":"ns=1;i=6872","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6872"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6874","parentNodeId":"ns=1;i=6872","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6872"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ConverterOverheat","dataType":"Boolean","description":[{"value":"This property indicates an overheating of a converter."}],"displayName":[{"value":"ConverterOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12084","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12360"},{"referenceType":"HasProperty","target":"ns=1;i=12085"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12086"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12360","parentNodeId":"ns=1;i=12084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12084"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12085","parentNodeId":"ns=1;i=12084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12084"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12086","parentNodeId":"ns=1;i=12084","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12084"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantFlow","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the coolant flow."}],"displayName":[{"value":"CoolantFlow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6875","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12361"},{"referenceType":"HasProperty","target":"ns=1;i=6876"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6877"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12361","parentNodeId":"ns=1;i=6875","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6875"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6876","parentNodeId":"ns=1;i=6875","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6875"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6877","parentNodeId":"ns=1;i=6875","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6875"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantHigh","dataType":"Boolean","description":[{"value":"This attribute indicates that the coolant is high limited."}],"displayName":[{"value":"CoolantHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6878","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12364"},{"referenceType":"HasProperty","target":"ns=1;i=6879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6880"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12364","parentNodeId":"ns=1;i=6878","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6878"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6879","parentNodeId":"ns=1;i=6878","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6878"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6880","parentNodeId":"ns=1;i=6878","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6878"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantLow","dataType":"Boolean","description":[{"value":"This attribute indicates that the coolant is low limited."}],"displayName":[{"value":"CoolantLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6881","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12367"},{"referenceType":"HasProperty","target":"ns=1;i=6882"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6883"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12367","parentNodeId":"ns=1;i=6881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6882","parentNodeId":"ns=1;i=6881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6881"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6883","parentNodeId":"ns=1;i=6881","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6881"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the coolant liquid."}],"displayName":[{"value":"CoolantOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6884","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12370"},{"referenceType":"HasProperty","target":"ns=1;i=6885"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6886"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12370","parentNodeId":"ns=1;i=6884","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6884"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6885","parentNodeId":"ns=1;i=6884","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6884"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6886","parentNodeId":"ns=1;i=6884","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6884"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Deceleration","dataType":"Boolean","description":[{"value":"This attribute indicates a deceleration of a pump."}],"displayName":[{"value":"Deceleration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6887","parentNodeId":"ns=1;i=1016","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=12373"},{"referenceType":"HasProperty","target":"ns=1;i=6888"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6889"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12373","parentNodeId":"ns=1;i=6887","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6887"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6888","parentNodeId":"ns=1;i=6887","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6887"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6889","parentNodeId":"ns=1;i=6887","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6887"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DirtyImpeller","dataType":"Boolean","description":[{"value":"This attribute indicates a dirty impeller."}],"displayName":[{"value":"DirtyImpeller"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6890","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12376"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6891"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6892"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12376","parentNodeId":"ns=1;i=6890","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6890"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6891","parentNodeId":"ns=1;i=6890","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6890"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6892","parentNodeId":"ns=1;i=6890","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6890"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DriveOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a drive."}],"displayName":[{"value":"DriveOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6893","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12379"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6894"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6895"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12379","parentNodeId":"ns=1;i=6893","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6893"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6894","parentNodeId":"ns=1;i=6893","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6893"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6895","parentNodeId":"ns=1;i=6893","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6893"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GeneratorOperation","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump is working as a generator (in flow)."}],"displayName":[{"value":"GeneratorOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6896","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12382"},{"referenceType":"HasProperty","target":"ns=1;i=6897"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6898"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12382","parentNodeId":"ns=1;i=6896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6897","parentNodeId":"ns=1;i=6896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6896"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6898","parentNodeId":"ns=1;i=6896","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6896"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Leakage","dataType":"Boolean","description":[{"value":"This attribute indicates a leakage problem, e.g. leakage of the mechanical seal."}],"displayName":[{"value":"Leakage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6899","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12385"},{"referenceType":"HasProperty","target":"ns=1;i=6900"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6901"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12385","parentNodeId":"ns=1;i=6899","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6899"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6900","parentNodeId":"ns=1;i=6899","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6899"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6901","parentNodeId":"ns=1;i=6899","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6899"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Lubricant","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the lubricant."}],"displayName":[{"value":"Lubricant"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6902","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12388"},{"referenceType":"HasProperty","target":"ns=1;i=6903"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6904"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12388","parentNodeId":"ns=1;i=6902","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6902"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6903","parentNodeId":"ns=1;i=6902","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6902"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6904","parentNodeId":"ns=1;i=6902","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6902"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumNumberStarts","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum number of pump start cycles is exceeded."}],"displayName":[{"value":"MaximumNumberStarts"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6905","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12391"},{"referenceType":"HasProperty","target":"ns=1;i=6906"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6907"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12391","parentNodeId":"ns=1;i=6905","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6905"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6906","parentNodeId":"ns=1;i=6905","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6905"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6907","parentNodeId":"ns=1;i=6905","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6905"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumOperationTime","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum time of pump operation is exceeded."}],"displayName":[{"value":"MaximumOperationTime"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6908","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12394"},{"referenceType":"HasProperty","target":"ns=1;i=6909"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6910"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12394","parentNodeId":"ns=1;i=6908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6908"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6909","parentNodeId":"ns=1;i=6908","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6908"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6910","parentNodeId":"ns=1;i=6908","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6908"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumStartsAtTime","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum number of pump start cycles per timespan is exceeded."}],"displayName":[{"value":"MaximumStartsAtTime"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6911","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12397"},{"referenceType":"HasProperty","target":"ns=1;i=6912"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6913"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12397","parentNodeId":"ns=1;i=6911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6912","parentNodeId":"ns=1;i=6911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6911"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6913","parentNodeId":"ns=1;i=6911","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6911"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MotorHumidity","dataType":"Boolean","description":[{"value":"This attribute indicates unacceptable humidity in the motor."}],"displayName":[{"value":"MotorHumidity"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6914","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12400"},{"referenceType":"HasProperty","target":"ns=1;i=6915"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6916"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12400","parentNodeId":"ns=1;i=6914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6914"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6915","parentNodeId":"ns=1;i=6914","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6914"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6916","parentNodeId":"ns=1;i=6914","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6914"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MotorOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a motor."}],"displayName":[{"value":"MotorOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6917","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12403"},{"referenceType":"HasProperty","target":"ns=1;i=6918"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6919"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12403","parentNodeId":"ns=1;i=6917","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6917"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6918","parentNodeId":"ns=1;i=6917","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6917"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6919","parentNodeId":"ns=1;i=6917","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6917"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OperationFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic operation problem of a pump."}],"displayName":[{"value":"OperationFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6920","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12406"},{"referenceType":"HasProperty","target":"ns=1;i=6921"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6922"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12406","parentNodeId":"ns=1;i=6920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6920"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6921","parentNodeId":"ns=1;i=6920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6920"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6922","parentNodeId":"ns=1;i=6920","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6920"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverLoad","dataType":"Boolean","description":[{"value":"This attribute indicates an over load."}],"displayName":[{"value":"OverLoad"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6923","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12409"},{"referenceType":"HasProperty","target":"ns=1;i=6924"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6925"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12409","parentNodeId":"ns=1;i=6923","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6923"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6924","parentNodeId":"ns=1;i=6923","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6923"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6925","parentNodeId":"ns=1;i=6923","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6923"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverSpeed","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump operates over normal speed."}],"displayName":[{"value":"OverSpeed"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6926","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12412"},{"referenceType":"HasProperty","target":"ns=1;i=6927"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6928"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12412","parentNodeId":"ns=1;i=6926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6927","parentNodeId":"ns=1;i=6926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6926"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6928","parentNodeId":"ns=1;i=6926","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6926"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PartialLoad","dataType":"Boolean","description":[{"value":"This attribute indicates a partial load."}],"displayName":[{"value":"PartialLoad"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6929","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12415"},{"referenceType":"HasProperty","target":"ns=1;i=6930"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6931"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12415","parentNodeId":"ns=1;i=6929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6930","parentNodeId":"ns=1;i=6929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6929"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6931","parentNodeId":"ns=1;i=6929","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6929"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Synchronisation","dataType":"Boolean","description":[{"value":"This attribute indicates a synchronization problem of a pump."}],"displayName":[{"value":"Synchronisation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6932","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12418"},{"referenceType":"HasProperty","target":"ns=1;i=6933"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6934"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12418","parentNodeId":"ns=1;i=6932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6933","parentNodeId":"ns=1;i=6932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6932"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6934","parentNodeId":"ns=1;i=6932","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6932"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TemperatureFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic temperature problem of a pump."}],"displayName":[{"value":"TemperatureFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6935","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12421"},{"referenceType":"HasProperty","target":"ns=1;i=6936"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6937"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12421","parentNodeId":"ns=1;i=6935","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6935"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6936","parentNodeId":"ns=1;i=6935","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6935"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6937","parentNodeId":"ns=1;i=6935","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6935"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TimeOut","dataType":"Boolean","description":[{"value":"This attribute indicates a start up time out."}],"displayName":[{"value":"TimeOut"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6938","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12424"},{"referenceType":"HasProperty","target":"ns=1;i=6939"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6940"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12424","parentNodeId":"ns=1;i=6938","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6938"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6939","parentNodeId":"ns=1;i=6938","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6938"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6940","parentNodeId":"ns=1;i=6938","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6938"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TMSFailure","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the temperature management system."}],"displayName":[{"value":"TMSFailure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6941","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12427"},{"referenceType":"HasProperty","target":"ns=1;i=6942"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6943"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12427","parentNodeId":"ns=1;i=6941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6942","parentNodeId":"ns=1;i=6941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6941"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6943","parentNodeId":"ns=1;i=6941","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6941"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TorqueLimit","dataType":"Boolean","description":[{"value":"This attribute indicates a limitation problem of a pump."}],"displayName":[{"value":"TorqueLimit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6944","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12430"},{"referenceType":"HasProperty","target":"ns=1;i=6945"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasProperty","target":"ns=1;i=6946"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12430","parentNodeId":"ns=1;i=6944","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6944"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6945","parentNodeId":"ns=1;i=6944","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6944"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6946","parentNodeId":"ns=1;i=6944","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6944"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TurbineOperation","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump is working as a turbine (reverse flow)."}],"displayName":[{"value":"TurbineOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6947","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12433"},{"referenceType":"HasProperty","target":"ns=1;i=6948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6949"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12433","parentNodeId":"ns=1;i=6947","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6947"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6948","parentNodeId":"ns=1;i=6947","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6947"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6949","parentNodeId":"ns=1;i=6947","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6947"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:UnderSpeed","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump operates under normal speed."}],"displayName":[{"value":"UnderSpeed"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6950","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12436"},{"referenceType":"HasProperty","target":"ns=1;i=6951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6952"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12436","parentNodeId":"ns=1;i=6950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6951","parentNodeId":"ns=1;i=6950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6950"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6952","parentNodeId":"ns=1;i=6950","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6950"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VelocityLimit","dataType":"Boolean","description":[{"value":"This attribute indicates a limitation problem of a pump."}],"displayName":[{"value":"VelocityLimit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6953","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12439"},{"referenceType":"HasProperty","target":"ns=1;i=6954"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6955"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12439","parentNodeId":"ns=1;i=6953","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6953"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6954","parentNodeId":"ns=1;i=6953","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6953"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6955","parentNodeId":"ns=1;i=6953","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6953"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveExhausted","dataType":"Boolean","description":[{"value":"This attribute indicates that the wear reserve of the pump is exhausted."}],"displayName":[{"value":"WearReserveExhausted"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6956","parentNodeId":"ns=1;i=1016","references":[{"referenceType":"HasProperty","target":"ns=1;i=12442"},{"referenceType":"HasProperty","target":"ns=1;i=6957"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6958"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1016"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12442","parentNodeId":"ns=1;i=6956","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6956"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6957","parentNodeId":"ns=1;i=6956","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6956"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6958","parentNodeId":"ns=1;i=6956","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6956"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionSoftwareType","description":[{"value":"Supervision software specifies supervising information related to device software."}],"displayName":[{"value":"SupervisionSoftwareType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.14","nodeClass":"ObjectType","nodeId":"ns=1;i=1014","references":[{"referenceType":"HasComponent","target":"ns=1;i=6788"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15441"},{"referenceType":"HasComponent","target":"ns=1;i=6791"},{"referenceType":"HasComponent","target":"ns=1;i=6794"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15292"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15739"},{"referenceType":"HasComponent","target":"ns=1;i=6797"},{"referenceType":"GeneratesEvent","target":"ns=3;i=15590"},{"referenceType":"HasComponent","target":"ns=1;i=6800"},{"referenceType":"HasComponent","target":"ns=1;i=6803"},{"referenceType":"HasComponent","target":"ns=1;i=6806"},{"referenceType":"HasComponent","target":"ns=1;i=6809"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:Application","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in application software."}],"displayName":[{"value":"Application"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6788","parentNodeId":"ns=1;i=1014","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=12445"},{"referenceType":"HasProperty","target":"ns=1;i=6789"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6790"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12445","parentNodeId":"ns=1;i=6788","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6788"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6789","parentNodeId":"ns=1;i=6788","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6788"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6790","parentNodeId":"ns=1;i=6788","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6788"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Communication","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in communication software."}],"displayName":[{"value":"Communication"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6791","parentNodeId":"ns=1;i=1014","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=12448"},{"referenceType":"HasProperty","target":"ns=1;i=6792"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6793"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12448","parentNodeId":"ns=1;i=6791","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6791"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6792","parentNodeId":"ns=1;i=6791","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6791"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6793","parentNodeId":"ns=1;i=6791","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6791"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Control","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in control software."}],"displayName":[{"value":"Control"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6794","parentNodeId":"ns=1;i=1014","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=12451"},{"referenceType":"HasProperty","target":"ns=1;i=6795"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6796"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12451","parentNodeId":"ns=1;i=6794","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6794"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6795","parentNodeId":"ns=1;i=6794","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6794"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6796","parentNodeId":"ns=1;i=6794","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6794"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Memory","dataType":"Boolean","description":[{"value":"This attribute indicates a memory resource problem."}],"displayName":[{"value":"Memory"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6797","parentNodeId":"ns=1;i=1014","references":[{"referenceType":"HasProperty","target":"ns=1;i=12454"},{"referenceType":"HasProperty","target":"ns=1;i=6798"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6799"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12454","parentNodeId":"ns=1;i=6797","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6797"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6798","parentNodeId":"ns=1;i=6797","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6797"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6799","parentNodeId":"ns=1;i=6797","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6797"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OS","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of operation system software."}],"displayName":[{"value":"OS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6800","parentNodeId":"ns=1;i=1014","references":[{"referenceType":"HasProperty","target":"ns=1;i=12457"},{"referenceType":"HasProperty","target":"ns=1;i=6801"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=6802"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12457","parentNodeId":"ns=1;i=6800","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6800"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6801","parentNodeId":"ns=1;i=6800","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6800"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6802","parentNodeId":"ns=1;i=6800","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6800"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Parameter","dataType":"Boolean","description":[{"value":"This attribute indicates a parameter problem."}],"displayName":[{"value":"Parameter"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6803","parentNodeId":"ns=1;i=1014","references":[{"referenceType":"HasProperty","target":"ns=1;i=12460"},{"referenceType":"HasProperty","target":"ns=1;i=6804"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=6805"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12460","parentNodeId":"ns=1;i=6803","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6803"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6804","parentNodeId":"ns=1;i=6803","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6803"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6805","parentNodeId":"ns=1;i=6803","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6803"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SoftwareFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of device software."}],"displayName":[{"value":"SoftwareFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6806","parentNodeId":"ns=1;i=1014","references":[{"referenceType":"HasProperty","target":"ns=1;i=12463"},{"referenceType":"HasProperty","target":"ns=1;i=6807"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=6808"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12463","parentNodeId":"ns=1;i=6806","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6806"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6807","parentNodeId":"ns=1;i=6806","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6806"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6808","parentNodeId":"ns=1;i=6806","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6806"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SoftwareReset","dataType":"Boolean","description":[{"value":"This attribute indicates a software reset."}],"displayName":[{"value":"SoftwareReset"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6809","parentNodeId":"ns=1;i=1014","references":[{"referenceType":"HasProperty","target":"ns=1;i=12466"},{"referenceType":"HasProperty","target":"ns=1;i=6810"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1014"},{"referenceType":"HasProperty","target":"ns=1;i=6811"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12466","parentNodeId":"ns=1;i=6809","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6809"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6810","parentNodeId":"ns=1;i=6809","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6809"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6811","parentNodeId":"ns=1;i=6809","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6809"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionType","displayName":[{"value":"SupervisionType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.11","nodeClass":"ObjectType","nodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasComponent","target":"ns=1;i=5054"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"browseName":"1:SupervisionAuxiliaryDevice","description":[{"value":"Supervision auxiliary device specifies information for monitoring an additional device."}],"displayName":[{"value":"SupervisionAuxiliaryDevice"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5020","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=6046"},{"referenceType":"HasComponent","target":"ns=1;i=6049"},{"referenceType":"HasComponent","target":"ns=1;i=6052"},{"referenceType":"HasComponent","target":"ns=1;i=6055"},{"referenceType":"HasComponent","target":"ns=1;i=6058"},{"referenceType":"HasComponent","target":"ns=1;i=6061"},{"referenceType":"HasComponent","target":"ns=1;i=7008"},{"referenceType":"HasComponent","target":"ns=1;i=7011"},{"referenceType":"HasComponent","target":"ns=1;i=7276"},{"referenceType":"HasComponent","target":"ns=1;i=7280"},{"referenceType":"HasComponent","target":"ns=1;i=7283"},{"referenceType":"HasComponent","target":"ns=1;i=7286"},{"referenceType":"HasComponent","target":"ns=1;i=7289"},{"referenceType":"HasComponent","target":"ns=1;i=7292"},{"referenceType":"HasComponent","target":"ns=1;i=7295"},{"referenceType":"HasComponent","target":"ns=1;i=7298"},{"referenceType":"HasComponent","target":"ns=1;i=7301"},{"referenceType":"HasComponent","target":"ns=1;i=7304"},{"referenceType":"HasComponent","target":"ns=1;i=7307"},{"referenceType":"HasComponent","target":"ns=1;i=7310"},{"referenceType":"HasComponent","target":"ns=1;i=7313"},{"referenceType":"HasComponent","target":"ns=1;i=7316"},{"referenceType":"HasComponent","target":"ns=1;i=7319"},{"referenceType":"HasComponent","target":"ns=1;i=7322"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7325"},{"referenceType":"HasComponent","target":"ns=1;i=7328"},{"referenceType":"HasComponent","target":"ns=1;i=7331"},{"referenceType":"HasComponent","target":"ns=1;i=7334"},{"referenceType":"HasComponent","target":"ns=1;i=7337"},{"referenceType":"HasComponent","target":"ns=1;i=7340"},{"referenceType":"HasComponent","target":"ns=1;i=7343"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1017"},{"referenceType":"HasComponent","target":"ns=1;i=7346"},{"referenceType":"HasComponent","target":"ns=1;i=7349"},{"referenceType":"HasComponent","target":"ns=1;i=7352"},{"referenceType":"HasComponent","target":"ns=1;i=7355"}],"typeDefinition":"ns=1;i=1017"},{"accessLevel":5,"browseName":"1:ActuatorElement","dataType":"Boolean","description":[{"value":"This property indicates a fault in an actuator element."}],"displayName":[{"value":"ActuatorElement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6046","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7358"},{"referenceType":"HasProperty","target":"ns=1;i=6047"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6048"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7358","parentNodeId":"ns=1;i=6046","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6046"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6047","parentNodeId":"ns=1;i=6046","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6046"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6048","parentNodeId":"ns=1;i=6046","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6046"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AmbientTemperature","dataType":"Boolean","description":[{"value":"This property indicates an abnormal ambient temperature."}],"displayName":[{"value":"AmbientTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6049","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7359"},{"referenceType":"HasProperty","target":"ns=1;i=6050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6051"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7359","parentNodeId":"ns=1;i=6049","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6049"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6050","parentNodeId":"ns=1;i=6049","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6049"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6051","parentNodeId":"ns=1;i=6049","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6049"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryDeviceFault","dataType":"Boolean","description":[{"value":"This property indicates a generic failure of an auxiliary device."}],"displayName":[{"value":"AuxiliaryDeviceFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6052","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7360"},{"referenceType":"HasProperty","target":"ns=1;i=6053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6054"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7360","parentNodeId":"ns=1;i=6052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6053","parentNodeId":"ns=1;i=6052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6052"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6054","parentNodeId":"ns=1;i=6052","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6052"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryMediumAbsence","dataType":"Boolean","description":[{"value":"This property indicates an absence of or wrong auxiliary medium."}],"displayName":[{"value":"AuxiliaryMediumAbsence"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6055","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7361"},{"referenceType":"HasProperty","target":"ns=1;i=6056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6057"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7361","parentNodeId":"ns=1;i=6055","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6056","parentNodeId":"ns=1;i=6055","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6055"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6057","parentNodeId":"ns=1;i=6055","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6055"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryMediumInsufficiency","dataType":"Boolean","description":[{"value":"This property indicates an insufficiency of auxiliary medium."}],"displayName":[{"value":"AuxiliaryMediumInsufficiency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6058","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7362"},{"referenceType":"HasProperty","target":"ns=1;i=6059"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=6060"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7362","parentNodeId":"ns=1;i=6058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6059","parentNodeId":"ns=1;i=6058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6058"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6060","parentNodeId":"ns=1;i=6058","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6058"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryPowerPole","dataType":"Boolean","description":[{"value":"This property indicates an auxiliary power supply wrongly poled."}],"displayName":[{"value":"AuxiliaryPowerPole"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6061","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7363"},{"referenceType":"HasProperty","target":"ns=1;i=6062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7007"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7363","parentNodeId":"ns=1;i=6061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6061"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6062","parentNodeId":"ns=1;i=6061","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6061"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7007","parentNodeId":"ns=1;i=6061","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=6061"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryPowerRange","dataType":"Boolean","description":[{"value":"This property indicates an off-spec of the auxiliary power range."}],"displayName":[{"value":"AuxiliaryPowerRange"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7008","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7364"},{"referenceType":"HasProperty","target":"ns=1;i=7009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7010"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7364","parentNodeId":"ns=1;i=7008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7008"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7009","parentNodeId":"ns=1;i=7008","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7008"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7010","parentNodeId":"ns=1;i=7008","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7008"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CommunicationError","dataType":"Boolean","description":[{"value":"This property indicates a communication error."}],"displayName":[{"value":"CommunicationError"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7011","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7365"},{"referenceType":"HasProperty","target":"ns=1;i=7012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7275"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7365","parentNodeId":"ns=1;i=7011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7012","parentNodeId":"ns=1;i=7011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7011"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7275","parentNodeId":"ns=1;i=7011","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7011"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Corrosion","dataType":"Boolean","description":[{"value":"This property indicates corrosion/abrasion in parts in contact with medium."}],"displayName":[{"value":"Corrosion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7276","parentNodeId":"ns=1;i=5020","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7366"},{"referenceType":"HasProperty","target":"ns=1;i=7277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7279"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7366","parentNodeId":"ns=1;i=7276","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7276"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7277","parentNodeId":"ns=1;i=7276","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7276"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7279","parentNodeId":"ns=1;i=7276","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7276"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Deviation","dataType":"Boolean","description":[{"value":"This property indicates an inadmissible deviation from measurement."}],"displayName":[{"value":"Deviation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7280","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7367"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7282"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7367","parentNodeId":"ns=1;i=7280","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7280"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7281","parentNodeId":"ns=1;i=7280","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7280"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7282","parentNodeId":"ns=1;i=7280","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7280"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectromagneticInterference","dataType":"Boolean","description":[{"value":"This property indicates an abnormal electromagnetic interference."}],"displayName":[{"value":"ElectromagneticInterference"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7283","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7368"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7284"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7285"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7368","parentNodeId":"ns=1;i=7283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7283"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7284","parentNodeId":"ns=1;i=7283","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7283"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7285","parentNodeId":"ns=1;i=7283","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7283"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectronicFault","dataType":"Boolean","description":[{"value":"This property indicates a fault in the device electronics."}],"displayName":[{"value":"ElectronicFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7286","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7369"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7288"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7369","parentNodeId":"ns=1;i=7286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7286"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7287","parentNodeId":"ns=1;i=7286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7286"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7288","parentNodeId":"ns=1;i=7286","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7286"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:EnergySupply","dataType":"Boolean","description":[{"value":"This property indicates an error in internal energy supply."}],"displayName":[{"value":"EnergySupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7289","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7370"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7290"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7291"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7370","parentNodeId":"ns=1;i=7289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7290","parentNodeId":"ns=1;i=7289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7289"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7291","parentNodeId":"ns=1;i=7289","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7289"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:EvaluationElectronics","dataType":"Boolean","description":[{"value":"This property indicates an error in evaluation electronics."}],"displayName":[{"value":"EvaluationElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7292","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7371"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7293"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7294"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7371","parentNodeId":"ns=1;i=7292","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7292"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7293","parentNodeId":"ns=1;i=7292","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7292"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7294","parentNodeId":"ns=1;i=7292","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7292"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ExciterError","dataType":"Boolean","description":[{"value":"This property indicates an error in the exciter of the sensor element."}],"displayName":[{"value":"ExciterError"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7295","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7372"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7296"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7297"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7372","parentNodeId":"ns=1;i=7295","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7295"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7296","parentNodeId":"ns=1;i=7295","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7295"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7297","parentNodeId":"ns=1;i=7295","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7295"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Fouling","dataType":"Boolean","description":[{"value":"This property indicates a fouling on sensor element."}],"displayName":[{"value":"Fouling"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7298","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7373"},{"referenceType":"HasProperty","target":"ns=1;i=7299"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7300"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7373","parentNodeId":"ns=1;i=7298","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7298"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7299","parentNodeId":"ns=1;i=7298","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7298"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7300","parentNodeId":"ns=1;i=7298","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7298"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:HumidityElectronics","dataType":"Boolean","description":[{"value":"This property indicates an abnormal amount of humidity in electronics area."}],"displayName":[{"value":"HumidityElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7301","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7374"},{"referenceType":"HasProperty","target":"ns=1;i=7302"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7303"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7374","parentNodeId":"ns=1;i=7301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7301"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7302","parentNodeId":"ns=1;i=7301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7301"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7303","parentNodeId":"ns=1;i=7301","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7301"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Installation","dataType":"Boolean","description":[{"value":"This property indicates an installation fault."}],"displayName":[{"value":"Installation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7304","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7375"},{"referenceType":"HasProperty","target":"ns=1;i=7305"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7306"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7375","parentNodeId":"ns=1;i=7304","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7304"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7305","parentNodeId":"ns=1;i=7304","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7304"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7306","parentNodeId":"ns=1;i=7304","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7304"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Interruption","dataType":"Boolean","description":[{"value":"This property indicates an interruption of signal path or short circuit."}],"displayName":[{"value":"Interruption"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7307","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7376"},{"referenceType":"HasProperty","target":"ns=1;i=7308"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7309"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7376","parentNodeId":"ns=1;i=7307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7307"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7308","parentNodeId":"ns=1;i=7307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7307"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7309","parentNodeId":"ns=1;i=7307","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7307"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:LineLength","dataType":"Boolean","description":[{"value":"This property indicates that the maximum line length is exceeded."}],"displayName":[{"value":"LineLength"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7310","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7377"},{"referenceType":"HasProperty","target":"ns=1;i=7311"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7312"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7377","parentNodeId":"ns=1;i=7310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7310"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7311","parentNodeId":"ns=1;i=7310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7310"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7312","parentNodeId":"ns=1;i=7310","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7310"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaterialElectronics","dataType":"Boolean","description":[{"value":"This property indicates a foreign material in electronics area."}],"displayName":[{"value":"MaterialElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7313","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7378"},{"referenceType":"HasProperty","target":"ns=1;i=7314"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7315"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7378","parentNodeId":"ns=1;i=7313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7313"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7314","parentNodeId":"ns=1;i=7313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7313"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7315","parentNodeId":"ns=1;i=7313","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7313"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MeasuredMaterialElectronics","dataType":"Boolean","description":[{"value":"This property indicates measured material in electronics area."}],"displayName":[{"value":"MeasuredMaterialElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7316","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7379"},{"referenceType":"HasProperty","target":"ns=1;i=7317"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7318"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7379","parentNodeId":"ns=1;i=7316","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7316"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7317","parentNodeId":"ns=1;i=7316","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7316"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7318","parentNodeId":"ns=1;i=7316","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7316"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MechanicalDamage","dataType":"Boolean","description":[{"value":"This property indicates a mechanical damage."}],"displayName":[{"value":"MechanicalDamage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7319","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7380"},{"referenceType":"HasProperty","target":"ns=1;i=7320"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7321"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7380","parentNodeId":"ns=1;i=7319","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7319"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7320","parentNodeId":"ns=1;i=7319","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7319"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7321","parentNodeId":"ns=1;i=7319","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7319"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OperatingConditions","dataType":"Boolean","description":[{"value":"This property indicates a fault due to non-compliance with specified operating conditions."}],"displayName":[{"value":"OperatingConditions"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7322","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7381"},{"referenceType":"HasProperty","target":"ns=1;i=7323"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7324"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7381","parentNodeId":"ns=1;i=7322","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7322"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7323","parentNodeId":"ns=1;i=7322","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7322"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7324","parentNodeId":"ns=1;i=7322","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7322"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Other","dataType":"Boolean","description":[{"value":"This property indicates other faults."}],"displayName":[{"value":"Other"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7325","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7382"},{"referenceType":"HasProperty","target":"ns=1;i=7326"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7327"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7382","parentNodeId":"ns=1;i=7325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7326","parentNodeId":"ns=1;i=7325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7325"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7327","parentNodeId":"ns=1;i=7325","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7325"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Overloading","dataType":"Boolean","description":[{"value":"This property indicates an overloading."}],"displayName":[{"value":"Overloading"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7328","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7383"},{"referenceType":"HasProperty","target":"ns=1;i=7329"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7330"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7383","parentNodeId":"ns=1;i=7328","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7328"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7329","parentNodeId":"ns=1;i=7328","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7328"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7330","parentNodeId":"ns=1;i=7328","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7328"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ParameterSetting","dataType":"Boolean","description":[{"value":"This property indicates a parameter setting error."}],"displayName":[{"value":"ParameterSetting"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7331","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7384"},{"referenceType":"HasProperty","target":"ns=1;i=7332"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7333"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7384","parentNodeId":"ns=1;i=7331","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7331"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7332","parentNodeId":"ns=1;i=7331","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7331"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7333","parentNodeId":"ns=1;i=7331","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7331"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Peripheral","dataType":"Boolean","description":[{"value":"This property indicates an error in peripherals."}],"displayName":[{"value":"Peripheral"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7334","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7385"},{"referenceType":"HasProperty","target":"ns=1;i=7335"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7336"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7385","parentNodeId":"ns=1;i=7334","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7334"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7335","parentNodeId":"ns=1;i=7334","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7334"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7336","parentNodeId":"ns=1;i=7334","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7334"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ProcessInfluence","dataType":"Boolean","description":[{"value":"This property indicates a fault due to process influence."}],"displayName":[{"value":"ProcessInfluence"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7337","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7386"},{"referenceType":"HasProperty","target":"ns=1;i=7338"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7339"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7386","parentNodeId":"ns=1;i=7337","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7337"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7338","parentNodeId":"ns=1;i=7337","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7337"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7339","parentNodeId":"ns=1;i=7337","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7337"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SensorElement","dataType":"Boolean","description":[{"value":"This property indicates a fault in a sensor element."}],"displayName":[{"value":"SensorElement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7340","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7387"},{"referenceType":"HasProperty","target":"ns=1;i=7341"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7342"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7387","parentNodeId":"ns=1;i=7340","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7340"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7341","parentNodeId":"ns=1;i=7340","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7340"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7342","parentNodeId":"ns=1;i=7340","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7340"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:StartUp","dataType":"Boolean","description":[{"value":"This property indicate an installation fault or fault during start-up."}],"displayName":[{"value":"StartUp"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7343","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7388"},{"referenceType":"HasProperty","target":"ns=1;i=7344"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7345"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7388","parentNodeId":"ns=1;i=7343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7343"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7344","parentNodeId":"ns=1;i=7343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7343"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7345","parentNodeId":"ns=1;i=7343","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7343"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TemperatureShock","dataType":"Boolean","description":[{"value":"This property indicates an excessive temperature shock."}],"displayName":[{"value":"TemperatureShock"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7346","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7389"},{"referenceType":"HasProperty","target":"ns=1;i=7347"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"},{"referenceType":"HasProperty","target":"ns=1;i=7348"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7389","parentNodeId":"ns=1;i=7346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7346"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7347","parentNodeId":"ns=1;i=7346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7346"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7348","parentNodeId":"ns=1;i=7346","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7346"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Vibration","dataType":"Boolean","description":[{"value":"This property indicates an excessive vibration or impact load."}],"displayName":[{"value":"Vibration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7349","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7390"},{"referenceType":"HasProperty","target":"ns=1;i=7350"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7351"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7390","parentNodeId":"ns=1;i=7349","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7349"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7350","parentNodeId":"ns=1;i=7349","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7349"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7351","parentNodeId":"ns=1;i=7349","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7349"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveOperation","dataType":"Boolean","description":[{"value":"This property indicates that the wear reserve is used up by operation."}],"displayName":[{"value":"WearReserveOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7352","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7391"},{"referenceType":"HasProperty","target":"ns=1;i=7353"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7354"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7391","parentNodeId":"ns=1;i=7352","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7352"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7353","parentNodeId":"ns=1;i=7352","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7352"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7354","parentNodeId":"ns=1;i=7352","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7352"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveWear","dataType":"Boolean","description":[{"value":"This property indicates that the wear reserve is used up by wear."}],"displayName":[{"value":"WearReserveWear"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7355","parentNodeId":"ns=1;i=5020","references":[{"referenceType":"HasProperty","target":"ns=1;i=7392"},{"referenceType":"HasProperty","target":"ns=1;i=7356"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7357"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5020"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7392","parentNodeId":"ns=1;i=7355","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7355"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7356","parentNodeId":"ns=1;i=7355","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7355"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7357","parentNodeId":"ns=1;i=7355","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7355"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionElectronics","description":[{"value":"Supervision Electrics specifies information for monitoring the electronics."}],"displayName":[{"value":"SupervisionElectronics"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5021","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=7393"},{"referenceType":"HasComponent","target":"ns=1;i=7396"},{"referenceType":"HasComponent","target":"ns=1;i=7399"},{"referenceType":"HasComponent","target":"ns=1;i=7402"},{"referenceType":"HasComponent","target":"ns=1;i=7405"},{"referenceType":"HasComponent","target":"ns=1;i=7408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7411"},{"referenceType":"HasComponent","target":"ns=1;i=7414"},{"referenceType":"HasComponent","target":"ns=1;i=7417"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1018"},{"referenceType":"HasComponent","target":"ns=1;i=7420"},{"referenceType":"HasComponent","target":"ns=1;i=7423"},{"referenceType":"HasComponent","target":"ns=1;i=7426"},{"referenceType":"HasComponent","target":"ns=1;i=7429"},{"referenceType":"HasComponent","target":"ns=1;i=7432"},{"referenceType":"HasComponent","target":"ns=1;i=7435"},{"referenceType":"HasComponent","target":"ns=1;i=7438"},{"referenceType":"HasComponent","target":"ns=1;i=7441"},{"referenceType":"HasComponent","target":"ns=1;i=7444"},{"referenceType":"HasComponent","target":"ns=1;i=7447"},{"referenceType":"HasComponent","target":"ns=1;i=7450"}],"typeDefinition":"ns=1;i=1018"},{"accessLevel":5,"browseName":"1:ArmatureCircuit","dataType":"Boolean","description":[{"value":"This property indicates a failure in armature circuit."}],"displayName":[{"value":"ArmatureCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7393","parentNodeId":"ns=1;i=5021","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7453"},{"referenceType":"HasProperty","target":"ns=1;i=7394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7395"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7453","parentNodeId":"ns=1;i=7393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7394","parentNodeId":"ns=1;i=7393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7393"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7395","parentNodeId":"ns=1;i=7393","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7393"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CurrentInsideDevice","dataType":"Boolean","description":[{"value":"This property indicates unacceptable current inside the device."}],"displayName":[{"value":"CurrentInsideDevice"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7396","parentNodeId":"ns=1;i=5021","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7454"},{"referenceType":"HasProperty","target":"ns=1;i=7397"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7398"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7454","parentNodeId":"ns=1;i=7396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7396"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7397","parentNodeId":"ns=1;i=7396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7396"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7398","parentNodeId":"ns=1;i=7396","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7396"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectricalFault","dataType":"Boolean","description":[{"value":"This property indicates a generic electrical fault."}],"displayName":[{"value":"ElectricalFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7399","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7455"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7400"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7401"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7455","parentNodeId":"ns=1;i=7399","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7399"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7400","parentNodeId":"ns=1;i=7399","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7399"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7401","parentNodeId":"ns=1;i=7399","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7399"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:FieldCircuit","dataType":"Boolean","description":[{"value":"This property indicates a failure in field circuit."}],"displayName":[{"value":"FieldCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7402","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7456"},{"referenceType":"HasProperty","target":"ns=1;i=7403"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7404"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7456","parentNodeId":"ns=1;i=7402","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7402"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7403","parentNodeId":"ns=1;i=7402","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7402"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7404","parentNodeId":"ns=1;i=7402","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7402"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:InstallationFault","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable electrical installation, e.g. mixed up phases."}],"displayName":[{"value":"InstallationFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7405","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7457"},{"referenceType":"HasProperty","target":"ns=1;i=7406"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7407"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7457","parentNodeId":"ns=1;i=7405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7406","parentNodeId":"ns=1;i=7405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7405"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7407","parentNodeId":"ns=1;i=7405","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7405"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:InsulationResistance","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable low winding resistance."}],"displayName":[{"value":"InsulationResistance"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7408","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7458"},{"referenceType":"HasProperty","target":"ns=1;i=7409"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7410"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7458","parentNodeId":"ns=1;i=7408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7409","parentNodeId":"ns=1;i=7408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7408"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7410","parentNodeId":"ns=1;i=7408","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7408"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PhaseFailure","dataType":"Boolean","description":[{"value":"This property indicates a phase failure."}],"displayName":[{"value":"PhaseFailure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7411","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7459"},{"referenceType":"HasProperty","target":"ns=1;i=7412"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7413"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7459","parentNodeId":"ns=1;i=7411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7412","parentNodeId":"ns=1;i=7411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7411"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7413","parentNodeId":"ns=1;i=7411","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7411"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ShortCircuit","dataType":"Boolean","description":[{"value":"This property indicates a short circuit."}],"displayName":[{"value":"ShortCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7414","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7460"},{"referenceType":"HasProperty","target":"ns=1;i=7415"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7416"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7460","parentNodeId":"ns=1;i=7414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7415","parentNodeId":"ns=1;i=7414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7414"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7416","parentNodeId":"ns=1;i=7414","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7414"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ShortToEarth","dataType":"Boolean","description":[{"value":"This property indicates a short to earth."}],"displayName":[{"value":"ShortToEarth"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7417","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7461"},{"referenceType":"HasProperty","target":"ns=1;i=7418"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7419"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7461","parentNodeId":"ns=1;i=7417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7418","parentNodeId":"ns=1;i=7417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7417"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7419","parentNodeId":"ns=1;i=7417","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7417"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrent","dataType":"Boolean","description":[{"value":"This property indicates a failure of supply current."}],"displayName":[{"value":"SupplyCurrent"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7420","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7462"},{"referenceType":"HasProperty","target":"ns=1;i=7421"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7422"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7462","parentNodeId":"ns=1;i=7420","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7420"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7421","parentNodeId":"ns=1;i=7420","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7420"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7422","parentNodeId":"ns=1;i=7420","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7420"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrentHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply current."}],"displayName":[{"value":"SupplyCurrentHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7423","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7463"},{"referenceType":"HasProperty","target":"ns=1;i=7424"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7425"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7463","parentNodeId":"ns=1;i=7423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7424","parentNodeId":"ns=1;i=7423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7423"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7425","parentNodeId":"ns=1;i=7423","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7423"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrentLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply current."}],"displayName":[{"value":"SupplyCurrentLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7426","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7464"},{"referenceType":"HasProperty","target":"ns=1;i=7427"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7428"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7464","parentNodeId":"ns=1;i=7426","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7426"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7427","parentNodeId":"ns=1;i=7426","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7426"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7428","parentNodeId":"ns=1;i=7426","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7426"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequency","dataType":"Boolean","description":[{"value":"This property indicates unacceptable supply frequency."}],"displayName":[{"value":"SupplyFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7429","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7465"},{"referenceType":"HasProperty","target":"ns=1;i=7430"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7431"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7465","parentNodeId":"ns=1;i=7429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7430","parentNodeId":"ns=1;i=7429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7429"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7431","parentNodeId":"ns=1;i=7429","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7429"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequencyHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply frequency."}],"displayName":[{"value":"SupplyFrequencyHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7432","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7466"},{"referenceType":"HasProperty","target":"ns=1;i=7433"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7434"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7466","parentNodeId":"ns=1;i=7432","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7432"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7433","parentNodeId":"ns=1;i=7432","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7432"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7434","parentNodeId":"ns=1;i=7432","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7432"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequencyLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply frequency."}],"displayName":[{"value":"SupplyFrequencyLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7435","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7467"},{"referenceType":"HasProperty","target":"ns=1;i=7436"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7437"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7467","parentNodeId":"ns=1;i=7435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7436","parentNodeId":"ns=1;i=7435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7435"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7437","parentNodeId":"ns=1;i=7435","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7435"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltage","dataType":"Boolean","description":[{"value":"This property indicates a failure of supply voltage."}],"displayName":[{"value":"SupplyVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7438","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7468"},{"referenceType":"HasProperty","target":"ns=1;i=7439"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7440"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7468","parentNodeId":"ns=1;i=7438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7438"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7439","parentNodeId":"ns=1;i=7438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7438"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7440","parentNodeId":"ns=1;i=7438","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7438"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltageHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply voltage."}],"displayName":[{"value":"SupplyVoltageHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7441","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7469"},{"referenceType":"HasProperty","target":"ns=1;i=7442"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7443"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7469","parentNodeId":"ns=1;i=7441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7441"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7442","parentNodeId":"ns=1;i=7441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7441"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7443","parentNodeId":"ns=1;i=7441","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7441"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltageLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply voltage."}],"displayName":[{"value":"SupplyVoltageLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7444","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7470"},{"referenceType":"HasProperty","target":"ns=1;i=7445"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"},{"referenceType":"HasProperty","target":"ns=1;i=7446"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7470","parentNodeId":"ns=1;i=7444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7445","parentNodeId":"ns=1;i=7444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7444"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7446","parentNodeId":"ns=1;i=7444","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7444"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VoltageInsideDevice","dataType":"Boolean","description":[{"value":"This property indicates unacceptable voltage inside the device."}],"displayName":[{"value":"VoltageInsideDevice"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7447","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7471"},{"referenceType":"HasProperty","target":"ns=1;i=7448"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7449"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7471","parentNodeId":"ns=1;i=7447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7448","parentNodeId":"ns=1;i=7447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7447"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7449","parentNodeId":"ns=1;i=7447","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7447"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WindingTemperature","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable winding temperature."}],"displayName":[{"value":"WindingTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7450","parentNodeId":"ns=1;i=5021","references":[{"referenceType":"HasProperty","target":"ns=1;i=7472"},{"referenceType":"HasProperty","target":"ns=1;i=7451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7452"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5021"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7472","parentNodeId":"ns=1;i=7450","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7450"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7451","parentNodeId":"ns=1;i=7450","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7450"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7452","parentNodeId":"ns=1;i=7450","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7450"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionHardware","description":[{"value":"Supervision hardware specifies supervising information related to device hardware."}],"displayName":[{"value":"SupervisionHardware"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5050","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=7473"},{"referenceType":"HasComponent","target":"ns=1;i=7476"},{"referenceType":"HasComponent","target":"ns=1;i=7479"},{"referenceType":"HasComponent","target":"ns=1;i=7482"},{"referenceType":"HasComponent","target":"ns=1;i=7485"},{"referenceType":"HasComponent","target":"ns=1;i=7488"},{"referenceType":"HasComponent","target":"ns=1;i=7491"},{"referenceType":"HasComponent","target":"ns=1;i=7494"},{"referenceType":"HasComponent","target":"ns=1;i=7497"},{"referenceType":"HasComponent","target":"ns=1;i=7500"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7503"},{"referenceType":"HasComponent","target":"ns=1;i=7506"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1013"}],"typeDefinition":"ns=1;i=1013"},{"accessLevel":5,"browseName":"1:Communication","dataType":"Boolean","description":[{"value":"This attribute indicates a communication failure."}],"displayName":[{"value":"Communication"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7473","parentNodeId":"ns=1;i=5050","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7509"},{"referenceType":"HasProperty","target":"ns=1;i=7474"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7475"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7509","parentNodeId":"ns=1;i=7473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7473"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7474","parentNodeId":"ns=1;i=7473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7473"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7475","parentNodeId":"ns=1;i=7473","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7473"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ComputingCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the computing elements of device hardware."}],"displayName":[{"value":"ComputingCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7476","parentNodeId":"ns=1;i=5050","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7510"},{"referenceType":"HasProperty","target":"ns=1;i=7477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7478"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7510","parentNodeId":"ns=1;i=7476","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7476"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7477","parentNodeId":"ns=1;i=7476","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7476"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7478","parentNodeId":"ns=1;i=7476","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7476"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ControlCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the control elements of device hardware."}],"displayName":[{"value":"ControlCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7479","parentNodeId":"ns=1;i=5050","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7511"},{"referenceType":"HasProperty","target":"ns=1;i=7480"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7481"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7511","parentNodeId":"ns=1;i=7479","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7479"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7480","parentNodeId":"ns=1;i=7479","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7479"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7481","parentNodeId":"ns=1;i=7479","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7479"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DCLinkSupply","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the dc power supply of device hardware."}],"displayName":[{"value":"DCLinkSupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7482","parentNodeId":"ns=1;i=5050","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7512"},{"referenceType":"HasProperty","target":"ns=1;i=7483"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7484"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7512","parentNodeId":"ns=1;i=7482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7482"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7483","parentNodeId":"ns=1;i=7482","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7482"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7484","parentNodeId":"ns=1;i=7482","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7482"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Eprom","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of an eprom."}],"displayName":[{"value":"Eprom"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7485","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7513"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7486"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7487"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7513","parentNodeId":"ns=1;i=7485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7485"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7486","parentNodeId":"ns=1;i=7485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7485"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7487","parentNodeId":"ns=1;i=7485","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7485"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:HardwareFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of device hardware."}],"displayName":[{"value":"HardwareFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7488","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7514"},{"referenceType":"HasProperty","target":"ns=1;i=7489"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7490"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7514","parentNodeId":"ns=1;i=7488","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7488"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7489","parentNodeId":"ns=1;i=7488","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7488"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7490","parentNodeId":"ns=1;i=7488","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7488"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:IONA","dataType":"Boolean","description":[{"value":"This attribute indicates a disconnection between processing unit and device."}],"displayName":[{"value":"IONA"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7491","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7515"},{"referenceType":"HasProperty","target":"ns=1;i=7492"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7493"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7515","parentNodeId":"ns=1;i=7491","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7491"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7492","parentNodeId":"ns=1;i=7491","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7491"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7493","parentNodeId":"ns=1;i=7491","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7491"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MeasureCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the measurement elements of device hardware."}],"displayName":[{"value":"MeasureCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7494","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7516"},{"referenceType":"HasProperty","target":"ns=1;i=7495"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7496"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7516","parentNodeId":"ns=1;i=7494","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7494"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7495","parentNodeId":"ns=1;i=7494","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7494"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7496","parentNodeId":"ns=1;i=7494","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7494"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MicroProcessor","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the micro processor."}],"displayName":[{"value":"MicroProcessor"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7497","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7517"},{"referenceType":"HasProperty","target":"ns=1;i=7498"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7499"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7517","parentNodeId":"ns=1;i=7497","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7497"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7498","parentNodeId":"ns=1;i=7497","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7497"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7499","parentNodeId":"ns=1;i=7497","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7497"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:NetworkNA","dataType":"Boolean","description":[{"value":"This attribute indicates a disconnection of the device."}],"displayName":[{"value":"NetworkNA"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7500","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7518"},{"referenceType":"HasProperty","target":"ns=1;i=7501"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7502"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7518","parentNodeId":"ns=1;i=7500","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7500"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7501","parentNodeId":"ns=1;i=7500","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7500"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7502","parentNodeId":"ns=1;i=7500","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7500"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PowerSupply","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the power supply of device hardware."}],"displayName":[{"value":"PowerSupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7503","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7519"},{"referenceType":"HasProperty","target":"ns=1;i=7504"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7505"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7519","parentNodeId":"ns=1;i=7503","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7503"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7504","parentNodeId":"ns=1;i=7503","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7503"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7505","parentNodeId":"ns=1;i=7503","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7503"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Ram","dataType":"Boolean","description":[{"value":"This attribute indicates a ram failure."}],"displayName":[{"value":"Ram"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7506","parentNodeId":"ns=1;i=5050","references":[{"referenceType":"HasProperty","target":"ns=1;i=7520"},{"referenceType":"HasProperty","target":"ns=1;i=7507"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5050"},{"referenceType":"HasProperty","target":"ns=1;i=7508"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7520","parentNodeId":"ns=1;i=7506","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7506"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7507","parentNodeId":"ns=1;i=7506","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7506"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7508","parentNodeId":"ns=1;i=7506","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7506"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionMechanics","description":[{"value":"Supervision mechanics specifies supervising information related to device mechanics."}],"displayName":[{"value":"SupervisionMechanics"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5051","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=7521"},{"referenceType":"HasComponent","target":"ns=1;i=7524"},{"referenceType":"HasComponent","target":"ns=1;i=7527"},{"referenceType":"HasComponent","target":"ns=1;i=7530"},{"referenceType":"HasComponent","target":"ns=1;i=7533"},{"referenceType":"HasComponent","target":"ns=1;i=7536"},{"referenceType":"HasComponent","target":"ns=1;i=7539"},{"referenceType":"HasComponent","target":"ns=1;i=7542"},{"referenceType":"HasComponent","target":"ns=1;i=7545"},{"referenceType":"HasComponent","target":"ns=1;i=7548"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7551"},{"referenceType":"HasComponent","target":"ns=1;i=7554"},{"referenceType":"HasComponent","target":"ns=1;i=7557"},{"referenceType":"HasComponent","target":"ns=1;i=7560"},{"referenceType":"HasComponent","target":"ns=1;i=7563"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1012"},{"referenceType":"HasComponent","target":"ns=1;i=7566"}],"typeDefinition":"ns=1;i=1012"},{"accessLevel":5,"browseName":"1:AxialBearingAbrasion","dataType":"Boolean","description":[{"value":"This attribute indicates an unacceptable abrasion of the axial bearing."}],"displayName":[{"value":"AxialBearingAbrasion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7521","parentNodeId":"ns=1;i=5051","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7569"},{"referenceType":"HasProperty","target":"ns=1;i=7522"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7523"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7569","parentNodeId":"ns=1;i=7521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7521"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7522","parentNodeId":"ns=1;i=7521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7521"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7523","parentNodeId":"ns=1;i=7521","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7521"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AxialBearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the axial bearing."}],"displayName":[{"value":"AxialBearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7524","parentNodeId":"ns=1;i=5051","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7570"},{"referenceType":"HasProperty","target":"ns=1;i=7525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7526"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7570","parentNodeId":"ns=1;i=7524","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7524"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7525","parentNodeId":"ns=1;i=7524","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7524"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7526","parentNodeId":"ns=1;i=7524","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7524"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AxialBearingOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the axial bearing."}],"displayName":[{"value":"AxialBearingOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7527","parentNodeId":"ns=1;i=5051","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7571"},{"referenceType":"HasProperty","target":"ns=1;i=7528"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7529"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7571","parentNodeId":"ns=1;i=7527","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7527"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7528","parentNodeId":"ns=1;i=7527","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7527"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7529","parentNodeId":"ns=1;i=7527","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7527"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic bearing failure."}],"displayName":[{"value":"BearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7530","parentNodeId":"ns=1;i=5051","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7572"},{"referenceType":"HasProperty","target":"ns=1;i=7531"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7532"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7572","parentNodeId":"ns=1;i=7530","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7530"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7531","parentNodeId":"ns=1;i=7530","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7530"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7532","parentNodeId":"ns=1;i=7530","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7530"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BrakeChopper","dataType":"Boolean","description":[{"value":"This attribute indicates a problem of the brake chopper."}],"displayName":[{"value":"BrakeChopper"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7533","parentNodeId":"ns=1;i=5051","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7573"},{"referenceType":"HasProperty","target":"ns=1;i=7534"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7535"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7573","parentNodeId":"ns=1;i=7533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7533"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7534","parentNodeId":"ns=1;i=7533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7533"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7535","parentNodeId":"ns=1;i=7533","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7533"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BrakeOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a brake."}],"displayName":[{"value":"BrakeOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7536","parentNodeId":"ns=1;i=5051","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7574"},{"referenceType":"HasProperty","target":"ns=1;i=7537"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7538"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7574","parentNodeId":"ns=1;i=7536","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7536"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7537","parentNodeId":"ns=1;i=7536","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7536"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7538","parentNodeId":"ns=1;i=7536","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7536"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ExcessVibration","dataType":"Boolean","description":[{"value":"This attribute indicates unacceptable high mechanical vibration."}],"displayName":[{"value":"ExcessVibration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7539","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7575"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7540"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7541"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7575","parentNodeId":"ns=1;i=7539","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7539"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7540","parentNodeId":"ns=1;i=7539","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7539"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7541","parentNodeId":"ns=1;i=7539","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7539"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapWear","dataType":"Boolean","description":[{"value":"This attribute indicates a mechanical wear at gap."}],"displayName":[{"value":"GapWear"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7542","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7576"},{"referenceType":"HasProperty","target":"ns=1;i=7543"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7544"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7576","parentNodeId":"ns=1;i=7542","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7542"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7543","parentNodeId":"ns=1;i=7542","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7542"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7544","parentNodeId":"ns=1;i=7542","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7542"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MechanicalFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic mechanical fault."}],"displayName":[{"value":"MechanicalFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7545","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7577"},{"referenceType":"HasProperty","target":"ns=1;i=7546"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7547"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7577","parentNodeId":"ns=1;i=7545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7545"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7546","parentNodeId":"ns=1;i=7545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7545"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7547","parentNodeId":"ns=1;i=7545","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7545"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Misalignment","dataType":"Boolean","description":[{"value":"This attribute indicates a misalignment."}],"displayName":[{"value":"Misalignment"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7548","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7578"},{"referenceType":"HasProperty","target":"ns=1;i=7549"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7550"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7578","parentNodeId":"ns=1;i=7548","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7548"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7549","parentNodeId":"ns=1;i=7548","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7548"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7550","parentNodeId":"ns=1;i=7548","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7548"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingAbrasion","dataType":"Boolean","description":[{"value":"This attribute indicates an unacceptable abrasion of the radial bearing."}],"displayName":[{"value":"RadialBearingAbrasion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7551","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7579"},{"referenceType":"HasProperty","target":"ns=1;i=7552"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7553"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7579","parentNodeId":"ns=1;i=7551","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7551"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7552","parentNodeId":"ns=1;i=7551","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7551"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7553","parentNodeId":"ns=1;i=7551","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7551"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the radial bearing."}],"displayName":[{"value":"RadialBearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7554","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7580"},{"referenceType":"HasProperty","target":"ns=1;i=7555"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7556"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7580","parentNodeId":"ns=1;i=7554","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7554"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7555","parentNodeId":"ns=1;i=7554","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7554"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7556","parentNodeId":"ns=1;i=7554","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7554"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the radial bearing."}],"displayName":[{"value":"RadialBearingOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7557","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7581"},{"referenceType":"HasProperty","target":"ns=1;i=7558"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7559"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7581","parentNodeId":"ns=1;i=7557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7557"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7558","parentNodeId":"ns=1;i=7557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7557"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7559","parentNodeId":"ns=1;i=7557","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7557"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotorBlocked","dataType":"Boolean","description":[{"value":"This attribute indicates a blocked rotor."}],"displayName":[{"value":"RotorBlocked"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7560","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7582"},{"referenceType":"HasProperty","target":"ns=1;i=7561"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7562"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7582","parentNodeId":"ns=1;i=7560","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7560"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7561","parentNodeId":"ns=1;i=7560","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7560"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7562","parentNodeId":"ns=1;i=7560","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7560"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotorStationRubbing","dataType":"Boolean","description":[{"value":"This attribute indicates the rubbing of stator and rotor."}],"displayName":[{"value":"RotorStationRubbing"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7563","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7583"},{"referenceType":"HasProperty","target":"ns=1;i=7564"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"},{"referenceType":"HasProperty","target":"ns=1;i=7565"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7583","parentNodeId":"ns=1;i=7563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7563"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7564","parentNodeId":"ns=1;i=7563","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7563"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7565","parentNodeId":"ns=1;i=7563","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7563"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Unbalance","dataType":"Boolean","description":[{"value":"This attribute indicates an unbalance."}],"displayName":[{"value":"Unbalance"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7566","parentNodeId":"ns=1;i=5051","references":[{"referenceType":"HasProperty","target":"ns=1;i=7584"},{"referenceType":"HasProperty","target":"ns=1;i=7567"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7568"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5051"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7584","parentNodeId":"ns=1;i=7566","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7566"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7567","parentNodeId":"ns=1;i=7566","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7566"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7568","parentNodeId":"ns=1;i=7566","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7566"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionProcessFluid","description":[{"value":"Supervision process fluid specifies information for monitoring the fluid of a pump."}],"displayName":[{"value":"SupervisionProcessFluid"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5052","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=7585"},{"referenceType":"HasComponent","target":"ns=1;i=7588"},{"referenceType":"HasComponent","target":"ns=1;i=7591"},{"referenceType":"HasComponent","target":"ns=1;i=7594"},{"referenceType":"HasComponent","target":"ns=1;i=7597"},{"referenceType":"HasComponent","target":"ns=1;i=7600"},{"referenceType":"HasComponent","target":"ns=1;i=7603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=7606"},{"referenceType":"HasComponent","target":"ns=1;i=7609"},{"referenceType":"HasComponent","target":"ns=1;i=7612"},{"referenceType":"HasComponent","target":"ns=1;i=7615"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1015"},{"referenceType":"HasComponent","target":"ns=1;i=7618"},{"referenceType":"HasComponent","target":"ns=1;i=7621"}],"typeDefinition":"ns=1;i=1015"},{"accessLevel":5,"browseName":"1:Blockage","dataType":"Boolean","description":[{"value":"This attribute indicates a closed valve operation."}],"displayName":[{"value":"Blockage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7585","parentNodeId":"ns=1;i=5052","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7624"},{"referenceType":"HasProperty","target":"ns=1;i=7586"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7587"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7624","parentNodeId":"ns=1;i=7585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7586","parentNodeId":"ns=1;i=7585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7585"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7587","parentNodeId":"ns=1;i=7585","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7585"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Cavitation","dataType":"Boolean","description":[{"value":"This attribute indicates cavitation of the pump liquid."}],"displayName":[{"value":"Cavitation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7588","parentNodeId":"ns=1;i=5052","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7625"},{"referenceType":"HasProperty","target":"ns=1;i=7589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7590"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7625","parentNodeId":"ns=1;i=7588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7588"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7589","parentNodeId":"ns=1;i=7588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7588"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7590","parentNodeId":"ns=1;i=7588","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7588"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Condensation","dataType":"Boolean","description":[{"value":"This attribute indicates abnormal condensation in flow medium."}],"displayName":[{"value":"Condensation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7591","parentNodeId":"ns=1;i=5052","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7626"},{"referenceType":"HasProperty","target":"ns=1;i=7592"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7593"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7626","parentNodeId":"ns=1;i=7591","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7591"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7592","parentNodeId":"ns=1;i=7591","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7591"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7593","parentNodeId":"ns=1;i=7591","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7591"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Dry","dataType":"Boolean","description":[{"value":"This attribute indicates a dry running."}],"displayName":[{"value":"Dry"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7594","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7627"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7596"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7627","parentNodeId":"ns=1;i=7594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7594"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7595","parentNodeId":"ns=1;i=7594","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7594"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7596","parentNodeId":"ns=1;i=7594","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7594"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Flow","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal flow of the pump fluid."}],"displayName":[{"value":"Flow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7597","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7628"},{"referenceType":"HasProperty","target":"ns=1;i=7598"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7599"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7628","parentNodeId":"ns=1;i=7597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7597"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7598","parentNodeId":"ns=1;i=7597","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7597"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7599","parentNodeId":"ns=1;i=7597","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7597"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Gas","dataType":"Boolean","description":[{"value":"This attribute indicates a significant amount of gas in the pump liquid."}],"displayName":[{"value":"Gas"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7600","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7629"},{"referenceType":"HasProperty","target":"ns=1;i=7601"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7602"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7629","parentNodeId":"ns=1;i=7600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7601","parentNodeId":"ns=1;i=7600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7600"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7602","parentNodeId":"ns=1;i=7600","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7600"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Liquid","dataType":"Boolean","description":[{"value":"This attribute indicates a significant amount of liquid in the flow medium."}],"displayName":[{"value":"Liquid"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7603","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7630"},{"referenceType":"HasProperty","target":"ns=1;i=7604"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7605"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7630","parentNodeId":"ns=1;i=7603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7604","parentNodeId":"ns=1;i=7603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7603"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7605","parentNodeId":"ns=1;i=7603","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7603"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Pressure","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal pressure of the pump fluid."}],"displayName":[{"value":"Pressure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7606","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7631"},{"referenceType":"HasProperty","target":"ns=1;i=7607"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7608"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7631","parentNodeId":"ns=1;i=7606","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7606"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7607","parentNodeId":"ns=1;i=7606","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7606"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7608","parentNodeId":"ns=1;i=7606","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7606"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ProcessFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic process problem."}],"displayName":[{"value":"ProcessFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7609","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7632"},{"referenceType":"HasProperty","target":"ns=1;i=7610"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7611"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7632","parentNodeId":"ns=1;i=7609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7609"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7610","parentNodeId":"ns=1;i=7609","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7609"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7611","parentNodeId":"ns=1;i=7609","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7609"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Solid","dataType":"Boolean","description":[{"value":"This attribute indicates an significant amount of solid in the pump fluid."}],"displayName":[{"value":"Solid"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7612","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7633"},{"referenceType":"HasProperty","target":"ns=1;i=7613"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7614"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7633","parentNodeId":"ns=1;i=7612","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7612"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7613","parentNodeId":"ns=1;i=7612","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7612"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7614","parentNodeId":"ns=1;i=7612","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7612"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Stall","dataType":"Boolean","description":[{"value":"This attribute indicates a stall of the pump liquid."}],"displayName":[{"value":"Stall"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7615","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7634"},{"referenceType":"HasProperty","target":"ns=1;i=7616"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7617"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7634","parentNodeId":"ns=1;i=7615","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7615"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7616","parentNodeId":"ns=1;i=7615","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7615"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7617","parentNodeId":"ns=1;i=7615","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7615"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Temperature","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal temperature of the pump fluid."}],"displayName":[{"value":"Temperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7618","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7635"},{"referenceType":"HasProperty","target":"ns=1;i=7619"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"},{"referenceType":"HasProperty","target":"ns=1;i=7620"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7635","parentNodeId":"ns=1;i=7618","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7618"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7619","parentNodeId":"ns=1;i=7618","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7618"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7620","parentNodeId":"ns=1;i=7618","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7618"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Viscosity","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal viscosity of the pump liquid."}],"displayName":[{"value":"Viscosity"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7621","parentNodeId":"ns=1;i=5052","references":[{"referenceType":"HasProperty","target":"ns=1;i=7636"},{"referenceType":"HasProperty","target":"ns=1;i=7622"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7623"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5052"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7636","parentNodeId":"ns=1;i=7621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7622","parentNodeId":"ns=1;i=7621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7621"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7623","parentNodeId":"ns=1;i=7621","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7621"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionPumpOperation","description":[{"value":"Supervision pump operation specifies information for monitoring the pump operation."}],"displayName":[{"value":"SupervisionPumpOperation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5053","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=7637"},{"referenceType":"HasComponent","target":"ns=1;i=7640"},{"referenceType":"HasComponent","target":"ns=1;i=7643"},{"referenceType":"HasComponent","target":"ns=1;i=7646"},{"referenceType":"HasComponent","target":"ns=1;i=7649"},{"referenceType":"HasComponent","target":"ns=1;i=7652"},{"referenceType":"HasComponent","target":"ns=1;i=7655"},{"referenceType":"HasComponent","target":"ns=1;i=7658"},{"referenceType":"HasComponent","target":"ns=1;i=7661"},{"referenceType":"HasComponent","target":"ns=1;i=7664"},{"referenceType":"HasComponent","target":"ns=1;i=7667"},{"referenceType":"HasComponent","target":"ns=1;i=7670"},{"referenceType":"HasComponent","target":"ns=1;i=7673"},{"referenceType":"HasComponent","target":"ns=1;i=7676"},{"referenceType":"HasComponent","target":"ns=1;i=7679"},{"referenceType":"HasComponent","target":"ns=1;i=7682"},{"referenceType":"HasComponent","target":"ns=1;i=7685"},{"referenceType":"HasComponent","target":"ns=1;i=7688"},{"referenceType":"HasComponent","target":"ns=1;i=7691"},{"referenceType":"HasComponent","target":"ns=1;i=7694"},{"referenceType":"HasComponent","target":"ns=1;i=9750"},{"referenceType":"HasComponent","target":"ns=1;i=9753"},{"referenceType":"HasComponent","target":"ns=1;i=9756"},{"referenceType":"HasComponent","target":"ns=1;i=9759"},{"referenceType":"HasComponent","target":"ns=1;i=9762"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9765"},{"referenceType":"HasComponent","target":"ns=1;i=9768"},{"referenceType":"HasComponent","target":"ns=1;i=9771"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1016"},{"referenceType":"HasComponent","target":"ns=1;i=9774"},{"referenceType":"HasComponent","target":"ns=1;i=9780"},{"referenceType":"HasComponent","target":"ns=1;i=9783"},{"referenceType":"HasComponent","target":"ns=1;i=9777"},{"referenceType":"HasComponent","target":"ns=1;i=9786"},{"referenceType":"HasComponent","target":"ns=1;i=9789"},{"referenceType":"HasComponent","target":"ns=1;i=9792"},{"referenceType":"HasComponent","target":"ns=1;i=9795"},{"referenceType":"HasComponent","target":"ns=1;i=9798"}],"typeDefinition":"ns=1;i=1016"},{"accessLevel":5,"browseName":"1:AccessoryLiquidFlow","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the accessory liquid flow, e.g. the buffer fluid flow or operating fluid flow."}],"displayName":[{"value":"AccessoryLiquidFlow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7637","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9801"},{"referenceType":"HasProperty","target":"ns=1;i=7638"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7639"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9801","parentNodeId":"ns=1;i=7637","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7637"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7638","parentNodeId":"ns=1;i=7637","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7637"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7639","parentNodeId":"ns=1;i=7637","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7637"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidHigh","dataType":"Boolean","description":[{"value":"This attribute indicates a high limited accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7640","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9802"},{"referenceType":"HasProperty","target":"ns=1;i=7641"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7642"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9802","parentNodeId":"ns=1;i=7640","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7640"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7641","parentNodeId":"ns=1;i=7640","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7640"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7642","parentNodeId":"ns=1;i=7640","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7640"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidLow","dataType":"Boolean","description":[{"value":"This attribute indicates a low limited accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7643","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9803"},{"referenceType":"HasProperty","target":"ns=1;i=7644"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7645"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9803","parentNodeId":"ns=1;i=7643","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7643"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7644","parentNodeId":"ns=1;i=7643","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7643"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7645","parentNodeId":"ns=1;i=7643","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7643"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7646","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9804"},{"referenceType":"HasProperty","target":"ns=1;i=7647"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7648"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9804","parentNodeId":"ns=1;i=7646","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7646"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7647","parentNodeId":"ns=1;i=7646","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7646"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7648","parentNodeId":"ns=1;i=7646","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7646"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidPressure","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal pressure of the accessory liquid, e.g. the buffer fluid pressure or operating fluid pressure."}],"displayName":[{"value":"AccessoryLiquidPressure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7649","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9805"},{"referenceType":"HasProperty","target":"ns=1;i=7650"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7651"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9805","parentNodeId":"ns=1;i=7649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7649"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7650","parentNodeId":"ns=1;i=7649","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7649"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7651","parentNodeId":"ns=1;i=7649","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7649"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AmbientTemperature","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal ambient temperature."}],"displayName":[{"value":"AmbientTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7652","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9806"},{"referenceType":"HasProperty","target":"ns=1;i=7653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7654"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9806","parentNodeId":"ns=1;i=7652","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7652"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7653","parentNodeId":"ns=1;i=7652","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7652"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7654","parentNodeId":"ns=1;i=7652","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7652"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CaseOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the case."}],"displayName":[{"value":"CaseOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7655","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9807"},{"referenceType":"HasProperty","target":"ns=1;i=7656"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7657"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9807","parentNodeId":"ns=1;i=7655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7656","parentNodeId":"ns=1;i=7655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7655"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7657","parentNodeId":"ns=1;i=7655","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7655"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ControllerOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a controller."}],"displayName":[{"value":"ControllerOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7658","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9808"},{"referenceType":"HasProperty","target":"ns=1;i=7659"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7660"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9808","parentNodeId":"ns=1;i=7658","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7658"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7659","parentNodeId":"ns=1;i=7658","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7658"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7660","parentNodeId":"ns=1;i=7658","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7658"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ConverterOverheat","dataType":"Boolean","description":[{"value":"This property indicates an overheating of a converter."}],"displayName":[{"value":"ConverterOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7661","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9809"},{"referenceType":"HasProperty","target":"ns=1;i=7662"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7663"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9809","parentNodeId":"ns=1;i=7661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7661"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7662","parentNodeId":"ns=1;i=7661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7661"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7663","parentNodeId":"ns=1;i=7661","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7661"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantFlow","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the coolant flow."}],"displayName":[{"value":"CoolantFlow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7664","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9810"},{"referenceType":"HasProperty","target":"ns=1;i=7665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7666"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9810","parentNodeId":"ns=1;i=7664","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7664"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7665","parentNodeId":"ns=1;i=7664","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7664"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7666","parentNodeId":"ns=1;i=7664","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7664"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantHigh","dataType":"Boolean","description":[{"value":"This attribute indicates that the coolant is high limited."}],"displayName":[{"value":"CoolantHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7667","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9811"},{"referenceType":"HasProperty","target":"ns=1;i=7668"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7669"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9811","parentNodeId":"ns=1;i=7667","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7667"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7668","parentNodeId":"ns=1;i=7667","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7667"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7669","parentNodeId":"ns=1;i=7667","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7667"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantLow","dataType":"Boolean","description":[{"value":"This attribute indicates that the coolant is low limited."}],"displayName":[{"value":"CoolantLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7670","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9812"},{"referenceType":"HasProperty","target":"ns=1;i=7671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7672"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9812","parentNodeId":"ns=1;i=7670","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7670"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7671","parentNodeId":"ns=1;i=7670","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7670"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7672","parentNodeId":"ns=1;i=7670","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7670"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the coolant liquid."}],"displayName":[{"value":"CoolantOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7673","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9813"},{"referenceType":"HasProperty","target":"ns=1;i=7674"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7675"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9813","parentNodeId":"ns=1;i=7673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7674","parentNodeId":"ns=1;i=7673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7673"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7675","parentNodeId":"ns=1;i=7673","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7673"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Deceleration","dataType":"Boolean","description":[{"value":"This attribute indicates a deceleration of a pump."}],"displayName":[{"value":"Deceleration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7676","parentNodeId":"ns=1;i=5053","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9814"},{"referenceType":"HasProperty","target":"ns=1;i=7677"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7678"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9814","parentNodeId":"ns=1;i=7676","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7676"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7677","parentNodeId":"ns=1;i=7676","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7676"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7678","parentNodeId":"ns=1;i=7676","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7676"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DirtyImpeller","dataType":"Boolean","description":[{"value":"This attribute indicates a dirty impeller."}],"displayName":[{"value":"DirtyImpeller"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7679","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9815"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=7680"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7681"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9815","parentNodeId":"ns=1;i=7679","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7679"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7680","parentNodeId":"ns=1;i=7679","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7679"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7681","parentNodeId":"ns=1;i=7679","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7679"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DriveOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a drive."}],"displayName":[{"value":"DriveOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7682","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9816"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=7683"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7684"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9816","parentNodeId":"ns=1;i=7682","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7682"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7683","parentNodeId":"ns=1;i=7682","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7682"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7684","parentNodeId":"ns=1;i=7682","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7682"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GeneratorOperation","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump is working as a generator (in flow)."}],"displayName":[{"value":"GeneratorOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7685","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9817"},{"referenceType":"HasProperty","target":"ns=1;i=7686"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7687"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9817","parentNodeId":"ns=1;i=7685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7686","parentNodeId":"ns=1;i=7685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7685"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7687","parentNodeId":"ns=1;i=7685","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7685"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Leakage","dataType":"Boolean","description":[{"value":"This attribute indicates a leakage problem, e.g. leakage of the mechanical seal."}],"displayName":[{"value":"Leakage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7688","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9818"},{"referenceType":"HasProperty","target":"ns=1;i=7689"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7690"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9818","parentNodeId":"ns=1;i=7688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7688"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7689","parentNodeId":"ns=1;i=7688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7688"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7690","parentNodeId":"ns=1;i=7688","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7688"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Lubricant","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the lubricant."}],"displayName":[{"value":"Lubricant"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7691","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9819"},{"referenceType":"HasProperty","target":"ns=1;i=7692"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7693"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9819","parentNodeId":"ns=1;i=7691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7692","parentNodeId":"ns=1;i=7691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7691"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7693","parentNodeId":"ns=1;i=7691","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7691"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumNumberStarts","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum number of pump start cycles is exceeded."}],"displayName":[{"value":"MaximumNumberStarts"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7694","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9820"},{"referenceType":"HasProperty","target":"ns=1;i=7695"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7696"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9820","parentNodeId":"ns=1;i=7694","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7694"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7695","parentNodeId":"ns=1;i=7694","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7694"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7696","parentNodeId":"ns=1;i=7694","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7694"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumOperationTime","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum time of pump operation is exceeded."}],"displayName":[{"value":"MaximumOperationTime"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9750","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9821"},{"referenceType":"HasProperty","target":"ns=1;i=9751"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9752"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9821","parentNodeId":"ns=1;i=9750","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9750"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9751","parentNodeId":"ns=1;i=9750","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9750"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9752","parentNodeId":"ns=1;i=9750","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9750"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumStartsAtTime","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum number of pump start cycles per timespan is exceeded."}],"displayName":[{"value":"MaximumStartsAtTime"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9753","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9822"},{"referenceType":"HasProperty","target":"ns=1;i=9754"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9755"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9822","parentNodeId":"ns=1;i=9753","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9753"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9754","parentNodeId":"ns=1;i=9753","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9753"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9755","parentNodeId":"ns=1;i=9753","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9753"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MotorHumidity","dataType":"Boolean","description":[{"value":"This attribute indicates unacceptable humidity in the motor."}],"displayName":[{"value":"MotorHumidity"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9756","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9823"},{"referenceType":"HasProperty","target":"ns=1;i=9757"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9758"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9823","parentNodeId":"ns=1;i=9756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9756"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9757","parentNodeId":"ns=1;i=9756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9756"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9758","parentNodeId":"ns=1;i=9756","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9756"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MotorOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a motor."}],"displayName":[{"value":"MotorOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9759","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9824"},{"referenceType":"HasProperty","target":"ns=1;i=9760"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9761"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9824","parentNodeId":"ns=1;i=9759","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9759"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9760","parentNodeId":"ns=1;i=9759","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9759"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9761","parentNodeId":"ns=1;i=9759","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9759"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OperationFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic operation problem of a pump."}],"displayName":[{"value":"OperationFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9762","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9825"},{"referenceType":"HasProperty","target":"ns=1;i=9763"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9764"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9825","parentNodeId":"ns=1;i=9762","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9762"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9763","parentNodeId":"ns=1;i=9762","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9762"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9764","parentNodeId":"ns=1;i=9762","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9762"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverLoad","dataType":"Boolean","description":[{"value":"This attribute indicates an over load."}],"displayName":[{"value":"OverLoad"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9765","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9826"},{"referenceType":"HasProperty","target":"ns=1;i=9766"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9767"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9826","parentNodeId":"ns=1;i=9765","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9765"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9766","parentNodeId":"ns=1;i=9765","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9765"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9767","parentNodeId":"ns=1;i=9765","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9765"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverSpeed","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump operates over normal speed."}],"displayName":[{"value":"OverSpeed"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9768","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9827"},{"referenceType":"HasProperty","target":"ns=1;i=9769"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9770"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9827","parentNodeId":"ns=1;i=9768","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9768"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9769","parentNodeId":"ns=1;i=9768","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9768"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9770","parentNodeId":"ns=1;i=9768","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9768"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PartialLoad","dataType":"Boolean","description":[{"value":"This attribute indicates a partial load."}],"displayName":[{"value":"PartialLoad"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9771","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9828"},{"referenceType":"HasProperty","target":"ns=1;i=9772"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9773"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9828","parentNodeId":"ns=1;i=9771","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9771"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9772","parentNodeId":"ns=1;i=9771","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9771"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9773","parentNodeId":"ns=1;i=9771","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9771"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Synchronisation","dataType":"Boolean","description":[{"value":"This attribute indicates a synchronization problem of a pump."}],"displayName":[{"value":"Synchronisation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9774","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9829"},{"referenceType":"HasProperty","target":"ns=1;i=9775"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9776"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9829","parentNodeId":"ns=1;i=9774","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9774"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9775","parentNodeId":"ns=1;i=9774","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9774"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9776","parentNodeId":"ns=1;i=9774","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9774"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TemperatureFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic temperature problem of a pump."}],"displayName":[{"value":"TemperatureFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9780","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9831"},{"referenceType":"HasProperty","target":"ns=1;i=9781"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9782"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9831","parentNodeId":"ns=1;i=9780","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9780"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9781","parentNodeId":"ns=1;i=9780","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9780"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9782","parentNodeId":"ns=1;i=9780","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9780"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TimeOut","dataType":"Boolean","description":[{"value":"This attribute indicates a start up time out."}],"displayName":[{"value":"TimeOut"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9783","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9832"},{"referenceType":"HasProperty","target":"ns=1;i=9784"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9785"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9832","parentNodeId":"ns=1;i=9783","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9783"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9784","parentNodeId":"ns=1;i=9783","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9783"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9785","parentNodeId":"ns=1;i=9783","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9783"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TMSFailure","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the temperature management system."}],"displayName":[{"value":"TMSFailure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9777","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9830"},{"referenceType":"HasProperty","target":"ns=1;i=9778"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9779"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9830","parentNodeId":"ns=1;i=9777","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9777"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9778","parentNodeId":"ns=1;i=9777","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9777"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9779","parentNodeId":"ns=1;i=9777","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9777"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TorqueLimit","dataType":"Boolean","description":[{"value":"This attribute indicates a limitation problem of a pump."}],"displayName":[{"value":"TorqueLimit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9786","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9833"},{"referenceType":"HasProperty","target":"ns=1;i=9787"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasProperty","target":"ns=1;i=9788"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9833","parentNodeId":"ns=1;i=9786","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9786"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9787","parentNodeId":"ns=1;i=9786","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9786"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9788","parentNodeId":"ns=1;i=9786","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9786"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TurbineOperation","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump is working as a turbine (reverse flow)."}],"displayName":[{"value":"TurbineOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9789","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9834"},{"referenceType":"HasProperty","target":"ns=1;i=9790"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9791"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9834","parentNodeId":"ns=1;i=9789","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9789"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9790","parentNodeId":"ns=1;i=9789","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9789"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9791","parentNodeId":"ns=1;i=9789","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9789"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:UnderSpeed","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump operates under normal speed."}],"displayName":[{"value":"UnderSpeed"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9792","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9835"},{"referenceType":"HasProperty","target":"ns=1;i=9793"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9794"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9835","parentNodeId":"ns=1;i=9792","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9792"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9793","parentNodeId":"ns=1;i=9792","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9792"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9794","parentNodeId":"ns=1;i=9792","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9792"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VelocityLimit","dataType":"Boolean","description":[{"value":"This attribute indicates a limitation problem of a pump."}],"displayName":[{"value":"VelocityLimit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9795","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9836"},{"referenceType":"HasProperty","target":"ns=1;i=9796"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9797"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9836","parentNodeId":"ns=1;i=9795","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9795"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9796","parentNodeId":"ns=1;i=9795","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9795"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9797","parentNodeId":"ns=1;i=9795","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9795"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveExhausted","dataType":"Boolean","description":[{"value":"This attribute indicates that the wear reserve of the pump is exhausted."}],"displayName":[{"value":"WearReserveExhausted"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9798","parentNodeId":"ns=1;i=5053","references":[{"referenceType":"HasProperty","target":"ns=1;i=9837"},{"referenceType":"HasProperty","target":"ns=1;i=9799"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9800"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5053"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9837","parentNodeId":"ns=1;i=9798","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9798"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9799","parentNodeId":"ns=1;i=9798","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9798"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9800","parentNodeId":"ns=1;i=9798","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9798"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionSoftware","description":[{"value":"Supervision software specifies supervising information related to device software."}],"displayName":[{"value":"SupervisionSoftware"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5054","parentNodeId":"ns=1;i=1019","references":[{"referenceType":"HasComponent","target":"ns=1;i=9838"},{"referenceType":"HasComponent","target":"ns=1;i=9841"},{"referenceType":"HasComponent","target":"ns=1;i=9844"},{"referenceType":"HasComponent","target":"ns=1;i=9847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9850"},{"referenceType":"HasComponent","target":"ns=1;i=9853"},{"referenceType":"HasComponent","target":"ns=1;i=9856"},{"referenceType":"HasComponent","target":"ns=1;i=9859"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1019"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1014"}],"typeDefinition":"ns=1;i=1014"},{"accessLevel":5,"browseName":"1:Application","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in application software."}],"displayName":[{"value":"Application"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9838","parentNodeId":"ns=1;i=5054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9862"},{"referenceType":"HasProperty","target":"ns=1;i=9839"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9840"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9862","parentNodeId":"ns=1;i=9838","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9838"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9839","parentNodeId":"ns=1;i=9838","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9838"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9840","parentNodeId":"ns=1;i=9838","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9838"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Communication","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in communication software."}],"displayName":[{"value":"Communication"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9841","parentNodeId":"ns=1;i=5054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9863"},{"referenceType":"HasProperty","target":"ns=1;i=9842"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9843"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9863","parentNodeId":"ns=1;i=9841","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9841"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9842","parentNodeId":"ns=1;i=9841","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9841"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9843","parentNodeId":"ns=1;i=9841","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9841"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Control","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in control software."}],"displayName":[{"value":"Control"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9844","parentNodeId":"ns=1;i=5054","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9864"},{"referenceType":"HasProperty","target":"ns=1;i=9845"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9846"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9864","parentNodeId":"ns=1;i=9844","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9844"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9845","parentNodeId":"ns=1;i=9844","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9844"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9846","parentNodeId":"ns=1;i=9844","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9844"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Memory","dataType":"Boolean","description":[{"value":"This attribute indicates a memory resource problem."}],"displayName":[{"value":"Memory"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9847","parentNodeId":"ns=1;i=5054","references":[{"referenceType":"HasProperty","target":"ns=1;i=9865"},{"referenceType":"HasProperty","target":"ns=1;i=9848"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9849"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9865","parentNodeId":"ns=1;i=9847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9848","parentNodeId":"ns=1;i=9847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9847"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9849","parentNodeId":"ns=1;i=9847","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9847"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OS","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of operation system software."}],"displayName":[{"value":"OS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9850","parentNodeId":"ns=1;i=5054","references":[{"referenceType":"HasProperty","target":"ns=1;i=9866"},{"referenceType":"HasProperty","target":"ns=1;i=9851"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9852"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9866","parentNodeId":"ns=1;i=9850","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9850"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9851","parentNodeId":"ns=1;i=9850","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9850"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9852","parentNodeId":"ns=1;i=9850","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9850"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Parameter","dataType":"Boolean","description":[{"value":"This attribute indicates a parameter problem."}],"displayName":[{"value":"Parameter"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9853","parentNodeId":"ns=1;i=5054","references":[{"referenceType":"HasProperty","target":"ns=1;i=9867"},{"referenceType":"HasProperty","target":"ns=1;i=9854"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9855"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9867","parentNodeId":"ns=1;i=9853","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9853"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9854","parentNodeId":"ns=1;i=9853","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9853"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9855","parentNodeId":"ns=1;i=9853","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9853"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SoftwareFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of device software."}],"displayName":[{"value":"SoftwareFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9856","parentNodeId":"ns=1;i=5054","references":[{"referenceType":"HasProperty","target":"ns=1;i=9868"},{"referenceType":"HasProperty","target":"ns=1;i=9857"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9858"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9868","parentNodeId":"ns=1;i=9856","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9856"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9857","parentNodeId":"ns=1;i=9856","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9856"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9858","parentNodeId":"ns=1;i=9856","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9856"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SoftwareReset","dataType":"Boolean","description":[{"value":"This attribute indicates a software reset."}],"displayName":[{"value":"SoftwareReset"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9859","parentNodeId":"ns=1;i=5054","references":[{"referenceType":"HasProperty","target":"ns=1;i=9869"},{"referenceType":"HasProperty","target":"ns=1;i=9860"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5054"},{"referenceType":"HasProperty","target":"ns=1;i=9861"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9869","parentNodeId":"ns=1;i=9859","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9859"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9860","parentNodeId":"ns=1;i=9859","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9859"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9861","parentNodeId":"ns=1;i=9859","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9859"}],"typeDefinition":"i=68"},{"browseName":"1:SystemRequirementsType","displayName":[{"value":"SystemRequirementsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.21","nodeClass":"ObjectType","nodeId":"ns=1;i=1022","references":[{"referenceType":"HasComponent","target":"ns=1;i=7967"},{"referenceType":"HasComponent","target":"ns=1;i=7968"},{"referenceType":"HasComponent","target":"ns=1;i=7964"},{"referenceType":"HasComponent","target":"ns=1;i=7969"},{"referenceType":"HasComponent","target":"ns=1;i=7970"},{"referenceType":"HasComponent","target":"ns=1;i=7971"},{"referenceType":"HasComponent","target":"ns=1;i=7972"},{"referenceType":"HasComponent","target":"ns=1;i=7973"},{"referenceType":"HasComponent","target":"ns=1;i=7974"},{"referenceType":"HasComponent","target":"ns=1;i=7975"},{"referenceType":"HasComponent","target":"ns=1;i=7976"},{"referenceType":"HasComponent","target":"ns=1;i=7977"},{"referenceType":"HasComponent","target":"ns=1;i=7978"},{"referenceType":"HasComponent","target":"ns=1;i=7979"},{"referenceType":"HasComponent","target":"ns=1;i=7980"},{"referenceType":"HasComponent","target":"ns=1;i=7981"},{"referenceType":"HasComponent","target":"ns=1;i=7982"},{"referenceType":"HasComponent","target":"ns=1;i=7983"},{"referenceType":"HasComponent","target":"ns=1;i=7984"},{"referenceType":"HasComponent","target":"ns=1;i=7985"},{"referenceType":"HasComponent","target":"ns=1;i=7986"},{"referenceType":"HasComponent","target":"ns=1;i=7987"},{"referenceType":"HasComponent","target":"ns=1;i=7988"},{"referenceType":"HasComponent","target":"ns=1;i=7989"},{"referenceType":"HasComponent","target":"ns=1;i=7992"},{"referenceType":"HasComponent","target":"ns=1;i=7993"},{"referenceType":"HasComponent","target":"ns=1;i=7994"},{"referenceType":"HasComponent","target":"ns=1;i=7966"},{"referenceType":"HasComponent","target":"ns=1;i=7995"},{"referenceType":"HasComponent","target":"ns=1;i=7996"},{"referenceType":"HasComponent","target":"ns=1;i=7997"},{"referenceType":"HasComponent","target":"ns=1;i=7998"},{"referenceType":"HasComponent","target":"ns=1;i=7999"},{"referenceType":"HasComponent","target":"ns=1;i=8000"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"},{"referenceType":"HasComponent","target":"ns=1;i=8001"},{"referenceType":"HasComponent","target":"ns=1;i=8002"},{"referenceType":"HasComponent","target":"ns=1;i=8003"}],"superType":"ns=3;i=1005"},{"accessLevel":3,"browseName":"1:CompressionRatio","dataType":"Double","description":[{"value":"Ratio of the backing pressure, p3, to the inlet pressure, p1, of the vacuum pump without throughput"}],"displayName":[{"value":"CompressionRatio"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7967","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasProperty","target":"ns=1;i=8004"},{"referenceType":"HasProperty","target":"ns=1;i=8006"},{"referenceType":"HasProperty","target":"ns=1;i=8005"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8004","parentNodeId":"ns=1;i=7967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8006","parentNodeId":"ns=1;i=7967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8005","parentNodeId":"ns=1;i=7967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExplosionZone","dataType":"ExplosionZoneOptionSet","description":[{"value":"Categories of explosion zones for devices according to 2014/34/EU (ATEX)."}],"displayName":[{"value":"ExplosionZone"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7968","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8007"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8007","parentNodeId":"ns=1;i=7968","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7968"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Fieldbus","dataType":"FieldbusEnum","description":[{"value":"Selected fieldbus for the product"}],"displayName":[{"value":"Fieldbus"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7964","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=7965"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7965","parentNodeId":"ns=1;i=7964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7964"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Fluid","dataType":"String","description":[{"value":"Fluid that is handled by the pump at specified operating conditions"}],"displayName":[{"value":"Fluid"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7969","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8008"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8008","parentNodeId":"ns=1;i=7969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:GasContent","dataType":"Double","description":[{"value":"Proportion of gaseous substance in the liquid to be pumped, either as a contaminant or as vapor from the main body of liquid"}],"displayName":[{"value":"GasContent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7970","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8009"},{"referenceType":"HasProperty","target":"ns=1;i=8011"},{"referenceType":"HasProperty","target":"ns=1;i=8010"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8009","parentNodeId":"ns=1;i=7970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8011","parentNodeId":"ns=1;i=7970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8010","parentNodeId":"ns=1;i=7970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheInletSideOfTheInstallation","dataType":"Double","description":[{"value":"Height of the fluid level on the inlet side of the installation, or in the center of the inlet manifold"}],"displayName":[{"value":"HeightOfTheInletSideOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7971","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8012"},{"referenceType":"HasProperty","target":"ns=1;i=8014"},{"referenceType":"HasProperty","target":"ns=1;i=8013"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8012","parentNodeId":"ns=1;i=7971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8014","parentNodeId":"ns=1;i=7971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8013","parentNodeId":"ns=1;i=7971","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletSideOfTheInstallation","dataType":"Double","description":[{"value":"Height of the fluid level on the outlet side of the installation or in the center of the outlet manifold"}],"displayName":[{"value":"HeightOfTheOutletSideOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7972","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8015"},{"referenceType":"HasProperty","target":"ns=1;i=8017"},{"referenceType":"HasProperty","target":"ns=1;i=8016"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8015","parentNodeId":"ns=1;i=7972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8017","parentNodeId":"ns=1;i=7972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8016","parentNodeId":"ns=1;i=7972","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7972"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfThePump","dataType":"Double","description":[{"value":"Height of the center of the pump"}],"displayName":[{"value":"HeightOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7973","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8018"},{"referenceType":"HasProperty","target":"ns=1;i=8020"},{"referenceType":"HasProperty","target":"ns=1;i=8019"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8018","parentNodeId":"ns=1;i=7973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8020","parentNodeId":"ns=1;i=7973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8019","parentNodeId":"ns=1;i=7973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumAmbientTemperature","dataType":"Double","description":[{"value":"Highest ambient temperature to be expected under normal circumstances"}],"displayName":[{"value":"MaximumAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7974","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8021"},{"referenceType":"HasProperty","target":"ns=1;i=8023"},{"referenceType":"HasProperty","target":"ns=1;i=8022"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8021","parentNodeId":"ns=1;i=7974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8023","parentNodeId":"ns=1;i=7974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8022","parentNodeId":"ns=1;i=7974","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumFlow","dataType":"Double","description":[{"value":"Greatest rate of flow which is expected at operating conditions"}],"displayName":[{"value":"MaximumFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7975","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8024"},{"referenceType":"HasProperty","target":"ns=1;i=8026"},{"referenceType":"HasProperty","target":"ns=1;i=8025"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8024","parentNodeId":"ns=1;i=7975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8026","parentNodeId":"ns=1;i=7975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8025","parentNodeId":"ns=1;i=7975","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7975"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumHead","dataType":"Double","description":[{"value":"Highest total head developed by a pump at any rate of flow"}],"displayName":[{"value":"MaximumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7976","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8027"},{"referenceType":"HasProperty","target":"ns=1;i=8029"},{"referenceType":"HasProperty","target":"ns=1;i=8028"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8027","parentNodeId":"ns=1;i=7976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8029","parentNodeId":"ns=1;i=7976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8028","parentNodeId":"ns=1;i=7976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumInletPressure","dataType":"Double","description":[{"value":"Highest inlet pressure to which the pump is subjected during operation"}],"displayName":[{"value":"MaximumInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7977","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8030"},{"referenceType":"HasProperty","target":"ns=1;i=8032"},{"referenceType":"HasProperty","target":"ns=1;i=8031"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8030","parentNodeId":"ns=1;i=7977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8032","parentNodeId":"ns=1;i=7977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8031","parentNodeId":"ns=1;i=7977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumOutletPressure","dataType":"Double","description":[{"value":"Maximum possible pressure at outlet, due either to internal energy increase (rotodynamic pumps) or external downstream restrictions (volumetric pumps)"}],"displayName":[{"value":"MaximumOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7978","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8033"},{"referenceType":"HasProperty","target":"ns=1;i=8035"},{"referenceType":"HasProperty","target":"ns=1;i=8034"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8033","parentNodeId":"ns=1;i=7978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8035","parentNodeId":"ns=1;i=7978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8034","parentNodeId":"ns=1;i=7978","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7978"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumRelativeHumidity","dataType":"Double","description":[{"value":"Highest relative humidity that can be expected under normal circumstances."}],"displayName":[{"value":"MaximumRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7979","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8036"},{"referenceType":"HasProperty","target":"ns=1;i=8038"},{"referenceType":"HasProperty","target":"ns=1;i=8037"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8036","parentNodeId":"ns=1;i=7979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8038","parentNodeId":"ns=1;i=7979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8037","parentNodeId":"ns=1;i=7979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumTemperature","dataType":"Double","description":[{"value":"Highest fluid temperature to be expected under operating conditions"}],"displayName":[{"value":"MaximumTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7980","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8039"},{"referenceType":"HasProperty","target":"ns=1;i=8041"},{"referenceType":"HasProperty","target":"ns=1;i=8040"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8039","parentNodeId":"ns=1;i=7980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8041","parentNodeId":"ns=1;i=7980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8040","parentNodeId":"ns=1;i=7980","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanTimeBetweenFailures","dataType":"Double","description":[{"value":"Average of the times between failures"}],"displayName":[{"value":"MeanTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7981","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8042"},{"referenceType":"HasProperty","target":"ns=1;i=8044"},{"referenceType":"HasProperty","target":"ns=1;i=8043"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8042","parentNodeId":"ns=1;i=7981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8044","parentNodeId":"ns=1;i=7981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8043","parentNodeId":"ns=1;i=7981","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7981"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAmbientTemperature","dataType":"Double","description":[{"value":"Lowest ambient temperature to be expected under normal circumstances"}],"displayName":[{"value":"MinimumAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7982","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8045"},{"referenceType":"HasProperty","target":"ns=1;i=8047"},{"referenceType":"HasProperty","target":"ns=1;i=8046"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8045","parentNodeId":"ns=1;i=7982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8047","parentNodeId":"ns=1;i=7982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8046","parentNodeId":"ns=1;i=7982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumFlow","dataType":"Double","description":[{"value":"Smallest rate of flow which is expected at operating conditions"}],"displayName":[{"value":"MinimumFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7983","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8048"},{"referenceType":"HasProperty","target":"ns=1;i=8050"},{"referenceType":"HasProperty","target":"ns=1;i=8049"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8048","parentNodeId":"ns=1;i=7983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8050","parentNodeId":"ns=1;i=7983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8049","parentNodeId":"ns=1;i=7983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumHead","dataType":"Double","description":[{"value":"Smallest total head developed by a pump at any rate of flow"}],"displayName":[{"value":"MinimumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7984","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8051"},{"referenceType":"HasProperty","target":"ns=1;i=8053"},{"referenceType":"HasProperty","target":"ns=1;i=8052"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8051","parentNodeId":"ns=1;i=7984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8053","parentNodeId":"ns=1;i=7984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8052","parentNodeId":"ns=1;i=7984","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7984"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumInletPressure","dataType":"Double","description":[{"value":"Lowest inlet pressure that can occur during operation for the pump"}],"displayName":[{"value":"MinimumInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7985","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8054"},{"referenceType":"HasProperty","target":"ns=1;i=8056"},{"referenceType":"HasProperty","target":"ns=1;i=8055"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8054","parentNodeId":"ns=1;i=7985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8056","parentNodeId":"ns=1;i=7985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8055","parentNodeId":"ns=1;i=7985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumOutletPressure","dataType":"Double","description":[{"value":"Lowest outlet pressure that can occur during operation for the pump"}],"displayName":[{"value":"MinimumOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7986","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8057"},{"referenceType":"HasProperty","target":"ns=1;i=8059"},{"referenceType":"HasProperty","target":"ns=1;i=8058"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8057","parentNodeId":"ns=1;i=7986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8059","parentNodeId":"ns=1;i=7986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8058","parentNodeId":"ns=1;i=7986","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7986"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumRelativeHumidity","dataType":"Double","description":[{"value":"Lowest relative humidity to be expected under normal circumstances."}],"displayName":[{"value":"MinimumRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7987","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8060"},{"referenceType":"HasProperty","target":"ns=1;i=8062"},{"referenceType":"HasProperty","target":"ns=1;i=8061"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8060","parentNodeId":"ns=1;i=7987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8062","parentNodeId":"ns=1;i=7987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8061","parentNodeId":"ns=1;i=7987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumTemperature","dataType":"Double","description":[{"value":"Lowest fluid temperature to be expected under operating conditions"}],"displayName":[{"value":"MinimumTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7988","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8063"},{"referenceType":"HasProperty","target":"ns=1;i=8065"},{"referenceType":"HasProperty","target":"ns=1;i=8064"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8063","parentNodeId":"ns=1;i=7988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8065","parentNodeId":"ns=1;i=7988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8064","parentNodeId":"ns=1;i=7988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Multi_Phase","dataType":"Boolean","description":[{"value":"Comprising a fluid together with substances in solid or gaseous states, whether due to deliberate addition or a change of state caused by a change in conditions. A \u0022True\u0022 status means that there is a possibility of multi-phase-fluid and a \u0022False\u0022 status means that there is no possibility of multi-phase-fluid."}],"displayName":[{"value":"Multi_Phase"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7989","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasProperty","target":"ns=1;i=8066"},{"referenceType":"HasProperty","target":"ns=1;i=7990"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=7991"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8066","parentNodeId":"ns=1;i=7989","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7989"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7990","parentNodeId":"ns=1;i=7989","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7989"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=7991","parentNodeId":"ns=1;i=7989","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7989"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NetPositiveInletPressureAvailable","dataType":"Double","description":[{"value":"Total pressure (including velocity pressure) at the pump inlet connection less the liquid vapor pressure at the present temperature of the liquid"}],"displayName":[{"value":"NetPositiveInletPressureAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7992","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8067"},{"referenceType":"HasProperty","target":"ns=1;i=8069"},{"referenceType":"HasProperty","target":"ns=1;i=8068"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8067","parentNodeId":"ns=1;i=7992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8069","parentNodeId":"ns=1;i=7992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8068","parentNodeId":"ns=1;i=7992","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7992"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NormalFlow","dataType":"Double","description":[{"value":"Rate of flow at which usual operation is expected"}],"displayName":[{"value":"NormalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7993","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8070"},{"referenceType":"HasProperty","target":"ns=1;i=8072"},{"referenceType":"HasProperty","target":"ns=1;i=8071"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8070","parentNodeId":"ns=1;i=7993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8072","parentNodeId":"ns=1;i=7993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8071","parentNodeId":"ns=1;i=7993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NpshDatumPlane","dataType":"Double","description":[{"value":"Horizontal plane through the center of the circle described by the external points of the entrance edges of the impeller blades, in the first stage in the case of multi-stage pumps"}],"displayName":[{"value":"NpshDatumPlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7994","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8073"},{"referenceType":"HasProperty","target":"ns=1;i=8075"},{"referenceType":"HasProperty","target":"ns=1;i=8074"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8073","parentNodeId":"ns=1;i=7994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8075","parentNodeId":"ns=1;i=7994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8074","parentNodeId":"ns=1;i=7994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OperatingMode","dataType":"OperatingModeEnum","description":[{"value":"Specifies whether the pump is to be operated in single, parallel or series connection."}],"displayName":[{"value":"OperatingMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7966","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8076"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8076","parentNodeId":"ns=1;i=7966","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7966"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Inlet pressure of the installation for the working conditions"}],"displayName":[{"value":"RatedInletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7995","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8077"},{"referenceType":"HasProperty","target":"ns=1;i=8079"},{"referenceType":"HasProperty","target":"ns=1;i=8078"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8077","parentNodeId":"ns=1;i=7995","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7995"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8079","parentNodeId":"ns=1;i=7995","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7995"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8078","parentNodeId":"ns=1;i=7995","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7995"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedPumpUnitTotalHead","dataType":"Double","description":[{"value":"Difference of the total head, at the outlet side of the pump unit from the total head at the inlet side of the pump unit, at which usual operation is expected"}],"displayName":[{"value":"RatedPumpUnitTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7996","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8080"},{"referenceType":"HasProperty","target":"ns=1;i=8082"},{"referenceType":"HasProperty","target":"ns=1;i=8081"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8080","parentNodeId":"ns=1;i=7996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8082","parentNodeId":"ns=1;i=7996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8081","parentNodeId":"ns=1;i=7996","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7996"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ReferencePlane","dataType":"Double","description":[{"value":"Any horizontal plane for use as the datum for height measurement"}],"displayName":[{"value":"ReferencePlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7997","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8083"},{"referenceType":"HasProperty","target":"ns=1;i=8085"},{"referenceType":"HasProperty","target":"ns=1;i=8084"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8083","parentNodeId":"ns=1;i=7997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8085","parentNodeId":"ns=1;i=7997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8084","parentNodeId":"ns=1;i=7997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RequiredControlMode","dataType":"ControlModeEnum","description":[{"value":"Specifies which control mode is to be used for the use case."}],"displayName":[{"value":"RequiredControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7998","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=8086"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8086","parentNodeId":"ns=1;i=7998","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7998"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RequiredTime","dataType":"Double","description":[{"value":"Time interval throughout which an item is required to be in an up state"}],"displayName":[{"value":"RequiredTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=7999","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8087"},{"referenceType":"HasProperty","target":"ns=1;i=8089"},{"referenceType":"HasProperty","target":"ns=1;i=8088"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8087","parentNodeId":"ns=1;i=7999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8089","parentNodeId":"ns=1;i=7999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8088","parentNodeId":"ns=1;i=7999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SolidContent","dataType":"Double","description":[{"value":"Proportion of solids contained in the fluid to be pumped, either as a contaminant or as a deliberate useful burden or suspension"}],"displayName":[{"value":"SolidContent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8000","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8090"},{"referenceType":"HasProperty","target":"ns=1;i=8092"},{"referenceType":"HasProperty","target":"ns=1;i=8091"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8090","parentNodeId":"ns=1;i=8000","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8000"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8092","parentNodeId":"ns=1;i=8000","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8000"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8091","parentNodeId":"ns=1;i=8000","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8000"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Throughput","dataType":"Double","description":[{"value":"Amount of fluid flowing through a duct"}],"displayName":[{"value":"Throughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8001","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8093"},{"referenceType":"HasProperty","target":"ns=1;i=8095"},{"referenceType":"HasProperty","target":"ns=1;i=8094"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8093","parentNodeId":"ns=1;i=8001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8095","parentNodeId":"ns=1;i=8001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8094","parentNodeId":"ns=1;i=8001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:UltimatePressureOfAVacuumPump","dataType":"Double","description":[{"value":"The ultimate pressure is the value to which the pressure in a standardized test dome approaches asymptotically during normal operation of the vacuum pump and without gas inlet. A difference can be made between the final pressure caused by gases and the final pressure caused by gases and vapors."}],"displayName":[{"value":"UltimatePressureOfAVacuumPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8002","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8096"},{"referenceType":"HasProperty","target":"ns=1;i=8098"},{"referenceType":"HasProperty","target":"ns=1;i=8097"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8096","parentNodeId":"ns=1;i=8002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8002"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8098","parentNodeId":"ns=1;i=8002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8002"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8097","parentNodeId":"ns=1;i=8002","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8002"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:WorkingTemperature","dataType":"Double","description":[{"value":"Temperature determined by the given application and fluid."}],"displayName":[{"value":"WorkingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8003","parentNodeId":"ns=1;i=1022","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=8099"},{"referenceType":"HasProperty","target":"ns=1;i=8101"},{"referenceType":"HasProperty","target":"ns=1;i=8100"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1022"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8099","parentNodeId":"ns=1;i=8003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8101","parentNodeId":"ns=1;i=8003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=8100","parentNodeId":"ns=1;i=8003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=8003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:VibrationMeasurementType","displayName":[{"value":"VibrationMeasurementType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.33","nodeClass":"ObjectType","nodeId":"ns=1;i=1055","references":[{"referenceType":"HasComponent","target":"ns=1;i=11275"},{"referenceType":"HasComponent","target":"ns=1;i=11277"},{"referenceType":"HasComponent","target":"ns=1;i=11279"},{"referenceType":"HasComponent","target":"ns=1;i=11281"},{"referenceType":"HasComponent","target":"ns=1;i=13105"},{"referenceType":"HasComponent","target":"ns=1;i=13107"},{"referenceType":"HasComponent","target":"ns=1;i=13109"},{"referenceType":"HasComponent","target":"ns=1;i=13111"},{"referenceType":"HasComponent","target":"ns=1;i=13113"},{"referenceType":"HasComponent","target":"ns=1;i=13115"},{"referenceType":"HasComponent","target":"ns=1;i=13117"},{"referenceType":"HasComponent","target":"ns=1;i=13119"},{"referenceType":"HasComponent","target":"ns=1;i=13123"},{"referenceType":"HasComponent","target":"ns=1;i=13121"},{"referenceType":"HasComponent","target":"ns=1;i=13125"},{"referenceType":"HasComponent","target":"ns=1;i=13127"},{"referenceType":"HasComponent","target":"ns=1;i=13129"},{"referenceType":"HasComponent","target":"ns=1;i=13131"},{"referenceType":"HasComponent","target":"ns=1;i=13133"},{"referenceType":"HasComponent","target":"ns=1;i=13135"},{"referenceType":"HasComponent","target":"ns=1;i=13137"},{"referenceType":"HasComponent","target":"ns=1;i=13139"},{"referenceType":"HasComponent","target":"ns=1;i=13141"},{"referenceType":"HasComponent","target":"ns=1;i=13143"},{"referenceType":"HasComponent","target":"ns=1;i=13145"},{"referenceType":"HasComponent","target":"ns=1;i=13147"},{"referenceType":"HasComponent","target":"ns=1;i=13149"},{"referenceType":"HasComponent","target":"ns=1;i=13151"},{"referenceType":"HasComponent","target":"ns=1;i=13153"},{"referenceType":"HasComponent","target":"ns=1;i=13155"},{"referenceType":"HasComponent","target":"ns=1;i=13157"},{"referenceType":"HasComponent","target":"ns=1;i=13159"},{"referenceType":"HasComponent","target":"ns=1;i=13161"},{"referenceType":"HasComponent","target":"ns=1;i=13163"},{"referenceType":"HasComponent","target":"ns=1;i=13165"},{"referenceType":"HasComponent","target":"ns=1;i=13167"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1005"}],"superType":"ns=3;i=1005"},{"accessLevel":5,"browseName":"1:1XPhase","dataType":"Double","description":[{"value":"Phase of the 1X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"1XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11275","parentNodeId":"ns=1;i=1055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13081"},{"referenceType":"HasProperty","target":"ns=1;i=13083"},{"referenceType":"HasProperty","target":"ns=1;i=13082"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XPhase","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13081","parentNodeId":"ns=1;i=11275","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11275"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13083","parentNodeId":"ns=1;i=11275","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11275"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13082","parentNodeId":"ns=1;i=11275","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11275"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11277","parentNodeId":"ns=1;i=1055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13093"},{"referenceType":"HasProperty","target":"ns=1;i=13095"},{"referenceType":"HasProperty","target":"ns=1;i=13094"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XRelativeShaftVibrationP_P","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13093","parentNodeId":"ns=1;i=11277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13095","parentNodeId":"ns=1;i=11277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13094","parentNodeId":"ns=1;i=11277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XPhase","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"2XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11279","parentNodeId":"ns=1;i=1055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13087"},{"referenceType":"HasProperty","target":"ns=1;i=13089"},{"referenceType":"HasProperty","target":"ns=1;i=13088"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XPhase","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13087","parentNodeId":"ns=1;i=11279","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11279"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13089","parentNodeId":"ns=1;i=11279","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11279"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13088","parentNodeId":"ns=1;i=11279","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11279"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the double rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"2XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11281","parentNodeId":"ns=1;i=1055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13099"},{"referenceType":"HasProperty","target":"ns=1;i=13101"},{"referenceType":"HasProperty","target":"ns=1;i=13100"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XRelativeShaftVibrationP_P","typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13099","parentNodeId":"ns=1;i=11281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13101","parentNodeId":"ns=1;i=11281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13100","parentNodeId":"ns=1;i=11281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndex","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndex"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13105","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasProperty","target":"ns=1;i=13169"},{"referenceType":"HasProperty","target":"ns=1;i=13171"},{"referenceType":"HasProperty","target":"ns=1;i=13170"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13169","parentNodeId":"ns=1;i=13105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13171","parentNodeId":"ns=1;i=13105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13170","parentNodeId":"ns=1;i=13105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndexPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndexPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13107","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasProperty","target":"ns=1;i=13172"},{"referenceType":"HasProperty","target":"ns=1;i=13174"},{"referenceType":"HasProperty","target":"ns=1;i=13173"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13172","parentNodeId":"ns=1;i=13107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13174","parentNodeId":"ns=1;i=13107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13173","parentNodeId":"ns=1;i=13107","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13107"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration in units of the acceleration of gravity g. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13109","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasProperty","target":"ns=1;i=13175"},{"referenceType":"HasProperty","target":"ns=1;i=13177"},{"referenceType":"HasProperty","target":"ns=1;i=13176"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13175","parentNodeId":"ns=1;i=13109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13177","parentNodeId":"ns=1;i=13109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13176","parentNodeId":"ns=1;i=13109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13111","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasProperty","target":"ns=1;i=13190"},{"referenceType":"HasProperty","target":"ns=1;i=13192"},{"referenceType":"HasProperty","target":"ns=1;i=13191"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13190","parentNodeId":"ns=1;i=13111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13192","parentNodeId":"ns=1;i=13111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13191","parentNodeId":"ns=1;i=13111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapVoltage","dataType":"Double","description":[{"value":"Sum value of the oscillation ranges of the vibration at all frequencies except the rotation frequency of the shaft under consideration, expressed as displacement. Regularly, only the frequency range below the rotational frequency is considered."}],"displayName":[{"value":"GapVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13113","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13178"},{"referenceType":"HasProperty","target":"ns=1;i=13180"},{"referenceType":"HasProperty","target":"ns=1;i=13179"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13178","parentNodeId":"ns=1;i=13113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13180","parentNodeId":"ns=1;i=13113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13179","parentNodeId":"ns=1;i=13113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Not1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"Not1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13115","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13181"},{"referenceType":"HasProperty","target":"ns=1;i=13183"},{"referenceType":"HasProperty","target":"ns=1;i=13182"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13181","parentNodeId":"ns=1;i=13115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13183","parentNodeId":"ns=1;i=13115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13182","parentNodeId":"ns=1;i=13115","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13115"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAcceleration0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAcceleration0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13117","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13184"},{"referenceType":"HasProperty","target":"ns=1;i=13186"},{"referenceType":"HasProperty","target":"ns=1;i=13185"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13184","parentNodeId":"ns=1;i=13117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13186","parentNodeId":"ns=1;i=13117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13185","parentNodeId":"ns=1;i=13117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13119","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13187"},{"referenceType":"HasProperty","target":"ns=1;i=13189"},{"referenceType":"HasProperty","target":"ns=1;i=13188"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13187","parentNodeId":"ns=1;i=13119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13189","parentNodeId":"ns=1;i=13119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13188","parentNodeId":"ns=1;i=13119","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerG0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13123","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13193"},{"referenceType":"HasProperty","target":"ns=1;i=13195"},{"referenceType":"HasProperty","target":"ns=1;i=13194"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13193","parentNodeId":"ns=1;i=13123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13195","parentNodeId":"ns=1;i=13123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13194","parentNodeId":"ns=1;i=13123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration in units of the acceleration of gravity g"}],"displayName":[{"value":"OverallVibrationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13121","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13196"},{"referenceType":"HasProperty","target":"ns=1;i=13198"},{"referenceType":"HasProperty","target":"ns=1;i=13197"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13196","parentNodeId":"ns=1;i=13121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13198","parentNodeId":"ns=1;i=13121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13197","parentNodeId":"ns=1;i=13121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerGP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerGP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13125","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13199"},{"referenceType":"HasProperty","target":"ns=1;i=13201"},{"referenceType":"HasProperty","target":"ns=1;i=13200"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13199","parentNodeId":"ns=1;i=13125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13201","parentNodeId":"ns=1;i=13125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13200","parentNodeId":"ns=1;i=13125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration"}],"displayName":[{"value":"OverallVibrationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13127","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13202"},{"referenceType":"HasProperty","target":"ns=1;i=13204"},{"referenceType":"HasProperty","target":"ns=1;i=13203"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13202","parentNodeId":"ns=1;i=13127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13204","parentNodeId":"ns=1;i=13127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13203","parentNodeId":"ns=1;i=13127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13129","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13205"},{"referenceType":"HasProperty","target":"ns=1;i=13207"},{"referenceType":"HasProperty","target":"ns=1;i=13206"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13205","parentNodeId":"ns=1;i=13129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13207","parentNodeId":"ns=1;i=13129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13206","parentNodeId":"ns=1;i=13129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementRMS","dataType":"Double","description":[{"value":"Root mean square of oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13131","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13208"},{"referenceType":"HasProperty","target":"ns=1;i=13210"},{"referenceType":"HasProperty","target":"ns=1;i=13209"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13208","parentNodeId":"ns=1;i=13131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13210","parentNodeId":"ns=1;i=13131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13209","parentNodeId":"ns=1;i=13131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocity0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocity0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13133","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13211"},{"referenceType":"HasProperty","target":"ns=1;i=13213"},{"referenceType":"HasProperty","target":"ns=1;i=13212"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13211","parentNodeId":"ns=1;i=13133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13213","parentNodeId":"ns=1;i=13133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13212","parentNodeId":"ns=1;i=13133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocityP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13135","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13214"},{"referenceType":"HasProperty","target":"ns=1;i=13216"},{"referenceType":"HasProperty","target":"ns=1;i=13215"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13214","parentNodeId":"ns=1;i=13135","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13135"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13216","parentNodeId":"ns=1;i=13135","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13135"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13215","parentNodeId":"ns=1;i=13135","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13135"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement expressed as velocity"}],"displayName":[{"value":"OverallVibrationVelocityRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13137","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13217"},{"referenceType":"HasProperty","target":"ns=1;i=13219"},{"referenceType":"HasProperty","target":"ns=1;i=13218"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13217","parentNodeId":"ns=1;i=13137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13219","parentNodeId":"ns=1;i=13137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13218","parentNodeId":"ns=1;i=13137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ReferenceStandardForVibrationMeasurement","dataType":"String","description":[{"value":"Standard to which statements on vibration measurement refer."}],"displayName":[{"value":"ReferenceStandardForVibrationMeasurement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13139","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13140"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13140","parentNodeId":"ns=1;i=13139","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13139"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase1X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the rotation frequency (1X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13141","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13223"},{"referenceType":"HasProperty","target":"ns=1;i=13225"},{"referenceType":"HasProperty","target":"ns=1;i=13224"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13223","parentNodeId":"ns=1;i=13141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13225","parentNodeId":"ns=1;i=13141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13224","parentNodeId":"ns=1;i=13141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase2X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the first harmonic of the rotation frequency (2X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13143","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13226"},{"referenceType":"HasProperty","target":"ns=1;i=13228"},{"referenceType":"HasProperty","target":"ns=1;i=13227"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13226","parentNodeId":"ns=1;i=13143","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13143"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13228","parentNodeId":"ns=1;i=13143","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13143"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13227","parentNodeId":"ns=1;i=13143","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13143"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SpeedOfRotation","dataType":"Double","description":[{"value":"Number of revolutions per time."}],"displayName":[{"value":"SpeedOfRotation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13145","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13229"},{"referenceType":"HasProperty","target":"ns=1;i=13231"},{"referenceType":"HasProperty","target":"ns=1;i=13230"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13229","parentNodeId":"ns=1;i=13145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13231","parentNodeId":"ns=1;i=13145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13230","parentNodeId":"ns=1;i=13145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ThrustPosition","dataType":"Double","description":[{"value":"Measure for the distance between the sensor and the shaft, expressed as device output voltage"}],"displayName":[{"value":"ThrustPosition"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13147","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13232"},{"referenceType":"HasProperty","target":"ns=1;i=13234"},{"referenceType":"HasProperty","target":"ns=1;i=13233"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13232","parentNodeId":"ns=1;i=13147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13234","parentNodeId":"ns=1;i=13147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5066068\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13233","parentNodeId":"ns=1;i=13147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequencies","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequencies"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13149","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13262"},{"referenceType":"HasProperty","target":"ns=1;i=13264"},{"referenceType":"HasProperty","target":"ns=1;i=13263"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13262","parentNodeId":"ns=1;i=13149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13149"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13264","parentNodeId":"ns=1;i=13149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13149"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13263","parentNodeId":"ns=1;i=13149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13149"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequenciesPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequenciesPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13151","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13259"},{"referenceType":"HasProperty","target":"ns=1;i=13261"},{"referenceType":"HasProperty","target":"ns=1;i=13260"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13259","parentNodeId":"ns=1;i=13151","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13151"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13261","parentNodeId":"ns=1;i=13151","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13151"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13260","parentNodeId":"ns=1;i=13151","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13151"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBladePassFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft multiplied with the number of blades mounted at the shaft, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheBladePassFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13153","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13256"},{"referenceType":"HasProperty","target":"ns=1;i=13258"},{"referenceType":"HasProperty","target":"ns=1;i=13257"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13256","parentNodeId":"ns=1;i=13153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13258","parentNodeId":"ns=1;i=13153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13257","parentNodeId":"ns=1;i=13153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X","dataType":"Double","description":[{"value":"Oscillation amplitude at the double rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13155","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13253"},{"referenceType":"HasProperty","target":"ns=1;i=13255"},{"referenceType":"HasProperty","target":"ns=1;i=13254"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13253","parentNodeId":"ns=1;i=13155","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13155"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13255","parentNodeId":"ns=1;i=13155","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13155"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13254","parentNodeId":"ns=1;i=13155","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13155"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13157","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13250"},{"referenceType":"HasProperty","target":"ns=1;i=13252"},{"referenceType":"HasProperty","target":"ns=1;i=13251"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13250","parentNodeId":"ns=1;i=13157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13252","parentNodeId":"ns=1;i=13157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13251","parentNodeId":"ns=1;i=13157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13159","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13247"},{"referenceType":"HasProperty","target":"ns=1;i=13249"},{"referenceType":"HasProperty","target":"ns=1;i=13248"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13247","parentNodeId":"ns=1;i=13159","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13159"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13249","parentNodeId":"ns=1;i=13159","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13159"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13248","parentNodeId":"ns=1;i=13159","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13159"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the harmonics of the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13161","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13244"},{"referenceType":"HasProperty","target":"ns=1;i=13246"},{"referenceType":"HasProperty","target":"ns=1;i=13245"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13244","parentNodeId":"ns=1;i=13161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13246","parentNodeId":"ns=1;i=13161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13245","parentNodeId":"ns=1;i=13161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheRotationFrequency1X","dataType":"Double","description":[{"value":"Oscillation amplitude at the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheRotationFrequency1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13163","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13241"},{"referenceType":"HasProperty","target":"ns=1;i=13243"},{"referenceType":"HasProperty","target":"ns=1;i=13242"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13241","parentNodeId":"ns=1;i=13163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13163"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13243","parentNodeId":"ns=1;i=13163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13163"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13242","parentNodeId":"ns=1;i=13163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13163"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13165","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13235"},{"referenceType":"HasProperty","target":"ns=1;i=13237"},{"referenceType":"HasProperty","target":"ns=1;i=13236"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13235","parentNodeId":"ns=1;i=13165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13237","parentNodeId":"ns=1;i=13165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13236","parentNodeId":"ns=1;i=13165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13167","parentNodeId":"ns=1;i=1055","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13238"},{"referenceType":"HasProperty","target":"ns=1;i=13240"},{"referenceType":"HasProperty","target":"ns=1;i=13239"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1055"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13238","parentNodeId":"ns=1;i=13167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13167"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13240","parentNodeId":"ns=1;i=13167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13167"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13239","parentNodeId":"ns=1;i=13167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=13167"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MarkingsType","description":[{"value":"Safety instructions for safe use, e.g. temperature and pressure resistance, electrostatic charge, high voltage, radioactivity, explosive protection."}],"displayName":[{"value":"MarkingsType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.3","nodeClass":"ObjectType","nodeId":"ns=1;i=1002","references":[{"referenceType":"HasComponent","target":"ns=1;i=5019"},{"isForward":false,"referenceType":"HasSubtype","target":"i=61"}],"superType":"i=61"},{"browseName":"1:\u003CMarking\u003E","description":[{"value":"Placeholder for saving markings."}],"displayName":[{"value":"\u003CMarking\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5019","parentNodeId":"ns=1;i=1002","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1002"},{"referenceType":"HasComponent","target":"ns=1;i=7001"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=7002"},{"referenceType":"HasProperty","target":"ns=1;i=6045"},{"referenceType":"HasComponent","target":"ns=1;i=7003"},{"referenceType":"HasProperty","target":"ns=1;i=6037"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=7004"},{"referenceType":"HasComponent","target":"ns=1;i=7005"},{"referenceType":"HasProperty","target":"ns=1;i=6041"},{"referenceType":"HasProperty","target":"ns=1;i=6042"},{"referenceType":"HasProperty","target":"ns=1;i=6043"},{"referenceType":"HasComponent","target":"ns=1;i=7006"}],"symbolicName":"Marking","typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7001","parentNodeId":"ns=1;i=5019","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5019"},{"referenceType":"HasProperty","target":"ns=1;i=6032"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6032","parentNodeId":"ns=1;i=7001","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7001"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7002","parentNodeId":"ns=1;i=5019","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5019"},{"referenceType":"HasProperty","target":"ns=1;i=6033"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6034"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6033","parentNodeId":"ns=1;i=7002","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7002"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6034","parentNodeId":"ns=1;i=7002","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7002"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6045","parentNodeId":"ns=1;i=5019","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5019"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7003","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasProperty","target":"ns=1;i=6035"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5019"},{"referenceType":"HasProperty","target":"ns=1;i=6036"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6035","parentNodeId":"ns=1;i=7003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7003"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6036","parentNodeId":"ns=1;i=7003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7003"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6037","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5019"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7004","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasProperty","target":"ns=1;i=6038"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=6039"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5019"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6038","parentNodeId":"ns=1;i=7004","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7004"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6039","parentNodeId":"ns=1;i=7004","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7004"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7005","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasProperty","target":"ns=1;i=6040"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5019"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6040","parentNodeId":"ns=1;i=7005","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7005"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6041","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5019"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6042","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5019"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6043","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5019"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=7006","parentNodeId":"ns=1;i=5019","references":[{"referenceType":"HasProperty","target":"ns=1;i=6044"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5019"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=6044","parentNodeId":"ns=1;i=7006","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=7006"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PortType","displayName":[{"value":"PortType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.36","isAbstract":true,"nodeClass":"ObjectType","nodeId":"ns=1;i=1035","references":[{"referenceType":"HasComponent","target":"ns=1;i=9246"},{"referenceType":"HasComponent","target":"ns=1;i=9245"},{"referenceType":"HasComponent","target":"ns=1;i=9247"},{"isForward":false,"referenceType":"HasSubtype","target":"i=58"}],"superType":"i=58"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9246","parentNodeId":"ns=1;i=1035","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1035"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9248"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9248","parentNodeId":"ns=1;i=9246","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9246"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9245","parentNodeId":"ns=1;i=1035","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9249"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1035"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9249","parentNodeId":"ns=1;i=9245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9247","parentNodeId":"ns=1;i=1035","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9250"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1035"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9250","parentNodeId":"ns=1;i=9247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DrivePortType","displayName":[{"value":"DrivePortType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.37","nodeClass":"ObjectType","nodeId":"ns=1;i=1038","references":[{"referenceType":"HasComponent","target":"ns=1;i=5115"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1035"},{"referenceType":"HasComponent","target":"ns=1;i=5116"}],"superType":"ns=1;i=1035"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the drive."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5115","parentNodeId":"ns=1;i=1038","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1038"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1043"},{"referenceType":"HasComponent","target":"ns=1;i=9509"},{"referenceType":"HasComponent","target":"ns=1;i=9510"},{"referenceType":"HasComponent","target":"ns=1;i=9511"},{"referenceType":"HasComponent","target":"ns=1;i=9512"},{"referenceType":"HasComponent","target":"ns=1;i=9513"},{"referenceType":"HasComponent","target":"ns=1;i=9514"},{"referenceType":"HasComponent","target":"ns=1;i=9516"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9517"},{"referenceType":"HasComponent","target":"ns=1;i=9508"},{"referenceType":"HasComponent","target":"ns=1;i=9518"},{"referenceType":"HasComponent","target":"ns=1;i=9519"},{"referenceType":"HasComponent","target":"ns=1;i=9520"}],"typeDefinition":"ns=1;i=1043"},{"browseName":"1:EnergyEfficiencyClassOfMotor","dataType":"String","description":[{"value":"Characterization of the energy efficiency of electric motors according to international standards."}],"displayName":[{"value":"EnergyEfficiencyClassOfMotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9509","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9522"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9522","parentNodeId":"ns=1;i=9509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaxNominalFrequency","dataType":"Double","description":[{"value":"A suitable, maximum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MaxNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9510","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9523"},{"referenceType":"HasProperty","target":"ns=1;i=9525"},{"referenceType":"HasProperty","target":"ns=1;i=9524"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9523","parentNodeId":"ns=1;i=9510","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9510"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9525","parentNodeId":"ns=1;i=9510","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9510"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9524","parentNodeId":"ns=1;i=9510","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9510"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinNominalFrequency","dataType":"Double","description":[{"value":"A suitable minimum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MinNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9511","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9526"},{"referenceType":"HasProperty","target":"ns=1;i=9528"},{"referenceType":"HasProperty","target":"ns=1;i=9527"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9526","parentNodeId":"ns=1;i=9511","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9511"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9528","parentNodeId":"ns=1;i=9511","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9511"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9527","parentNodeId":"ns=1;i=9511","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9511"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Proportion of the motor power input P_mot delivered as pump power input P_mot, u."}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9512","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9529"},{"referenceType":"HasProperty","target":"ns=1;i=9531"},{"referenceType":"HasProperty","target":"ns=1;i=9530"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9529","parentNodeId":"ns=1;i=9512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9531","parentNodeId":"ns=1;i=9512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9530","parentNodeId":"ns=1;i=9512","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9512"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalFrequency","dataType":"Double","description":[{"value":"Design of the object at a certain frequency, which is repeated regularly."}],"displayName":[{"value":"NominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9513","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9532"},{"referenceType":"HasProperty","target":"ns=1;i=9534"},{"referenceType":"HasProperty","target":"ns=1;i=9533"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9532","parentNodeId":"ns=1;i=9513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9534","parentNodeId":"ns=1;i=9513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9533","parentNodeId":"ns=1;i=9513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPowerConsumption","dataType":"Double","description":[{"value":"Indication of the rated power consumption in watts."}],"displayName":[{"value":"NominalPowerConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9514","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9535"},{"referenceType":"HasProperty","target":"ns=1;i=9537"},{"referenceType":"HasProperty","target":"ns=1;i=9536"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9535","parentNodeId":"ns=1;i=9514","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9514"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9537","parentNodeId":"ns=1;i=9514","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9514"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9536","parentNodeId":"ns=1;i=9514","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9514"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalVoltage","dataType":"Double","description":[{"value":"Rated voltage is the value of the electrical voltage in normal operation specified by the manufacturer or supplier."}],"displayName":[{"value":"NominalVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9516","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9539"},{"referenceType":"HasProperty","target":"ns=1;i=9541"},{"referenceType":"HasProperty","target":"ns=1;i=9540"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9539","parentNodeId":"ns=1;i=9516","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9516"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9541","parentNodeId":"ns=1;i=9516","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9516"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9540","parentNodeId":"ns=1;i=9516","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9516"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Ratio of the amount of active power to apparent power."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9517","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9542"},{"referenceType":"HasProperty","target":"ns=1;i=9544"},{"referenceType":"HasProperty","target":"ns=1;i=9543"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9542","parentNodeId":"ns=1;i=9517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9544","parentNodeId":"ns=1;i=9517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9543","parentNodeId":"ns=1;i=9517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProtectionClass","dataType":"String","description":[{"value":"Protection class of an enclosure, expressed as NEMA or IP rating."}],"displayName":[{"value":"ProtectionClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9508","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9521"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9521","parentNodeId":"ns=1;i=9508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9508"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedCurrent","dataType":"Double","description":[{"value":"Appropriate (usually rounded) value of a current to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"RatedCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9518","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9545"},{"referenceType":"HasProperty","target":"ns=1;i=9547"},{"referenceType":"HasProperty","target":"ns=1;i=9546"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9545","parentNodeId":"ns=1;i=9518","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9518"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9547","parentNodeId":"ns=1;i=9518","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9518"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9546","parentNodeId":"ns=1;i=9518","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9518"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Speed corresponding to the rated data of the motor used."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9519","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9548"},{"referenceType":"HasProperty","target":"ns=1;i=9550"},{"referenceType":"HasProperty","target":"ns=1;i=9549"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9548","parentNodeId":"ns=1;i=9519","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9519"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9550","parentNodeId":"ns=1;i=9519","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9519"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9549","parentNodeId":"ns=1;i=9519","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9519"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TorqueAtNominalSpeedOfDrive","dataType":"Double","description":[{"value":"The torque transmittable by the equipment."}],"displayName":[{"value":"TorqueAtNominalSpeedOfDrive"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9520","parentNodeId":"ns=1;i=5115","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9551"},{"referenceType":"HasProperty","target":"ns=1;i=9553"},{"referenceType":"HasProperty","target":"ns=1;i=9552"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5115"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9551","parentNodeId":"ns=1;i=9520","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9520"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9553","parentNodeId":"ns=1;i=9520","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9520"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9552","parentNodeId":"ns=1;i=9520","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9520"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All operation measurements that describe the drive."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5116","parentNodeId":"ns=1;i=1038","references":[{"referenceType":"HasComponent","target":"ns=1;i=9554"},{"referenceType":"HasComponent","target":"ns=1;i=9556"},{"referenceType":"HasComponent","target":"ns=1;i=9558"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1051"},{"referenceType":"HasComponent","target":"ns=1;i=9560"},{"referenceType":"HasComponent","target":"ns=1;i=9562"},{"referenceType":"HasComponent","target":"ns=1;i=9564"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1038"},{"referenceType":"HasComponent","target":"ns=1;i=9566"},{"referenceType":"HasComponent","target":"ns=1;i=9568"},{"referenceType":"HasComponent","target":"ns=1;i=9570"},{"referenceType":"HasComponent","target":"ns=1;i=9572"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9574"},{"referenceType":"HasComponent","target":"ns=1;i=9576"},{"referenceType":"HasComponent","target":"ns=1;i=9578"}],"typeDefinition":"ns=1;i=1051"},{"browseName":"1:Current","dataType":"Double","description":[{"value":"Measured consumed mains current of the whole unit of the motor."}],"displayName":[{"value":"Current"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9554","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasProperty","target":"ns=1;i=9580"},{"referenceType":"HasProperty","target":"ns=1;i=9582"},{"referenceType":"HasProperty","target":"ns=1;i=9581"},{"referenceType":"HasProperty","target":"ns=1;i=14881"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9580","parentNodeId":"ns=1;i=9554","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9554"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9582","parentNodeId":"ns=1;i=9554","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9554"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9581","parentNodeId":"ns=1;i=9554","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9554"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14881","parentNodeId":"ns=1;i=9554","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9554"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkCurrent","dataType":"Double","description":[{"value":"Measured actual electrical dc current of the converter."}],"displayName":[{"value":"DCLinkCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9556","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasProperty","target":"ns=1;i=9583"},{"referenceType":"HasProperty","target":"ns=1;i=9585"},{"referenceType":"HasProperty","target":"ns=1;i=9584"},{"referenceType":"HasProperty","target":"ns=1;i=14885"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9583","parentNodeId":"ns=1;i=9556","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9556"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9585","parentNodeId":"ns=1;i=9556","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9556"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9584","parentNodeId":"ns=1;i=9556","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9556"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14885","parentNodeId":"ns=1;i=9556","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9556"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkVoltage","dataType":"Double","description":[{"value":"Measured actual electrical dc voltage of the converter."}],"displayName":[{"value":"DCLinkVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9558","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasProperty","target":"ns=1;i=9586"},{"referenceType":"HasProperty","target":"ns=1;i=9588"},{"referenceType":"HasProperty","target":"ns=1;i=9587"},{"referenceType":"HasProperty","target":"ns=1;i=14889"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9586","parentNodeId":"ns=1;i=9558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9588","parentNodeId":"ns=1;i=9558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9587","parentNodeId":"ns=1;i=9558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14889","parentNodeId":"ns=1;i=9558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9558"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:DriverPowerInput","dataType":"Double","description":[{"value":"Measured power absorbed by the motor."}],"displayName":[{"value":"DriverPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9560","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9589"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasProperty","target":"ns=1;i=9591"},{"referenceType":"HasProperty","target":"ns=1;i=9590"},{"referenceType":"HasProperty","target":"ns=1;i=14893"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9589","parentNodeId":"ns=1;i=9560","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9560"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9591","parentNodeId":"ns=1;i=9560","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9560"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9590","parentNodeId":"ns=1;i=9560","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9560"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14893","parentNodeId":"ns=1;i=9560","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9560"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:EnergyConsumption","dataType":"Double","description":[{"value":"Measured energy consumption of the unit of the motor."}],"displayName":[{"value":"EnergyConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9562","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9592"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasProperty","target":"ns=1;i=9594"},{"referenceType":"HasProperty","target":"ns=1;i=9593"},{"referenceType":"HasProperty","target":"ns=1;i=14897"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9592","parentNodeId":"ns=1;i=9562","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9562"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9594","parentNodeId":"ns=1;i=9562","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9562"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9593","parentNodeId":"ns=1;i=9562","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9562"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14897","parentNodeId":"ns=1;i=9562","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9562"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:Frequency","dataType":"Double","description":[{"value":"Measured output frequency of the frequency converter."}],"displayName":[{"value":"Frequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9564","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9595"},{"referenceType":"HasProperty","target":"ns=1;i=9597"},{"referenceType":"HasProperty","target":"ns=1;i=9596"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasProperty","target":"ns=1;i=14901"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9595","parentNodeId":"ns=1;i=9564","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9564"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9597","parentNodeId":"ns=1;i=9564","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9564"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9596","parentNodeId":"ns=1;i=9564","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9564"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14901","parentNodeId":"ns=1;i=9564","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9564"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:MotorCurrent","dataType":"Double","description":[{"value":"Measured actual motor current."}],"displayName":[{"value":"MotorCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9566","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9598"},{"referenceType":"HasProperty","target":"ns=1;i=9600"},{"referenceType":"HasProperty","target":"ns=1;i=9599"},{"referenceType":"HasProperty","target":"ns=1;i=14905"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9598","parentNodeId":"ns=1;i=9566","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9566"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9600","parentNodeId":"ns=1;i=9566","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9566"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9599","parentNodeId":"ns=1;i=9566","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9566"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14905","parentNodeId":"ns=1;i=9566","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9566"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the motor power input P_mot delivered as pump power input P_mot, u"}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9568","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9601"},{"referenceType":"HasProperty","target":"ns=1;i=9603"},{"referenceType":"HasProperty","target":"ns=1;i=9602"},{"referenceType":"HasProperty","target":"ns=1;i=14909"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9601","parentNodeId":"ns=1;i=9568","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9568"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9603","parentNodeId":"ns=1;i=9568","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9568"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9602","parentNodeId":"ns=1;i=9568","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9568"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14909","parentNodeId":"ns=1;i=9568","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9568"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MotorTemperature","dataType":"Double","description":[{"value":"Measured temperature of the motor."}],"displayName":[{"value":"MotorTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9570","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9604"},{"referenceType":"HasProperty","target":"ns=1;i=9606"},{"referenceType":"HasProperty","target":"ns=1;i=9605"},{"referenceType":"HasProperty","target":"ns=1;i=14913"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9604","parentNodeId":"ns=1;i=9570","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9570"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9606","parentNodeId":"ns=1;i=9570","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9570"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9605","parentNodeId":"ns=1;i=9570","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9570"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14913","parentNodeId":"ns=1;i=9570","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9570"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MotorVoltage","dataType":"Double","description":[{"value":"Measured actual motor voltage."}],"displayName":[{"value":"MotorVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9572","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9607"},{"referenceType":"HasProperty","target":"ns=1;i=9609"},{"referenceType":"HasProperty","target":"ns=1;i=9608"},{"referenceType":"HasProperty","target":"ns=1;i=14917"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9607","parentNodeId":"ns=1;i=9572","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9572"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9609","parentNodeId":"ns=1;i=9572","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9572"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9608","parentNodeId":"ns=1;i=9572","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9572"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14917","parentNodeId":"ns=1;i=9572","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9572"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Determined power factor of the motor."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9574","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9610"},{"referenceType":"HasProperty","target":"ns=1;i=9612"},{"referenceType":"HasProperty","target":"ns=1;i=9611"},{"referenceType":"HasProperty","target":"ns=1;i=14921"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9610","parentNodeId":"ns=1;i=9574","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9574"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9612","parentNodeId":"ns=1;i=9574","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9574"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9611","parentNodeId":"ns=1;i=9574","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9574"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14921","parentNodeId":"ns=1;i=9574","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9574"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:Torque","dataType":"Double","description":[{"value":"Measured torque of the motor."}],"displayName":[{"value":"Torque"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9576","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9613"},{"referenceType":"HasProperty","target":"ns=1;i=9615"},{"referenceType":"HasProperty","target":"ns=1;i=9614"},{"referenceType":"HasProperty","target":"ns=1;i=14929"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9613","parentNodeId":"ns=1;i=9576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9615","parentNodeId":"ns=1;i=9576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20053\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u00B7m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9614","parentNodeId":"ns=1;i=9576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity described by the vector product M=r * F where r is position vector with respect to the axis of rotation and F is force"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14929","parentNodeId":"ns=1;i=9576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9576"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emoment of force\u003C/uax:String\u003E"},{"browseName":"1:Voltage","dataType":"Double","description":[{"value":"Measured actual mains voltage of the motor."}],"displayName":[{"value":"Voltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9578","parentNodeId":"ns=1;i=5116","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9616"},{"referenceType":"HasProperty","target":"ns=1;i=9618"},{"referenceType":"HasProperty","target":"ns=1;i=9617"},{"referenceType":"HasProperty","target":"ns=1;i=14937"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5116"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9616","parentNodeId":"ns=1;i=9578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9578"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9618","parentNodeId":"ns=1;i=9578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9578"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9617","parentNodeId":"ns=1;i=9578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9578"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14937","parentNodeId":"ns=1;i=9578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9578"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:InletConnectionPortType","displayName":[{"value":"InletConnectionPortType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.38","nodeClass":"ObjectType","nodeId":"ns=1;i=1036","references":[{"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasComponent","target":"ns=1;i=5108"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1035"},{"referenceType":"HasComponent","target":"ns=1;i=5109"},{"referenceType":"HasComponent","target":"ns=1;i=5110"}],"superType":"ns=1;i=1035"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the inlet connection."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5107","parentNodeId":"ns=1;i=1036","references":[{"referenceType":"HasComponent","target":"ns=1;i=9619"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1036"},{"referenceType":"HasComponent","target":"ns=1;i=9620"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1041"},{"referenceType":"HasComponent","target":"ns=1;i=9621"},{"referenceType":"HasComponent","target":"ns=1;i=9622"},{"referenceType":"HasComponent","target":"ns=1;i=9623"},{"referenceType":"HasComponent","target":"ns=1;i=9624"},{"referenceType":"HasComponent","target":"ns=1;i=9625"},{"referenceType":"HasComponent","target":"ns=1;i=9626"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9627"}],"typeDefinition":"ns=1;i=1041"},{"browseName":"1:CriticalBackingPressure","dataType":"Double","description":[{"value":"Maximum backing pressure for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump."}],"displayName":[{"value":"CriticalBackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9619","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasProperty","target":"ns=1;i=9628"},{"referenceType":"HasProperty","target":"ns=1;i=9630"},{"referenceType":"HasProperty","target":"ns=1;i=9629"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9628","parentNodeId":"ns=1;i=9619","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9619"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9630","parentNodeId":"ns=1;i=9619","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9619"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9629","parentNodeId":"ns=1;i=9619","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9619"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the entry opening in the inlet connection of the pump."}],"displayName":[{"value":"InletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9620","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9631"},{"referenceType":"HasProperty","target":"ns=1;i=9633"},{"referenceType":"HasProperty","target":"ns=1;i=9632"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9631","parentNodeId":"ns=1;i=9620","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9620"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9633","parentNodeId":"ns=1;i=9620","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9620"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9632","parentNodeId":"ns=1;i=9620","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9620"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumAllowableInletPressure","dataType":"Double","description":[{"value":"Highest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9621","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9634"},{"referenceType":"HasProperty","target":"ns=1;i=9636"},{"referenceType":"HasProperty","target":"ns=1;i=9635"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9634","parentNodeId":"ns=1;i=9621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9636","parentNodeId":"ns=1;i=9621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9635","parentNodeId":"ns=1;i=9621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9621"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumTolerableWaterVaporInletPressure","dataType":"Double","description":[{"value":"The highest water vapor inlet pressure at which a gas ballast pump, under normal ambient conditions, can pump and exhaust pure water vapor in continuous Operation."}],"displayName":[{"value":"MaximumTolerableWaterVaporInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9622","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9637"},{"referenceType":"HasProperty","target":"ns=1;i=9639"},{"referenceType":"HasProperty","target":"ns=1;i=9638"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9637","parentNodeId":"ns=1;i=9622","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9622"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9639","parentNodeId":"ns=1;i=9622","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9622"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9638","parentNodeId":"ns=1;i=9622","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9622"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumWorkingPressure","dataType":"Double","description":[{"value":"instantaneous inlet pressure with adequate margin above the minimum liquid vapor pressure expected."}],"displayName":[{"value":"MaximumWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9623","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9640"},{"referenceType":"HasProperty","target":"ns=1;i=9642"},{"referenceType":"HasProperty","target":"ns=1;i=9641"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9640","parentNodeId":"ns=1;i=9623","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9623"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9642","parentNodeId":"ns=1;i=9623","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9623"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9641","parentNodeId":"ns=1;i=9623","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9623"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableInletPressure","dataType":"Double","description":[{"value":"Lowest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9624","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9643"},{"referenceType":"HasProperty","target":"ns=1;i=9645"},{"referenceType":"HasProperty","target":"ns=1;i=9644"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9643","parentNodeId":"ns=1;i=9624","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9624"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9645","parentNodeId":"ns=1;i=9624","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9624"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9644","parentNodeId":"ns=1;i=9624","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9624"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NetPositiveInletPressureRequired","dataType":"Double","description":[{"value":"Total inlet pressure required to ensure there is enough margin to maintain the minimum."}],"displayName":[{"value":"NetPositiveInletPressureRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9625","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9646"},{"referenceType":"HasProperty","target":"ns=1;i=9648"},{"referenceType":"HasProperty","target":"ns=1;i=9647"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9646","parentNodeId":"ns=1;i=9625","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9625"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9648","parentNodeId":"ns=1;i=9625","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9625"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9647","parentNodeId":"ns=1;i=9625","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9625"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9626","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9649"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9649","parentNodeId":"ns=1;i=9626","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9626"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:WaterVaporCapacity","dataType":"Double","description":[{"value":"Mass of water which can be conveyed by the pump without condensation per time."}],"displayName":[{"value":"WaterVaporCapacity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9627","parentNodeId":"ns=1;i=5107","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9650"},{"referenceType":"HasProperty","target":"ns=1;i=9652"},{"referenceType":"HasProperty","target":"ns=1;i=9651"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5107"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9650","parentNodeId":"ns=1;i=9627","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9627"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9652","parentNodeId":"ns=1;i=9627","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9627"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4600375\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eg/h\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Egram per hour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9651","parentNodeId":"ns=1;i=9627","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9627"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Implementation","description":[{"value":"Properties that describe the specific installation and operational situation of the inlet connection."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5108","parentNodeId":"ns=1;i=1036","references":[{"referenceType":"HasComponent","target":"ns=1;i=9653"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1036"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1047"},{"referenceType":"HasComponent","target":"ns=1;i=9654"},{"referenceType":"HasComponent","target":"ns=1;i=9655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9656"},{"referenceType":"HasComponent","target":"ns=1;i=9657"}],"typeDefinition":"ns=1;i=1047"},{"accessLevel":3,"browseName":"1:HeightOfTheInletConnection","dataType":"Double","description":[{"value":"Height of the center of the inlet connection of the pump"}],"displayName":[{"value":"HeightOfTheInletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9653","parentNodeId":"ns=1;i=5108","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9658"},{"referenceType":"HasProperty","target":"ns=1;i=9660"},{"referenceType":"HasProperty","target":"ns=1;i=9659"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5108"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9658","parentNodeId":"ns=1;i=9653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9660","parentNodeId":"ns=1;i=9653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9659","parentNodeId":"ns=1;i=9653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9653"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtInlet","dataType":"Double","description":[{"value":"Rated flow at pump inlet connection divided by the inlet area of the pump"}],"displayName":[{"value":"MeanRatedVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9654","parentNodeId":"ns=1;i=5108","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9661"},{"referenceType":"HasProperty","target":"ns=1;i=9663"},{"referenceType":"HasProperty","target":"ns=1;i=9662"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5108"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9661","parentNodeId":"ns=1;i=9654","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9654"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9663","parentNodeId":"ns=1;i=9654","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9654"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9662","parentNodeId":"ns=1;i=9654","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9654"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9655","parentNodeId":"ns=1;i=5108","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9664"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5108"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9664","parentNodeId":"ns=1;i=9655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressure","dataType":"Double","description":[{"value":"Inlet pressure of the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9656","parentNodeId":"ns=1;i=5108","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9665"},{"referenceType":"HasProperty","target":"ns=1;i=9667"},{"referenceType":"HasProperty","target":"ns=1;i=9666"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5108"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9665","parentNodeId":"ns=1;i=9656","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9656"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9667","parentNodeId":"ns=1;i=9656","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9656"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9666","parentNodeId":"ns=1;i=9656","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9656"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at inlet area of the pump, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9657","parentNodeId":"ns=1;i=5108","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9668"},{"referenceType":"HasProperty","target":"ns=1;i=9670"},{"referenceType":"HasProperty","target":"ns=1;i=9669"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5108"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9668","parentNodeId":"ns=1;i=9657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9670","parentNodeId":"ns=1;i=9657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9669","parentNodeId":"ns=1;i=9657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All measurements of the operation which describe the inlet connection."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5109","parentNodeId":"ns=1;i=1036","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1050"},{"referenceType":"HasComponent","target":"ns=1;i=9671"},{"referenceType":"HasComponent","target":"ns=1;i=9673"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1036"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"ns=1;i=1050"},{"browseName":"1:InletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the inlet area of the pump."}],"displayName":[{"value":"InletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9671","parentNodeId":"ns=1;i=5109","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9675"},{"referenceType":"HasProperty","target":"ns=1;i=9677"},{"referenceType":"HasProperty","target":"ns=1;i=9676"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5109"},{"referenceType":"HasProperty","target":"ns=1;i=14945"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9675","parentNodeId":"ns=1;i=9671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9677","parentNodeId":"ns=1;i=9671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9676","parentNodeId":"ns=1;i=9671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14945","parentNodeId":"ns=1;i=9671","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9671"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtInlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump inlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9673","parentNodeId":"ns=1;i=5109","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9678"},{"referenceType":"HasProperty","target":"ns=1;i=9680"},{"referenceType":"HasProperty","target":"ns=1;i=9679"},{"referenceType":"HasProperty","target":"ns=1;i=14953"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5109"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9678","parentNodeId":"ns=1;i=9673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9680","parentNodeId":"ns=1;i=9673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9679","parentNodeId":"ns=1;i=9673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14953","parentNodeId":"ns=1;i=9673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9673"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:SystemRequirements","description":[{"value":"Buyer\u0027s properties that describe the installation situation of the inlet port."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5110","parentNodeId":"ns=1;i=1036","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1045"},{"referenceType":"HasComponent","target":"ns=1;i=9681"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1036"}],"typeDefinition":"ns=1;i=1045"},{"accessLevel":3,"browseName":"1:InletPressure","dataType":"Double","description":[{"value":"Pressure at the inlet of the pump, measured at a defined location in the test dome."}],"displayName":[{"value":"InletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9681","parentNodeId":"ns=1;i=5110","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9682"},{"referenceType":"HasProperty","target":"ns=1;i=9684"},{"referenceType":"HasProperty","target":"ns=1;i=9683"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5110"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9682","parentNodeId":"ns=1;i=9681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9684","parentNodeId":"ns=1;i=9681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9683","parentNodeId":"ns=1;i=9681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9681"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletConnectionPortType","displayName":[{"value":"OutletConnectionPortType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.39","nodeClass":"ObjectType","nodeId":"ns=1;i=1037","references":[{"referenceType":"HasComponent","target":"ns=1;i=5111"},{"referenceType":"HasComponent","target":"ns=1;i=5112"},{"referenceType":"HasComponent","target":"ns=1;i=5113"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=1;i=1035"},{"referenceType":"HasComponent","target":"ns=1;i=5114"}],"superType":"ns=1;i=1035"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the outlet connection."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5111","parentNodeId":"ns=1;i=1037","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1037"},{"referenceType":"HasComponent","target":"ns=1;i=9685"},{"referenceType":"HasComponent","target":"ns=1;i=9686"},{"referenceType":"HasComponent","target":"ns=1;i=9687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9688"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1042"},{"referenceType":"HasComponent","target":"ns=1;i=9689"},{"referenceType":"HasComponent","target":"ns=1;i=9690"},{"referenceType":"HasComponent","target":"ns=1;i=9691"},{"referenceType":"HasComponent","target":"ns=1;i=9692"}],"typeDefinition":"ns=1;i=1042"},{"browseName":"1:MaximumAllowableOutletPressure","dataType":"Double","description":[{"value":"Highest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9685","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9693"},{"referenceType":"HasProperty","target":"ns=1;i=9695"},{"referenceType":"HasProperty","target":"ns=1;i=9694"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9693","parentNodeId":"ns=1;i=9685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9695","parentNodeId":"ns=1;i=9685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9694","parentNodeId":"ns=1;i=9685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9685"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableOutetPressure","dataType":"Double","description":[{"value":"Lowest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableOutetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9686","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9696"},{"referenceType":"HasProperty","target":"ns=1;i=9698"},{"referenceType":"HasProperty","target":"ns=1;i=9697"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9696","parentNodeId":"ns=1;i=9686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9698","parentNodeId":"ns=1;i=9686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9697","parentNodeId":"ns=1;i=9686","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9686"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9687","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9699"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9699","parentNodeId":"ns=1;i=9687","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9687"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the orifice in the outlet connection of the pump."}],"displayName":[{"value":"OutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9688","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9700"},{"referenceType":"HasProperty","target":"ns=1;i=9702"},{"referenceType":"HasProperty","target":"ns=1;i=9701"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9700","parentNodeId":"ns=1;i=9688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9688"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9702","parentNodeId":"ns=1;i=9688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9688"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9701","parentNodeId":"ns=1;i=9688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9688"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveAccumulationPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will pass the total pump flow."}],"displayName":[{"value":"ReliefValveAccumulationPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9689","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9703"},{"referenceType":"HasProperty","target":"ns=1;i=9705"},{"referenceType":"HasProperty","target":"ns=1;i=9704"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9703","parentNodeId":"ns=1;i=9689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9705","parentNodeId":"ns=1;i=9689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9704","parentNodeId":"ns=1;i=9689","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9689"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveBackPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of the relief valve when the valve is closed."}],"displayName":[{"value":"ReliefValveBackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9690","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9706"},{"referenceType":"HasProperty","target":"ns=1;i=9708"},{"referenceType":"HasProperty","target":"ns=1;i=9707"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9706","parentNodeId":"ns=1;i=9690","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9690"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9708","parentNodeId":"ns=1;i=9690","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9690"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9707","parentNodeId":"ns=1;i=9690","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9690"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveReseatPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will close after passing the total pump flow."}],"displayName":[{"value":"ReliefValveReseatPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9691","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9709"},{"referenceType":"HasProperty","target":"ns=1;i=9711"},{"referenceType":"HasProperty","target":"ns=1;i=9710"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9709","parentNodeId":"ns=1;i=9691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9711","parentNodeId":"ns=1;i=9691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9710","parentNodeId":"ns=1;i=9691","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9691"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveSetPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve begins to open."}],"displayName":[{"value":"ReliefValveSetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9692","parentNodeId":"ns=1;i=5111","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9712"},{"referenceType":"HasProperty","target":"ns=1;i=9714"},{"referenceType":"HasProperty","target":"ns=1;i=9713"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5111"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9712","parentNodeId":"ns=1;i=9692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9714","parentNodeId":"ns=1;i=9692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9713","parentNodeId":"ns=1;i=9692","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9692"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Implementation","description":[{"value":"Properties that describe the specific installation and operational situation of the outlet connection."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5112","parentNodeId":"ns=1;i=1037","references":[{"referenceType":"HasComponent","target":"ns=1;i=9715"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1037"},{"referenceType":"HasComponent","target":"ns=1;i=9716"},{"referenceType":"HasComponent","target":"ns=1;i=9717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1048"},{"referenceType":"HasComponent","target":"ns=1;i=9718"},{"referenceType":"HasComponent","target":"ns=1;i=9719"}],"typeDefinition":"ns=1;i=1048"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletConnection","dataType":"Double","description":[{"value":"Height of the center of the outlet connection of the pump."}],"displayName":[{"value":"HeightOfTheOutletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9715","parentNodeId":"ns=1;i=5112","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9720"},{"referenceType":"HasProperty","target":"ns=1;i=9722"},{"referenceType":"HasProperty","target":"ns=1;i=9721"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5112"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9720","parentNodeId":"ns=1;i=9715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9722","parentNodeId":"ns=1;i=9715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9721","parentNodeId":"ns=1;i=9715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtOutlet","dataType":"Double","description":[{"value":"Rated flow at pump outlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanRatedVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9716","parentNodeId":"ns=1;i=5112","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9723"},{"referenceType":"HasProperty","target":"ns=1;i=9725"},{"referenceType":"HasProperty","target":"ns=1;i=9724"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5112"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9723","parentNodeId":"ns=1;i=9716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9725","parentNodeId":"ns=1;i=9716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9724","parentNodeId":"ns=1;i=9716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9716"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9717","parentNodeId":"ns=1;i=5112","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=9726"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5112"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9726","parentNodeId":"ns=1;i=9717","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9717"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedOutletPressure","dataType":"Double","description":[{"value":"Outlet pressure of the pump at the guarantee point with rated flow and rated speed, as well as rated inlet pressure, for rotodynamic pumps only."}],"displayName":[{"value":"RatedOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9718","parentNodeId":"ns=1;i=5112","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9727"},{"referenceType":"HasProperty","target":"ns=1;i=9729"},{"referenceType":"HasProperty","target":"ns=1;i=9728"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5112"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9727","parentNodeId":"ns=1;i=9718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9729","parentNodeId":"ns=1;i=9718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9728","parentNodeId":"ns=1;i=9718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9718"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at outlet area of the pump, corresponding to the sum of the height, pressure head and velocity head."}],"displayName":[{"value":"TotalHeadAtOutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9719","parentNodeId":"ns=1;i=5112","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9730"},{"referenceType":"HasProperty","target":"ns=1;i=9732"},{"referenceType":"HasProperty","target":"ns=1;i=9731"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5112"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9730","parentNodeId":"ns=1;i=9719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9732","parentNodeId":"ns=1;i=9719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9731","parentNodeId":"ns=1;i=9719","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9719"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All measurements of the operation which describe the outlet connection."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5113","parentNodeId":"ns=1;i=1037","references":[{"referenceType":"HasComponent","target":"ns=1;i=9733"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1037"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1049"},{"referenceType":"HasComponent","target":"ns=1;i=9735"}],"typeDefinition":"ns=1;i=1049"},{"browseName":"1:MeanVelocityAtOutlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump outlet connection divided by the outlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9733","parentNodeId":"ns=1;i=5113","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9737"},{"referenceType":"HasProperty","target":"ns=1;i=9739"},{"referenceType":"HasProperty","target":"ns=1;i=9738"},{"referenceType":"HasProperty","target":"ns=1;i=14961"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5113"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9737","parentNodeId":"ns=1;i=9733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9739","parentNodeId":"ns=1;i=9733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9738","parentNodeId":"ns=1;i=9733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14961","parentNodeId":"ns=1;i=9733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9733"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:OutletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the outlet area of the pump."}],"displayName":[{"value":"OutletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9735","parentNodeId":"ns=1;i=5113","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9740"},{"referenceType":"HasProperty","target":"ns=1;i=9742"},{"referenceType":"HasProperty","target":"ns=1;i=9741"},{"referenceType":"HasProperty","target":"ns=1;i=14970"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5113"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9740","parentNodeId":"ns=1;i=9735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9742","parentNodeId":"ns=1;i=9735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9741","parentNodeId":"ns=1;i=9735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14970","parentNodeId":"ns=1;i=9735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:SystemRequirements","description":[{"value":"Buyer\u0027s properties that describe the installation situation of the outlet port."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5114","parentNodeId":"ns=1;i=1037","references":[{"referenceType":"HasComponent","target":"ns=1;i=9743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1044"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1037"}],"typeDefinition":"ns=1;i=1044"},{"accessLevel":3,"browseName":"1:BackingPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of a vacuum pump."}],"displayName":[{"value":"BackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9743","parentNodeId":"ns=1;i=5114","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5114"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9744"},{"referenceType":"HasProperty","target":"ns=1;i=9746"},{"referenceType":"HasProperty","target":"ns=1;i=9745"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9744","parentNodeId":"ns=1;i=9743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9746","parentNodeId":"ns=1;i=9743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9745","parentNodeId":"ns=1;i=9743","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9743"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PumpType","displayName":[{"value":"PumpType"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/7.1","nodeClass":"ObjectType","nodeId":"ns=1;i=1052","references":[{"referenceType":"HasComponent","target":"ns=1;i=5118"},{"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=5117"},{"referenceType":"HasComponent","target":"ns=1;i=5120"},{"referenceType":"HasComponent","target":"ns=1;i=5121"},{"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasComponent","target":"ns=1;i=5123"},{"isForward":false,"referenceType":"HasSubtype","target":"ns=3;i=1001"}],"superType":"ns=3;i=1001"},{"browseName":"3:Configuration","description":[{"value":"Static design, system requirements, and implementation data of the pump."}],"displayName":[{"value":"Configuration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5118","parentNodeId":"ns=1;i=1052","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1024"},{"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"ns=1;i=1024"},{"browseName":"1:Design","description":[{"value":"Static design properties for a pump."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5131","parentNodeId":"ns=1;i=5118","references":[{"referenceType":"HasComponent","target":"ns=1;i=10241"},{"referenceType":"HasComponent","target":"ns=1;i=10170"},{"referenceType":"HasComponent","target":"ns=1;i=10171"},{"referenceType":"HasComponent","target":"ns=1;i=10172"},{"referenceType":"HasComponent","target":"ns=1;i=10173"},{"referenceType":"HasComponent","target":"ns=1;i=10176"},{"referenceType":"HasComponent","target":"ns=1;i=10179"},{"referenceType":"HasComponent","target":"ns=1;i=10180"},{"referenceType":"HasComponent","target":"ns=1;i=10183"},{"referenceType":"HasComponent","target":"ns=1;i=10184"},{"referenceType":"HasComponent","target":"ns=1;i=10185"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5118"},{"referenceType":"HasComponent","target":"ns=1;i=10188"},{"referenceType":"HasComponent","target":"ns=1;i=10189"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1020"},{"referenceType":"HasComponent","target":"ns=1;i=10190"},{"referenceType":"HasComponent","target":"ns=1;i=10191"},{"referenceType":"HasComponent","target":"ns=1;i=10192"},{"referenceType":"HasComponent","target":"ns=1;i=10194"},{"referenceType":"HasComponent","target":"ns=1;i=10193"},{"referenceType":"HasComponent","target":"ns=1;i=10195"},{"referenceType":"HasComponent","target":"ns=1;i=5134"},{"referenceType":"HasComponent","target":"ns=1;i=10215"},{"referenceType":"HasComponent","target":"ns=1;i=10216"},{"referenceType":"HasComponent","target":"ns=1;i=10217"},{"referenceType":"HasComponent","target":"ns=1;i=10218"},{"referenceType":"HasComponent","target":"ns=1;i=10219"},{"referenceType":"HasComponent","target":"ns=1;i=10220"},{"referenceType":"HasComponent","target":"ns=1;i=10221"},{"referenceType":"HasComponent","target":"ns=1;i=10222"},{"referenceType":"HasComponent","target":"ns=1;i=10223"},{"referenceType":"HasComponent","target":"ns=1;i=10224"},{"referenceType":"HasComponent","target":"ns=1;i=10225"},{"referenceType":"HasComponent","target":"ns=1;i=10226"},{"referenceType":"HasComponent","target":"ns=1;i=10227"},{"referenceType":"HasComponent","target":"ns=1;i=10228"},{"referenceType":"HasComponent","target":"ns=1;i=10229"},{"referenceType":"HasComponent","target":"ns=1;i=10230"},{"referenceType":"HasComponent","target":"ns=1;i=10231"},{"referenceType":"HasComponent","target":"ns=1;i=10232"},{"referenceType":"HasComponent","target":"ns=1;i=10233"},{"referenceType":"HasComponent","target":"ns=1;i=10234"},{"referenceType":"HasComponent","target":"ns=1;i=10235"},{"referenceType":"HasComponent","target":"ns=1;i=10236"},{"referenceType":"HasComponent","target":"ns=1;i=10237"},{"referenceType":"HasComponent","target":"ns=1;i=10238"},{"referenceType":"HasComponent","target":"ns=1;i=10239"},{"referenceType":"HasComponent","target":"ns=1;i=10240"},{"referenceType":"HasComponent","target":"ns=1;i=10242"},{"referenceType":"HasComponent","target":"ns=1;i=10243"},{"referenceType":"HasComponent","target":"ns=1;i=10244"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10245"},{"referenceType":"HasComponent","target":"ns=1;i=10246"},{"referenceType":"HasComponent","target":"ns=1;i=10247"},{"referenceType":"HasComponent","target":"ns=1;i=10343"},{"referenceType":"HasComponent","target":"ns=1;i=5135"},{"referenceType":"HasComponent","target":"ns=1;i=5136"},{"referenceType":"HasComponent","target":"ns=1;i=5137"},{"referenceType":"HasComponent","target":"ns=1;i=5138"},{"referenceType":"HasComponent","target":"ns=1;i=5139"},{"referenceType":"HasComponent","target":"ns=1;i=10344"},{"referenceType":"HasComponent","target":"ns=1;i=10345"},{"referenceType":"HasComponent","target":"ns=1;i=10346"},{"referenceType":"HasComponent","target":"ns=1;i=10347"},{"referenceType":"HasComponent","target":"ns=1;i=10348"},{"referenceType":"HasComponent","target":"ns=1;i=10349"},{"referenceType":"HasComponent","target":"ns=1;i=10350"},{"referenceType":"HasComponent","target":"ns=1;i=10351"},{"referenceType":"HasComponent","target":"ns=1;i=10352"},{"referenceType":"HasComponent","target":"ns=1;i=10353"},{"referenceType":"HasComponent","target":"ns=1;i=5140"},{"referenceType":"HasComponent","target":"ns=1;i=10373"},{"referenceType":"HasComponent","target":"ns=1;i=10374"},{"referenceType":"HasComponent","target":"ns=1;i=10375"},{"referenceType":"HasComponent","target":"ns=1;i=10376"},{"referenceType":"HasComponent","target":"ns=1;i=10377"},{"referenceType":"HasComponent","target":"ns=1;i=10378"},{"referenceType":"HasComponent","target":"ns=1;i=10379"},{"referenceType":"HasComponent","target":"ns=1;i=10380"},{"referenceType":"HasComponent","target":"ns=1;i=10381"},{"referenceType":"HasComponent","target":"ns=1;i=10382"},{"referenceType":"HasComponent","target":"ns=1;i=10383"}],"typeDefinition":"ns=1;i=1020"},{"arrayDimensions":"128","browseName":"1:AdditionalFieldbuses","dataType":"String","description":[{"value":"Additional fieldbuses supported by the product."}],"displayName":[{"value":"AdditionalFieldbuses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10241","parentNodeId":"ns=1;i=5131","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13501"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueRank":1,"valueXml":"\u003Cuax:ListOfString xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:String\u003E\n \u003C/uax:String\u003E\n \u003C/uax:ListOfString\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13501","parentNodeId":"ns=1;i=10241","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:BalancingRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow which is extracted to activate a balance device"}],"displayName":[{"value":"BalancingRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10170","parentNodeId":"ns=1;i=5131","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12087"},{"referenceType":"HasProperty","target":"ns=1;i=12088"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12087","parentNodeId":"ns=1;i=10170","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10170"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12088","parentNodeId":"ns=1;i=10170","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10170"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:BasePressure","dataType":"Double","description":[{"value":"Pressure obtained in the test dome after conditioning the vacuum pump and the test dome"}],"displayName":[{"value":"BasePressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10171","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13269"},{"referenceType":"HasProperty","target":"ns=1;i=13270"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13269","parentNodeId":"ns=1;i=10171","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10171"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13270","parentNodeId":"ns=1;i=10171","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10171"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ClearanceVolume","dataType":"Double","description":[{"value":"Volume remaining unswept at the end of the discharge stroke."}],"displayName":[{"value":"ClearanceVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10172","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13272"},{"referenceType":"HasProperty","target":"ns=1;i=13273"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13272","parentNodeId":"ns=1;i=10172","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10172"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13273","parentNodeId":"ns=1;i=10172","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10172"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ClockwiseRotation","dataType":"Boolean","description":[{"value":"Direction of rotation in which the shaft is seen to be turning in a clockwise direction when viewing the drive end of the shaft. A \u0022True\u0022 status means that the rotation of pump is clockwise and a \u0022False\u0022 status means that the rotation of pump is anticlockwise."}],"displayName":[{"value":"ClockwiseRotation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10173","parentNodeId":"ns=1;i=5131","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13276"},{"referenceType":"HasProperty","target":"ns=1;i=10174"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10175"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13276","parentNodeId":"ns=1;i=10173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10173"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10174","parentNodeId":"ns=1;i=10173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10173"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10175","parentNodeId":"ns=1;i=10173","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10173"}],"typeDefinition":"i=68"},{"browseName":"1:Controllable","dataType":"Boolean","description":[{"value":"Indicates whether the product is a controllable pump or a self-controlling pump. A \u0022True\u0022 status means that the pump is controllable and a \u0022False\u0022 status means that the pump is not controllable."}],"displayName":[{"value":"Controllable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10176","parentNodeId":"ns=1;i=5131","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13279"},{"referenceType":"HasProperty","target":"ns=1;i=10177"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10178"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13279","parentNodeId":"ns=1;i=10176","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10176"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10177","parentNodeId":"ns=1;i=10176","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10176"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10178","parentNodeId":"ns=1;i=10176","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10176"}],"typeDefinition":"i=68"},{"browseName":"1:Cool_DownTimeForAVaporJetPumpOrADiffusionPump","dataType":"Double","description":[{"value":"The cool-down time is the time required to cool the propellant from the working temperature to a temperature at which the propellant can be exposed to atmospheric air without risk after the heating has been switched off."}],"displayName":[{"value":"Cool_DownTimeForAVaporJetPumpOrADiffusionPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10179","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13284"},{"referenceType":"HasProperty","target":"ns=1;i=13285"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13284","parentNodeId":"ns=1;i=10179","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10179"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13285","parentNodeId":"ns=1;i=10179","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10179"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Counter_ClockwiseRotation","dataType":"Boolean","description":[{"value":"Direction of rotation in which the shaft is seen to be turning in an anticlockwise direction, when viewing the drive end of the shaft. A \u0022True\u0022 status means that the rotation of pump is anticlockwise and a \u0022False\u0022 status means that the rotation of pump is clockwise."}],"displayName":[{"value":"Counter_ClockwiseRotation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10180","parentNodeId":"ns=1;i=5131","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13288"},{"referenceType":"HasProperty","target":"ns=1;i=10181"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10182"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13288","parentNodeId":"ns=1;i=10180","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10180"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10181","parentNodeId":"ns=1;i=10180","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10180"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10182","parentNodeId":"ns=1;i=10180","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10180"}],"typeDefinition":"i=68"},{"browseName":"1:CriticalSpeed","dataType":"Double","description":[{"value":"Speed of rotation at which the frequency of vibration (or its multiples) corresponds to the rotor resonant (lateral or torsional)"}],"displayName":[{"value":"CriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10183","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13293"},{"referenceType":"HasProperty","target":"ns=1;i=13294"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13293","parentNodeId":"ns=1;i=10183","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10183"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13294","parentNodeId":"ns=1;i=10183","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10183"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DeclarationOfConformity","dataType":"String","description":[{"value":"Publicly accessible attestation of conformity, commonly available on websites."}],"displayName":[{"value":"DeclarationOfConformity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10184","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13297"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13297","parentNodeId":"ns=1;i=10184","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10184"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DeclarationOfConformityAvailable","dataType":"Boolean","description":[{"value":"Whether or not a declaration of conformity exists. A \u0022True\u0022 status means that the declaration exists and a \u0022False\u0022 status means that there is no declaration available."}],"displayName":[{"value":"DeclarationOfConformityAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10185","parentNodeId":"ns=1;i=5131","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13300"},{"referenceType":"HasProperty","target":"ns=1;i=10186"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10187"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13300","parentNodeId":"ns=1;i=10185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10185"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10186","parentNodeId":"ns=1;i=10185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10185"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10187","parentNodeId":"ns=1;i=10185","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10185"}],"typeDefinition":"i=68"},{"browseName":"1:DesignAxialLoad","dataType":"Double","description":[{"value":"Residual axial thrust on the pump rotor on which the thrust-bearing selection is based."}],"displayName":[{"value":"DesignAxialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10188","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13305"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13306"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13305","parentNodeId":"ns=1;i=10188","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10188"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13306","parentNodeId":"ns=1;i=10188","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10188"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DesignRadialLoad","dataType":"Double","description":[{"value":"Radial load of the pump rotor for which the bearing system is selected."}],"displayName":[{"value":"DesignRadialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10189","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13311"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13312"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13311","parentNodeId":"ns=1;i=10189","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10189"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13312","parentNodeId":"ns=1;i=10189","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10189"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:DirectivesOfEUDeclarationOfConformity","dataType":"DeclarationOfConformityOptionSet","description":[{"value":"Set of directives on the basis of which conformity was determined."}],"displayName":[{"value":"DirectivesOfEUDeclarationOfConformity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10190","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ens=1;i=5014\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003COptionSet xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CValue\u003EAA==\u003C/Value\u003E\n \u003CValidBits\u003E/w==\u003C/ValidBits\u003E\n \u003C/OptionSet\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13318","parentNodeId":"ns=1;i=10190","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10190"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DryCriticalSpeed","dataType":"Double","description":[{"value":"Rotor resonant frequency calculated assuming that the rotor is supported only at its bearings and that the bearings are of infinite stiffness"}],"displayName":[{"value":"DryCriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10191","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13323"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13324"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13323","parentNodeId":"ns=1;i=10191","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10191"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13324","parentNodeId":"ns=1;i=10191","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10191"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:ExplosionProtection","dataType":"ExplosionProtectionOptionSet","description":[{"value":"Device category for explosion protection according to 2014/34/EU (ATEX)."}],"displayName":[{"value":"ExplosionProtection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10192","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13327"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13327","parentNodeId":"ns=1;i=10192","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10192"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GeometricalFlow","dataType":"Double","description":[{"value":"Product of geometrical displacement volume and speed of rotation or stroke frequency"}],"displayName":[{"value":"GeometricalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10194","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13332"},{"referenceType":"HasProperty","target":"ns=1;i=13333"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13332","parentNodeId":"ns=1;i=10194","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10194"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13333","parentNodeId":"ns=1;i=10194","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10194"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:GeometricDisplacementVolume","dataType":"Double","description":[{"value":"Displacement volume for one stroke or one cycle."}],"displayName":[{"value":"GeometricDisplacementVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10193","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13338"},{"referenceType":"HasProperty","target":"ns=1;i=13339"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13338","parentNodeId":"ns=1;i=10193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13339","parentNodeId":"ns=1;i=10193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:HeadAtPeakPoint","dataType":"Double","description":[{"value":"Highest total head developed by a pump when this does not occur at a zero rate of flow"}],"displayName":[{"value":"HeadAtPeakPoint"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10195","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13344"},{"referenceType":"HasProperty","target":"ns=1;i=13345"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13344","parentNodeId":"ns=1;i=10195","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10195"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13345","parentNodeId":"ns=1;i=10195","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10195"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:InstallationNpshCurve","description":[{"value":"Relationship between the net positive suction head available and the rate of flow at given operating conditions for a given liquid"}],"displayName":[{"value":"InstallationNpshCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5134","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10196"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10198"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=13348"},{"referenceType":"HasComponent","target":"ns=1;i=10201"},{"referenceType":"HasProperty","target":"ns=1;i=10204"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10205"},{"referenceType":"HasComponent","target":"ns=1;i=10208"},{"referenceType":"HasProperty","target":"ns=1;i=10210"},{"referenceType":"HasProperty","target":"ns=1;i=10211"},{"referenceType":"HasProperty","target":"ns=1;i=10212"},{"referenceType":"HasComponent","target":"ns=1;i=10213"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10196","parentNodeId":"ns=1;i=5134","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5134"},{"referenceType":"HasProperty","target":"ns=1;i=10197"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10197","parentNodeId":"ns=1;i=10196","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10196"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10198","parentNodeId":"ns=1;i=5134","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5134"},{"referenceType":"HasProperty","target":"ns=1;i=10199"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10200"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10199","parentNodeId":"ns=1;i=10198","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10198"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10200","parentNodeId":"ns=1;i=10198","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10198"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13348","parentNodeId":"ns=1;i=5134","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5134"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10201","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasProperty","target":"ns=1;i=10202"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5134"},{"referenceType":"HasProperty","target":"ns=1;i=10203"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10202","parentNodeId":"ns=1;i=10201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10201"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10203","parentNodeId":"ns=1;i=10201","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10201"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10204","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5134"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10205","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasProperty","target":"ns=1;i=10206"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10207"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5134"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10206","parentNodeId":"ns=1;i=10205","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10205"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10207","parentNodeId":"ns=1;i=10205","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10205"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10208","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasProperty","target":"ns=1;i=10209"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5134"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10209","parentNodeId":"ns=1;i=10208","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10208"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10210","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5134"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10211","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5134"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10212","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5134"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10213","parentNodeId":"ns=1;i=5134","references":[{"referenceType":"HasProperty","target":"ns=1;i=10214"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5134"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10214","parentNodeId":"ns=1;i=10213","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10213"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LeakageRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow leaking from shaft seals"}],"displayName":[{"value":"LeakageRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10215","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13353"},{"referenceType":"HasProperty","target":"ns=1;i=13354"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13353","parentNodeId":"ns=1;i=10215","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10215"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13354","parentNodeId":"ns=1;i=10215","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10215"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableAmbientTemperature","dataType":"Double","description":[{"value":"Highest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MaximumAllowableAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10216","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13359"},{"referenceType":"HasProperty","target":"ns=1;i=13360"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13359","parentNodeId":"ns=1;i=10216","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10216"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13360","parentNodeId":"ns=1;i=10216","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10216"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableCasingWorkingPressure","dataType":"Double","description":[{"value":"Greatest outlet pressure at the specified operating temperature at which the pump casing can be used"}],"displayName":[{"value":"MaximumAllowableCasingWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10217","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13365"},{"referenceType":"HasProperty","target":"ns=1;i=13366"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13365","parentNodeId":"ns=1;i=10217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10217"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13366","parentNodeId":"ns=1;i=10217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10217"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableContinuousSpeed","dataType":"Double","description":[{"value":"Highest rotational speed for continuous operation recommended by the manufacturer"}],"displayName":[{"value":"MaximumAllowableContinuousSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10218","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13371"},{"referenceType":"HasProperty","target":"ns=1;i=13372"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13371","parentNodeId":"ns=1;i=10218","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10218"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13372","parentNodeId":"ns=1;i=10218","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10218"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableHead","dataType":"Double","description":[{"value":"Maximum permissible head at which the pump can be continuously operated without suffering damage"}],"displayName":[{"value":"MaximumAllowableHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10219","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13377"},{"referenceType":"HasProperty","target":"ns=1;i=13378"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13377","parentNodeId":"ns=1;i=10219","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10219"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13378","parentNodeId":"ns=1;i=10219","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10219"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableRelativeHumidity","dataType":"Double","description":[{"value":"Highest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MaximumAllowableRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10220","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13383"},{"referenceType":"HasProperty","target":"ns=1;i=13384"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13383","parentNodeId":"ns=1;i=10220","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10220"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13384","parentNodeId":"ns=1;i=10220","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10220"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableTemperature","dataType":"Double","description":[{"value":"Highest allowable continuous fluid temperature for which the equipment (or any part to which the term refers) is suitable when handling the specified operating fluid at the specified operating pressure"}],"displayName":[{"value":"MaximumAllowableTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10221","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13389"},{"referenceType":"HasProperty","target":"ns=1;i=13390"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13389","parentNodeId":"ns=1;i=10221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13390","parentNodeId":"ns=1;i=10221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableThroughput","dataType":"Double","description":[{"value":"Maximum pV flow the pump can withstand without damage"}],"displayName":[{"value":"MaximumAllowableThroughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10222","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13395"},{"referenceType":"HasProperty","target":"ns=1;i=13396"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13395","parentNodeId":"ns=1;i=10222","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10222"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13396","parentNodeId":"ns=1;i=10222","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10222"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAllowableWorkingPressure","dataType":"Double","description":[{"value":"Pressure for a component on the basis of materials used and on the basis of calculation rules at the specified operating temperature"}],"displayName":[{"value":"MaximumAllowableWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10223","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13401"},{"referenceType":"HasProperty","target":"ns=1;i=13402"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13401","parentNodeId":"ns=1;i=10223","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10223"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13402","parentNodeId":"ns=1;i=10223","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10223"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumAxialLoad","dataType":"Double","description":[{"value":"Greatest value of the residual axial thrust on the pump rotor resulting from operating the pump at any condition within its allowable operating range."}],"displayName":[{"value":"MaximumAxialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10224","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13407"},{"referenceType":"HasProperty","target":"ns=1;i=13408"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13407","parentNodeId":"ns=1;i=10224","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10224"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13408","parentNodeId":"ns=1;i=10224","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10224"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumPumpPowerInput","dataType":"Double","description":[{"value":"Highest value of the pump power input at any rate of flow at any allowable operating condition"}],"displayName":[{"value":"MaximumPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10225","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13413"},{"referenceType":"HasProperty","target":"ns=1;i=13414"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13413","parentNodeId":"ns=1;i=10225","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10225"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13414","parentNodeId":"ns=1;i=10225","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10225"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumRadialLoad","dataType":"Double","description":[{"value":"Greatest radial load of the pump rotor resulting from operating the pump at any condition within its allowable operating range."}],"displayName":[{"value":"MaximumRadialLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10226","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13419"},{"referenceType":"HasProperty","target":"ns=1;i=13420"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13419","parentNodeId":"ns=1;i=10226","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10226"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13420","parentNodeId":"ns=1;i=10226","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10226"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MaximumStaticSealingPressure","dataType":"Double","description":[{"value":"Highest pressure, excluding hydrostatic testing, to which the seal can be subjected while the pump is shut down"}],"displayName":[{"value":"MaximumStaticSealingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10227","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13425"},{"referenceType":"HasProperty","target":"ns=1;i=13426"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13425","parentNodeId":"ns=1;i=10227","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10227"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13426","parentNodeId":"ns=1;i=10227","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10227"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MeanTimebetweenFailures","dataType":"Double","description":[{"value":"Average of the times between failures."}],"displayName":[{"value":"MeanTimebetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10228","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13431"},{"referenceType":"HasProperty","target":"ns=1;i=13432"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13431","parentNodeId":"ns=1;i=10228","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10228"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13432","parentNodeId":"ns=1;i=10228","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10228"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableAmbientTemperature","dataType":"Double","description":[{"value":"Lowest allowable ambient temperature for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MinimumAllowableAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10229","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13437"},{"referenceType":"HasProperty","target":"ns=1;i=13438"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13437","parentNodeId":"ns=1;i=10229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10229"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13438","parentNodeId":"ns=1;i=10229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10229"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableContinuousSpeed","dataType":"Double","description":[{"value":"Lowest speed for continuous operation recommended by the manufacturer"}],"displayName":[{"value":"MinimumAllowableContinuousSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10230","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13443"},{"referenceType":"HasProperty","target":"ns=1;i=13444"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13443","parentNodeId":"ns=1;i=10230","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10230"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13444","parentNodeId":"ns=1;i=10230","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10230"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableHead","dataType":"Double","description":[{"value":"Minimum permissible head at which the pump can be operated without suffering damage"}],"displayName":[{"value":"MinimumAllowableHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10231","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13449"},{"referenceType":"HasProperty","target":"ns=1;i=13450"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13449","parentNodeId":"ns=1;i=10231","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10231"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13450","parentNodeId":"ns=1;i=10231","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10231"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableRelativeHumidity","dataType":"Double","description":[{"value":"Lowest allowable relative humidity for which the equipment (or any part to which the term refers) is suitable"}],"displayName":[{"value":"MinimumAllowableRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10232","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13455"},{"referenceType":"HasProperty","target":"ns=1;i=13456"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13455","parentNodeId":"ns=1;i=10232","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10232"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13456","parentNodeId":"ns=1;i=10232","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10232"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableTemperature","dataType":"Double","description":[{"value":"Lowest allowable continuous temperature for which the equipment (or any part to which the term refers) is suitable when handling the specified operating fluid at the specified operating pressure"}],"displayName":[{"value":"MinimumAllowableTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10233","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13461"},{"referenceType":"HasProperty","target":"ns=1;i=13462"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13461","parentNodeId":"ns=1;i=10233","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10233"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13462","parentNodeId":"ns=1;i=10233","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10233"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumAllowableThermalFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without its operation being impaired by the temperature rise of the pumped liquid"}],"displayName":[{"value":"MinimumAllowableThermalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10234","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13467"},{"referenceType":"HasProperty","target":"ns=1;i=13468"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13467","parentNodeId":"ns=1;i=10234","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10234"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13468","parentNodeId":"ns=1;i=10234","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10234"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumContinuousStableFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can be operated without it adversely affecting its performance in terms of life expectancy, noise and vibrations"}],"displayName":[{"value":"MinimumContinuousStableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10235","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13473"},{"referenceType":"HasProperty","target":"ns=1;i=13474"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13473","parentNodeId":"ns=1;i=10235","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10235"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13474","parentNodeId":"ns=1;i=10235","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10235"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:MinimumContinuousThermalFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without its operation being impaired by the temperature rise of the pumped liquid"}],"displayName":[{"value":"MinimumContinuousThermalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10236","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13479"},{"referenceType":"HasProperty","target":"ns=1;i=13480"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13479","parentNodeId":"ns=1;i=10236","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13480","parentNodeId":"ns=1;i=10236","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:NetPositiveSuctionHeadRequired","dataType":"Double","description":[{"value":"Minimum NPSH at the pump inlet connection required to give the rated or operating performance at the specified conditions"}],"displayName":[{"value":"NetPositiveSuctionHeadRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10237","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13485"},{"referenceType":"HasProperty","target":"ns=1;i=13486"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13485","parentNodeId":"ns=1;i=10237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13486","parentNodeId":"ns=1;i=10237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:NetPositiveSuctionHeadRequiredForADropOf3Percent","dataType":"Double","description":[{"value":"NPSH required for a drop of 3 % in the total head of the first stage of the pump as a standard basis for use in performance curves"}],"displayName":[{"value":"NetPositiveSuctionHeadRequiredForADropOf3Percent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10238","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13491"},{"referenceType":"HasProperty","target":"ns=1;i=13492"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13491","parentNodeId":"ns=1;i=10238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13492","parentNodeId":"ns=1;i=10238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OfferedControlModes","dataType":"OfferedControlModesOptionSet","description":[{"value":"Control modes supported by the manufacturer for the product."}],"displayName":[{"value":"OfferedControlModes"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10239","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13495"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13495","parentNodeId":"ns=1;i=10239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10239"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OfferedFieldbuses","dataType":"OfferedFieldbusesOptionSet","description":[{"value":"Fieldbuses supported by the manufacturer for the product."}],"displayName":[{"value":"OfferedFieldbuses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10240","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13498"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13498","parentNodeId":"ns=1;i=10240","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10240"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OptimumHead","dataType":"Double","description":[{"value":"Total head developed by the pump at a rate of flow corresponding to the best efficiency"}],"displayName":[{"value":"OptimumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10242","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13506"},{"referenceType":"HasProperty","target":"ns=1;i=13507"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13506","parentNodeId":"ns=1;i=10242","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13507","parentNodeId":"ns=1;i=10242","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OptimumPumpPowerInput","dataType":"Double","description":[{"value":"Pump power input at the rate of flow corresponding to the best efficiency"}],"displayName":[{"value":"OptimumPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10243","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13512"},{"referenceType":"HasProperty","target":"ns=1;i=13513"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13512","parentNodeId":"ns=1;i=10243","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10243"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13513","parentNodeId":"ns=1;i=10243","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10243"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:OptimumRateOfFlow","dataType":"Double","description":[{"value":"Rate of flow at the point of best efficiency"}],"displayName":[{"value":"OptimumRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10244","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13518"},{"referenceType":"HasProperty","target":"ns=1;i=13519"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13518","parentNodeId":"ns=1;i=10244","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10244"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13519","parentNodeId":"ns=1;i=10244","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10244"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:PistonVelocity","dataType":"Double","description":[{"value":"Average speed given by the stroke length multiplied with the number of complete pumping cycles of the piston, plunger or piston attached to the diaphragm per minute (stroke per minute or pump crank speed)"}],"displayName":[{"value":"PistonVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10245","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13524"},{"referenceType":"HasProperty","target":"ns=1;i=13525"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13524","parentNodeId":"ns=1;i=10245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13525","parentNodeId":"ns=1;i=10245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"1:PossibleFluids","dataType":"String","description":[{"value":"Fluids that can be pumped by the pump."}],"displayName":[{"value":"PossibleFluids"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10246","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13528"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13528","parentNodeId":"ns=1;i=10246","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10246"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Pre_ChargePressure","dataType":"Double","description":[{"value":"Pressure to which the pulsation dampener is charged with dry gas prior to start of operation"}],"displayName":[{"value":"Pre_ChargePressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10247","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13533"},{"referenceType":"HasProperty","target":"ns=1;i=13534"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13533","parentNodeId":"ns=1;i=10247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13534","parentNodeId":"ns=1;i=10247","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:PumpClass","dataType":"PumpClassEnum","description":[{"value":"Pump type according to functional principle and pumped fluid"}],"displayName":[{"value":"PumpClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10343","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13315"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13315","parentNodeId":"ns=1;i=10343","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10343"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PumpCurve","description":[{"value":"Representation of the pump head plotted against the flow rate"}],"displayName":[{"value":"PumpCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5135","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10248"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10250"},{"referenceType":"HasProperty","target":"ns=1;i=13537"},{"referenceType":"HasComponent","target":"ns=1;i=10253"},{"referenceType":"HasProperty","target":"ns=1;i=10256"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasComponent","target":"ns=1;i=10257"},{"referenceType":"HasComponent","target":"ns=1;i=10260"},{"referenceType":"HasProperty","target":"ns=1;i=10262"},{"referenceType":"HasProperty","target":"ns=1;i=10263"},{"referenceType":"HasProperty","target":"ns=1;i=10264"},{"referenceType":"HasComponent","target":"ns=1;i=10265"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10248","parentNodeId":"ns=1;i=5135","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5135"},{"referenceType":"HasProperty","target":"ns=1;i=10249"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10249","parentNodeId":"ns=1;i=10248","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10248"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10250","parentNodeId":"ns=1;i=5135","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5135"},{"referenceType":"HasProperty","target":"ns=1;i=10251"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10252"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10251","parentNodeId":"ns=1;i=10250","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10250"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10252","parentNodeId":"ns=1;i=10250","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10250"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13537","parentNodeId":"ns=1;i=5135","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5135"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10253","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasProperty","target":"ns=1;i=10254"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5135"},{"referenceType":"HasProperty","target":"ns=1;i=10255"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10254","parentNodeId":"ns=1;i=10253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10253"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10255","parentNodeId":"ns=1;i=10253","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10253"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10256","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5135"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10257","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasProperty","target":"ns=1;i=10258"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10259"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5135"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10258","parentNodeId":"ns=1;i=10257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10257"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10259","parentNodeId":"ns=1;i=10257","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10257"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10260","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasProperty","target":"ns=1;i=10261"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5135"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10261","parentNodeId":"ns=1;i=10260","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10260"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10262","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5135"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10263","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5135"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10264","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5135"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10265","parentNodeId":"ns=1;i=5135","references":[{"referenceType":"HasProperty","target":"ns=1;i=10266"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5135"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10266","parentNodeId":"ns=1;i=10265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10265"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpEfficiencyCurve","description":[{"value":"Relationship between the pump efficiency and the rate of flow at given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpEfficiencyCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5136","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10267"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10269"},{"referenceType":"HasProperty","target":"ns=1;i=13540"},{"referenceType":"HasComponent","target":"ns=1;i=10272"},{"referenceType":"HasProperty","target":"ns=1;i=10275"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasComponent","target":"ns=1;i=10276"},{"referenceType":"HasComponent","target":"ns=1;i=10279"},{"referenceType":"HasProperty","target":"ns=1;i=10281"},{"referenceType":"HasProperty","target":"ns=1;i=10282"},{"referenceType":"HasProperty","target":"ns=1;i=10283"},{"referenceType":"HasComponent","target":"ns=1;i=10284"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10267","parentNodeId":"ns=1;i=5136","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5136"},{"referenceType":"HasProperty","target":"ns=1;i=10268"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10268","parentNodeId":"ns=1;i=10267","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10267"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10269","parentNodeId":"ns=1;i=5136","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5136"},{"referenceType":"HasProperty","target":"ns=1;i=10270"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10271"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10270","parentNodeId":"ns=1;i=10269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10269"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10271","parentNodeId":"ns=1;i=10269","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10269"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13540","parentNodeId":"ns=1;i=5136","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5136"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10272","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasProperty","target":"ns=1;i=10273"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5136"},{"referenceType":"HasProperty","target":"ns=1;i=10274"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10273","parentNodeId":"ns=1;i=10272","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10272"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10274","parentNodeId":"ns=1;i=10272","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10272"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10275","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5136"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10276","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasProperty","target":"ns=1;i=10277"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10278"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5136"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10277","parentNodeId":"ns=1;i=10276","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10276"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10278","parentNodeId":"ns=1;i=10276","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10276"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10279","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasProperty","target":"ns=1;i=10280"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5136"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10280","parentNodeId":"ns=1;i=10279","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10279"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10281","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5136"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10282","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5136"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10283","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5136"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10284","parentNodeId":"ns=1;i=5136","references":[{"referenceType":"HasProperty","target":"ns=1;i=10285"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5136"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10285","parentNodeId":"ns=1;i=10284","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10284"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpH_Q_Curve","description":[{"value":"Relationship between the total head of the pump and the rate of flow at given operating conditions /rated conditions of speed and liquid"}],"displayName":[{"value":"PumpH(Q)Curve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5137","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10286"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10288"},{"referenceType":"HasProperty","target":"ns=1;i=13543"},{"referenceType":"HasComponent","target":"ns=1;i=10291"},{"referenceType":"HasProperty","target":"ns=1;i=10294"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasComponent","target":"ns=1;i=10295"},{"referenceType":"HasComponent","target":"ns=1;i=10298"},{"referenceType":"HasProperty","target":"ns=1;i=10300"},{"referenceType":"HasProperty","target":"ns=1;i=10301"},{"referenceType":"HasProperty","target":"ns=1;i=10302"},{"referenceType":"HasComponent","target":"ns=1;i=10303"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10286","parentNodeId":"ns=1;i=5137","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5137"},{"referenceType":"HasProperty","target":"ns=1;i=10287"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10287","parentNodeId":"ns=1;i=10286","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10286"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10288","parentNodeId":"ns=1;i=5137","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5137"},{"referenceType":"HasProperty","target":"ns=1;i=10289"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10290"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10289","parentNodeId":"ns=1;i=10288","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10288"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10290","parentNodeId":"ns=1;i=10288","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10288"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13543","parentNodeId":"ns=1;i=5137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10291","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasProperty","target":"ns=1;i=10292"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5137"},{"referenceType":"HasProperty","target":"ns=1;i=10293"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10292","parentNodeId":"ns=1;i=10291","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10291"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10293","parentNodeId":"ns=1;i=10291","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10291"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10294","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5137"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10295","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasProperty","target":"ns=1;i=10296"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10297"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5137"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10296","parentNodeId":"ns=1;i=10295","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10295"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10297","parentNodeId":"ns=1;i=10295","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10295"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10298","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasProperty","target":"ns=1;i=10299"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5137"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10299","parentNodeId":"ns=1;i=10298","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10298"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10300","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5137"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10301","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5137"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10302","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5137"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10303","parentNodeId":"ns=1;i=5137","references":[{"referenceType":"HasProperty","target":"ns=1;i=10304"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5137"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10304","parentNodeId":"ns=1;i=10303","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10303"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpNpshCurve","description":[{"value":"Relationship between the net positive suction head required and the rate of flow at given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpNpshCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5138","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10305"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10307"},{"referenceType":"HasProperty","target":"ns=1;i=13546"},{"referenceType":"HasComponent","target":"ns=1;i=10310"},{"referenceType":"HasProperty","target":"ns=1;i=10313"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasComponent","target":"ns=1;i=10314"},{"referenceType":"HasComponent","target":"ns=1;i=10317"},{"referenceType":"HasProperty","target":"ns=1;i=10319"},{"referenceType":"HasProperty","target":"ns=1;i=10320"},{"referenceType":"HasProperty","target":"ns=1;i=10321"},{"referenceType":"HasComponent","target":"ns=1;i=10322"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10305","parentNodeId":"ns=1;i=5138","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5138"},{"referenceType":"HasProperty","target":"ns=1;i=10306"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10306","parentNodeId":"ns=1;i=10305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10305"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10307","parentNodeId":"ns=1;i=5138","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5138"},{"referenceType":"HasProperty","target":"ns=1;i=10308"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10309"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10308","parentNodeId":"ns=1;i=10307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10307"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10309","parentNodeId":"ns=1;i=10307","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10307"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13546","parentNodeId":"ns=1;i=5138","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5138"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10310","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasProperty","target":"ns=1;i=10311"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5138"},{"referenceType":"HasProperty","target":"ns=1;i=10312"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10311","parentNodeId":"ns=1;i=10310","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10310"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10312","parentNodeId":"ns=1;i=10310","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10310"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10313","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5138"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10314","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasProperty","target":"ns=1;i=10315"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10316"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5138"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10315","parentNodeId":"ns=1;i=10314","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10314"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10316","parentNodeId":"ns=1;i=10314","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10314"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10317","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasProperty","target":"ns=1;i=10318"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5138"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10318","parentNodeId":"ns=1;i=10317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10317"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10319","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5138"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10320","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5138"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10321","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5138"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10322","parentNodeId":"ns=1;i=5138","references":[{"referenceType":"HasProperty","target":"ns=1;i=10323"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5138"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10323","parentNodeId":"ns=1;i=10322","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10322"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PumpPowerInputCurve","description":[{"value":"Relationship between the pump power input and the rate of flow given operating conditions of speed and liquid"}],"displayName":[{"value":"PumpPowerInputCurve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5139","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10324"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10326"},{"referenceType":"HasProperty","target":"ns=1;i=13549"},{"referenceType":"HasComponent","target":"ns=1;i=10329"},{"referenceType":"HasProperty","target":"ns=1;i=10332"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasComponent","target":"ns=1;i=10333"},{"referenceType":"HasComponent","target":"ns=1;i=10336"},{"referenceType":"HasProperty","target":"ns=1;i=10338"},{"referenceType":"HasProperty","target":"ns=1;i=10339"},{"referenceType":"HasProperty","target":"ns=1;i=10340"},{"referenceType":"HasComponent","target":"ns=1;i=10341"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10324","parentNodeId":"ns=1;i=5139","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5139"},{"referenceType":"HasProperty","target":"ns=1;i=10325"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10325","parentNodeId":"ns=1;i=10324","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10324"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10326","parentNodeId":"ns=1;i=5139","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5139"},{"referenceType":"HasProperty","target":"ns=1;i=10327"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10328"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10327","parentNodeId":"ns=1;i=10326","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10326"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10328","parentNodeId":"ns=1;i=10326","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10326"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13549","parentNodeId":"ns=1;i=5139","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5139"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10329","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasProperty","target":"ns=1;i=10330"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5139"},{"referenceType":"HasProperty","target":"ns=1;i=10331"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10330","parentNodeId":"ns=1;i=10329","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10329"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10331","parentNodeId":"ns=1;i=10329","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10329"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10332","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5139"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10333","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasProperty","target":"ns=1;i=10334"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10335"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5139"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10334","parentNodeId":"ns=1;i=10333","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10333"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10335","parentNodeId":"ns=1;i=10333","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10333"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10336","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasProperty","target":"ns=1;i=10337"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5139"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10337","parentNodeId":"ns=1;i=10336","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10336"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10338","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5139"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10339","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5139"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10340","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5139"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10341","parentNodeId":"ns=1;i=5139","references":[{"referenceType":"HasProperty","target":"ns=1;i=10342"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5139"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10342","parentNodeId":"ns=1;i=10341","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10341"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:Shut_OffHead","dataType":"Double","description":[{"value":"Total head developed by the pump in a zero rate of flow"}],"displayName":[{"value":"Shut_OffHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10344","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13554"},{"referenceType":"HasProperty","target":"ns=1;i=13555"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13554","parentNodeId":"ns=1;i=10344","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10344"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13555","parentNodeId":"ns=1;i=10344","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10344"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Shut_OffPumpPowerInput","dataType":"Double","description":[{"value":"Pump power input at zero rate of flow"}],"displayName":[{"value":"Shut_OffPumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10345","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13560"},{"referenceType":"HasProperty","target":"ns=1;i=13561"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13560","parentNodeId":"ns=1;i=10345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13561","parentNodeId":"ns=1;i=10345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SlipFlow","dataType":"Double","description":[{"value":"Flow lost internally through clearances"}],"displayName":[{"value":"SlipFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10346","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13566"},{"referenceType":"HasProperty","target":"ns=1;i=13567"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13566","parentNodeId":"ns=1;i=10346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10346"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13567","parentNodeId":"ns=1;i=10346","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10346"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundEnergy","dataType":"Double","description":[{"value":"Integral of the sound power, P, over a stated time interval of duration T (starting at t1 and ending at t2)."}],"displayName":[{"value":"SoundEnergy"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10347","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13572"},{"referenceType":"HasProperty","target":"ns=1;i=13573"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13572","parentNodeId":"ns=1;i=10347","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10347"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13573","parentNodeId":"ns=1;i=10347","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10347"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundEnergyLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the sound energy, J, to a reference value, J0, expressed in decibels."}],"displayName":[{"value":"SoundEnergyLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10348","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13578"},{"referenceType":"HasProperty","target":"ns=1;i=13579"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13578","parentNodeId":"ns=1;i=10348","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10348"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13579","parentNodeId":"ns=1;i=10348","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10348"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPower","dataType":"Double","description":[{"value":"Through a surface, product of the sound pressure, p, and the component of the particle velocity, un, at a point on the surface in the direction normal to the surface, integrated over that surface."}],"displayName":[{"value":"SoundPower"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10349","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13584"},{"referenceType":"HasProperty","target":"ns=1;i=13585"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13584","parentNodeId":"ns=1;i=10349","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10349"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13585","parentNodeId":"ns=1;i=10349","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10349"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPowerLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the sound power of a source, P, to a reference value, P0, expressed in decibels."}],"displayName":[{"value":"SoundPowerLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10350","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13590"},{"referenceType":"HasProperty","target":"ns=1;i=13591"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13590","parentNodeId":"ns=1;i=10350","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10350"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13591","parentNodeId":"ns=1;i=10350","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10350"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPressure","dataType":"Double","description":[{"value":"Difference between instantaneous pressure and static pressure."}],"displayName":[{"value":"SoundPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10351","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13596"},{"referenceType":"HasProperty","target":"ns=1;i=13597"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13596","parentNodeId":"ns=1;i=10351","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10351"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13597","parentNodeId":"ns=1;i=10351","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10351"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SoundPressureLevel","dataType":"Double","description":[{"value":"Ten times the logarithm to the base 10 of the ratio of the square of the sound pressure, p, to the square of a reference value, p0, expressed in decibels."}],"displayName":[{"value":"SoundPressureLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10352","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13602"},{"referenceType":"HasProperty","target":"ns=1;i=13603"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13602","parentNodeId":"ns=1;i=10352","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10352"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13603","parentNodeId":"ns=1;i=10352","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10352"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SpecificSpeed","dataType":"Double","description":[{"value":"Speed that characterizes a pump in terms of its speed, flow rate per impeller eye, i.e. total flow for single-flow impeller, half flow for double-flow impeller, at the best efficiency point and head per stage at maximum impeller diameter"}],"displayName":[{"value":"SpecificSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10353","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13608"},{"referenceType":"HasProperty","target":"ns=1;i=13609"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13608","parentNodeId":"ns=1;i=10353","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10353"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13609","parentNodeId":"ns=1;i=10353","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10353"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:StablePumpH_Q_Curve","description":[{"value":"Pump H(Q) curve where the maximum head and shut-off head are coincidental, and the total head declines continuously as the rate of flow increases"}],"displayName":[{"value":"StablePumpH(Q)Curve"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5140","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasComponent","target":"ns=1;i=10354"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10356"},{"referenceType":"HasProperty","target":"ns=1;i=13612"},{"referenceType":"HasComponent","target":"ns=1;i=10359"},{"referenceType":"HasProperty","target":"ns=1;i=10362"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10363"},{"referenceType":"HasComponent","target":"ns=1;i=10366"},{"referenceType":"HasProperty","target":"ns=1;i=10368"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"},{"referenceType":"HasProperty","target":"ns=1;i=10369"},{"referenceType":"HasProperty","target":"ns=1;i=10370"},{"referenceType":"HasComponent","target":"ns=1;i=10371"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10354","parentNodeId":"ns=1;i=5140","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5140"},{"referenceType":"HasProperty","target":"ns=1;i=10355"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10355","parentNodeId":"ns=1;i=10354","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10354"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10356","parentNodeId":"ns=1;i=5140","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5140"},{"referenceType":"HasProperty","target":"ns=1;i=10357"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10358"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10357","parentNodeId":"ns=1;i=10356","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10356"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10358","parentNodeId":"ns=1;i=10356","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10356"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13612","parentNodeId":"ns=1;i=5140","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5140"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10359","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasProperty","target":"ns=1;i=10360"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5140"},{"referenceType":"HasProperty","target":"ns=1;i=10361"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10360","parentNodeId":"ns=1;i=10359","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10359"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10361","parentNodeId":"ns=1;i=10359","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10359"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10362","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5140"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10363","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasProperty","target":"ns=1;i=10364"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10365"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5140"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10364","parentNodeId":"ns=1;i=10363","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10363"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10365","parentNodeId":"ns=1;i=10363","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10363"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10366","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasProperty","target":"ns=1;i=10367"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5140"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10367","parentNodeId":"ns=1;i=10366","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10366"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10368","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5140"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10369","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5140"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10370","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5140"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10371","parentNodeId":"ns=1;i=5140","references":[{"referenceType":"HasProperty","target":"ns=1;i=10372"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5140"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10372","parentNodeId":"ns=1;i=10371","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10371"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:StandardGasFlowrate","dataType":"Double","description":[{"value":"Volume flow rate at standard reference conditions, i.e. 0 \u00B0C and 101 325 Pa"}],"displayName":[{"value":"StandardGasFlowrate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10373","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13617"},{"referenceType":"HasProperty","target":"ns=1;i=13618"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13617","parentNodeId":"ns=1;i=10373","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10373"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13618","parentNodeId":"ns=1;i=10373","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10373"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:StartingPressure","dataType":"Double","description":[{"value":"The starting pressure is the pressure at which a vacuum pump can be switched on and a pumping effect is achieved without damage occurring."}],"displayName":[{"value":"StartingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10374","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13623"},{"referenceType":"HasProperty","target":"ns=1;i=13624"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13623","parentNodeId":"ns=1;i=10374","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10374"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13624","parentNodeId":"ns=1;i=10374","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10374"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Suction_SpecificSpeed","dataType":"Double","description":[{"value":"Speed that characterizes a pump\u0027s cavitation performance in terms of its speed, optimum rate of flow per impeller eye at best efficiency point and NPSH3 at best efficiency point for the first stage at maximum impeller diameter"}],"displayName":[{"value":"Suction_SpecificSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10375","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13629"},{"referenceType":"HasProperty","target":"ns=1;i=13630"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13629","parentNodeId":"ns=1;i=10375","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10375"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13630","parentNodeId":"ns=1;i=10375","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10375"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:SweptVolume","dataType":"Double","description":[{"value":"Volume traversed by a single stroke of piston, plunger or diaphragm."}],"displayName":[{"value":"SweptVolume"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10376","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13635"},{"referenceType":"HasProperty","target":"ns=1;i=13636"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13635","parentNodeId":"ns=1;i=10376","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10376"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13636","parentNodeId":"ns=1;i=10376","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10376"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:TripSpeed","dataType":"Double","description":[{"value":"Speed at which the independent emergency overspeed devices operate to shut down a prime mover"}],"displayName":[{"value":"TripSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10377","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13641"},{"referenceType":"HasProperty","target":"ns=1;i=13642"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13641","parentNodeId":"ns=1;i=10377","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10377"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13642","parentNodeId":"ns=1;i=10377","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10377"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:TypeNumber","dataType":"Double","description":[{"value":"Pure number calculated at the point of best efficiency"}],"displayName":[{"value":"TypeNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10378","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13645"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13645","parentNodeId":"ns=1;i=10378","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10378"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:VolumeFlowRate","dataType":"Double","description":[{"value":"Volume flow rate of the gas removed by the pump from the gas phase within the evacuated chamber."}],"displayName":[{"value":"VolumeFlowRate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10379","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13650"},{"referenceType":"HasProperty","target":"ns=1;i=13651"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13650","parentNodeId":"ns=1;i=10379","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10379"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13651","parentNodeId":"ns=1;i=10379","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10379"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:VolumeFlowRateOfBackingPump","dataType":"Double","description":[{"value":"Maximum volume flow rate for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump"}],"displayName":[{"value":"VolumeFlowRateOfBackingPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10380","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13656"},{"referenceType":"HasProperty","target":"ns=1;i=13657"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13656","parentNodeId":"ns=1;i=10380","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10380"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13657","parentNodeId":"ns=1;i=10380","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10380"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WarmUpTimeForAVaporJetPumpOrADiffusionPump","dataType":"Double","description":[{"value":"The warm-up time is the time required to heat the blowing agent in the boiling vessel to its working temperature. The initial temperature can either be equal to the ambient temperature or equal to the temperature at which the blowing agent of the vacuum pump can be exposed to atmospheric air without risk."}],"displayName":[{"value":"WarmUpTimeForAVaporJetPumpOrADiffusionPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10381","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13662"},{"referenceType":"HasProperty","target":"ns=1;i=13663"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13662","parentNodeId":"ns=1;i=10381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13663","parentNodeId":"ns=1;i=10381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5457219\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esecond [unit of time]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WaterVaporTolerableLoad","dataType":"Double","description":[{"value":"The mass flow rate for water vapor, in a gas ballast pump, in continuous operation and under normal ambient conditions, if the pumped gas is pure water vapor."}],"displayName":[{"value":"WaterVaporTolerableLoad"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10382","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13668"},{"referenceType":"HasProperty","target":"ns=1;i=13669"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13668","parentNodeId":"ns=1;i=10382","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10382"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13669","parentNodeId":"ns=1;i=10382","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10382"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:WetCriticalSpeed","dataType":"Double","description":[{"value":"Rotor resonant frequency calculated considering the additional support and damping produced by the action of the pumped fluid within rotor"}],"displayName":[{"value":"WetCriticalSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10383","parentNodeId":"ns=1;i=5131","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13674"},{"referenceType":"HasProperty","target":"ns=1;i=13675"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5131"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13674","parentNodeId":"ns=1;i=10383","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10383"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13675","parentNodeId":"ns=1;i=10383","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10383"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"1:Implementation","description":[{"value":"Static implementation properties for a pump."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5132","parentNodeId":"ns=1;i=5118","references":[{"referenceType":"HasComponent","target":"ns=1;i=10384"},{"referenceType":"HasComponent","target":"ns=1;i=10385"},{"referenceType":"HasComponent","target":"ns=1;i=10386"},{"referenceType":"HasComponent","target":"ns=1;i=10387"},{"referenceType":"HasComponent","target":"ns=1;i=10388"},{"referenceType":"HasComponent","target":"ns=1;i=10389"},{"referenceType":"HasComponent","target":"ns=1;i=10390"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5118"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1023"},{"referenceType":"HasComponent","target":"ns=1;i=10391"},{"referenceType":"HasComponent","target":"ns=1;i=10392"},{"referenceType":"HasComponent","target":"ns=1;i=10393"},{"referenceType":"HasComponent","target":"ns=1;i=10394"},{"referenceType":"HasComponent","target":"ns=1;i=10397"},{"referenceType":"HasComponent","target":"ns=1;i=10398"},{"referenceType":"HasComponent","target":"ns=1;i=10399"},{"referenceType":"HasComponent","target":"ns=1;i=10400"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10401"},{"referenceType":"HasComponent","target":"ns=1;i=10402"},{"referenceType":"HasComponent","target":"ns=1;i=10403"},{"referenceType":"HasComponent","target":"ns=1;i=10404"},{"referenceType":"HasComponent","target":"ns=1;i=10405"},{"referenceType":"HasComponent","target":"ns=1;i=10406"},{"referenceType":"HasComponent","target":"ns=1;i=10407"},{"referenceType":"HasComponent","target":"ns=1;i=10408"},{"referenceType":"HasComponent","target":"ns=1;i=10395"},{"referenceType":"HasComponent","target":"ns=1;i=10396"},{"referenceType":"HasComponent","target":"ns=1;i=10409"},{"referenceType":"HasComponent","target":"ns=1;i=10410"},{"referenceType":"HasComponent","target":"ns=1;i=10411"},{"referenceType":"HasComponent","target":"ns=1;i=10412"},{"referenceType":"HasComponent","target":"ns=1;i=10413"},{"referenceType":"HasComponent","target":"ns=1;i=10414"},{"referenceType":"HasComponent","target":"ns=1;i=10415"},{"referenceType":"HasComponent","target":"ns=1;i=10416"}],"typeDefinition":"ns=1;i=1023"},{"accessLevel":3,"browseName":"1:AtmosphericPressure","dataType":"Double","description":[{"value":"Mean absolute pressure of the atmosphere measured at the place of installation (2.1.1.3) of the pump"}],"displayName":[{"value":"AtmosphericPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10384","parentNodeId":"ns=1;i=5132","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14010"},{"referenceType":"HasProperty","target":"ns=1;i=14011"},{"referenceType":"HasProperty","target":"ns=1;i=14012"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14010","parentNodeId":"ns=1;i=10384","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10384"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14011","parentNodeId":"ns=1;i=10384","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10384"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14012","parentNodeId":"ns=1;i=10384","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10384"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Density","dataType":"Double","description":[{"value":"Volumetric mass at a stated temperature"}],"displayName":[{"value":"Density"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10385","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14013"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasProperty","target":"ns=1;i=14014"},{"referenceType":"HasProperty","target":"ns=1;i=14015"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14013","parentNodeId":"ns=1;i=10385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14014","parentNodeId":"ns=1;i=10385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4934993\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/m\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per cubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14015","parentNodeId":"ns=1;i=10385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DynamicViscosity","dataType":"Double","description":[{"value":"Ratio of the shear stress to the shear velocity acting in a liquid subjected to a plane shear motion"}],"displayName":[{"value":"DynamicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10386","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14016"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasProperty","target":"ns=1;i=14017"},{"referenceType":"HasProperty","target":"ns=1;i=14018"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14016","parentNodeId":"ns=1;i=10386","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10386"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14017","parentNodeId":"ns=1;i=10386","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10386"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4404789\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14018","parentNodeId":"ns=1;i=10386","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10386"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheInletManometer","dataType":"Double","description":[{"value":"Height of the zero or center position of the inlet manometer, or other point as defined by the manometer calibration"}],"displayName":[{"value":"HeightOfTheInletManometer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10387","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14019"},{"referenceType":"HasProperty","target":"ns=1;i=14020"},{"referenceType":"HasProperty","target":"ns=1;i=14021"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14019","parentNodeId":"ns=1;i=10387","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10387"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14020","parentNodeId":"ns=1;i=10387","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10387"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14021","parentNodeId":"ns=1;i=10387","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10387"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheNpshDatumPlane","dataType":"Double","description":[{"value":"Difference between the NPSH datum plane and the reference plane"}],"displayName":[{"value":"HeightOfTheNpshDatumPlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10388","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14022"},{"referenceType":"HasProperty","target":"ns=1;i=14023"},{"referenceType":"HasProperty","target":"ns=1;i=14024"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14022","parentNodeId":"ns=1;i=10388","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10388"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14023","parentNodeId":"ns=1;i=10388","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10388"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14024","parentNodeId":"ns=1;i=10388","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10388"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletManometer","dataType":"Double","description":[{"value":"Height of the zero or center position of the outlet manometer, or other point as defined by the manometer calibration"}],"displayName":[{"value":"HeightOfTheOutletManometer"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10389","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14025"},{"referenceType":"HasProperty","target":"ns=1;i=14026"},{"referenceType":"HasProperty","target":"ns=1;i=14027"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14025","parentNodeId":"ns=1;i=10389","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10389"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14026","parentNodeId":"ns=1;i=10389","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10389"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14027","parentNodeId":"ns=1;i=10389","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10389"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HydraulicEfficiency","dataType":"Double","description":[{"value":"Proportion of pump available power input, Pa, which is delivered as pump power output, Pu, after satisfying the losses resulting from friction due to the relative motion of internal surfaces and internal leakage"}],"displayName":[{"value":"HydraulicEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10390","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14028"},{"referenceType":"HasProperty","target":"ns=1;i=14029"},{"referenceType":"HasProperty","target":"ns=1;i=14030"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14028","parentNodeId":"ns=1;i=10390","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10390"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14029","parentNodeId":"ns=1;i=10390","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10390"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14030","parentNodeId":"ns=1;i=10390","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10390"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:InstallationTotalHead","dataType":"Double","description":[{"value":"Difference between the total head at the outlet side of the installation and the total head at the inlet side of the installation"}],"displayName":[{"value":"InstallationTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10391","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14031"},{"referenceType":"HasProperty","target":"ns=1;i=14032"},{"referenceType":"HasProperty","target":"ns=1;i=14033"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14031","parentNodeId":"ns=1;i=10391","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10391"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14032","parentNodeId":"ns=1;i=10391","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10391"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14033","parentNodeId":"ns=1;i=10391","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10391"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:KinematicViscosity","dataType":"Double","description":[{"value":"Ratio of the dynamic viscosity to the density of the pumped liquid"}],"displayName":[{"value":"KinematicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10392","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14034"},{"referenceType":"HasProperty","target":"ns=1;i=14035"},{"referenceType":"HasProperty","target":"ns=1;i=14036"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14034","parentNodeId":"ns=1;i=10392","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10392"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14035","parentNodeId":"ns=1;i=10392","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10392"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E21300\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14036","parentNodeId":"ns=1;i=10392","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10392"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumAllowableFlow","dataType":"Double","description":[{"value":"Greatest rate of flow that the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied"}],"displayName":[{"value":"MaximumAllowableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10393","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14037"},{"referenceType":"HasProperty","target":"ns=1;i=14038"},{"referenceType":"HasProperty","target":"ns=1;i=14039"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14037","parentNodeId":"ns=1;i=10393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14038","parentNodeId":"ns=1;i=10393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14039","parentNodeId":"ns=1;i=10393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumDynamicSealingPressure","dataType":"Double","description":[{"value":"Highest pressure expected at the shaft seals during any specified operating condition and during startup and shutdown"}],"displayName":[{"value":"MaximumDynamicSealingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10394","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14040"},{"referenceType":"HasProperty","target":"ns=1;i=14041"},{"referenceType":"HasProperty","target":"ns=1;i=14042"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14040","parentNodeId":"ns=1;i=10394","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14041","parentNodeId":"ns=1;i=10394","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14042","parentNodeId":"ns=1;i=10394","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10394"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MechanicalEfficiency","dataType":"Double","description":[{"value":"Proportion of the pump power input, P, available after satisfying the mechanical power losses, PJ,ab, at given operating conditions"}],"displayName":[{"value":"MechanicalEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10397","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14049"},{"referenceType":"HasProperty","target":"ns=1;i=14050"},{"referenceType":"HasProperty","target":"ns=1;i=14051"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14049","parentNodeId":"ns=1;i=10397","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10397"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14050","parentNodeId":"ns=1;i=10397","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10397"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14051","parentNodeId":"ns=1;i=10397","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10397"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAllowableFlow","dataType":"Double","description":[{"value":"Smallest rate of flow that the pump can be expected to deliver continuously without risk of internal damage when operated at the rated speed and on the liquid for which it was supplied"}],"displayName":[{"value":"MinimumAllowableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10398","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14052"},{"referenceType":"HasProperty","target":"ns=1;i=14053"},{"referenceType":"HasProperty","target":"ns=1;i=14054"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14052","parentNodeId":"ns=1;i=10398","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10398"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14053","parentNodeId":"ns=1;i=10398","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10398"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14054","parentNodeId":"ns=1;i=10398","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10398"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAllowableStableFlow","dataType":"Double","description":[{"value":"Lowest flow at which the pump can operate without exceeding the noise and vibration limits imposed in the order"}],"displayName":[{"value":"MinimumAllowableStableFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10399","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14055"},{"referenceType":"HasProperty","target":"ns=1;i=14056"},{"referenceType":"HasProperty","target":"ns=1;i=14057"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14055","parentNodeId":"ns=1;i=10399","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10399"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14056","parentNodeId":"ns=1;i=10399","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10399"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14057","parentNodeId":"ns=1;i=10399","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10399"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NetPositiveSuctionHeadAvailable","dataType":"Double","description":[{"value":"Minimum NPSH available at the inlet area of the pump as determined by the conditions of the installation for a specified rate of flow"}],"displayName":[{"value":"NetPositiveSuctionHeadAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10400","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14058"},{"referenceType":"HasProperty","target":"ns=1;i=14059"},{"referenceType":"HasProperty","target":"ns=1;i=14060"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14058","parentNodeId":"ns=1;i=10400","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10400"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14059","parentNodeId":"ns=1;i=10400","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10400"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14060","parentNodeId":"ns=1;i=10400","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10400"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OverallEfficiency","dataType":"Double","description":[{"value":"Proportion of the driver power input, Pmot, delivered as pump power output, Pu"}],"displayName":[{"value":"OverallEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10401","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14061"},{"referenceType":"HasProperty","target":"ns=1;i=14062"},{"referenceType":"HasProperty","target":"ns=1;i=14063"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14061","parentNodeId":"ns=1;i=10401","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10401"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14062","parentNodeId":"ns=1;i=10401","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10401"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14063","parentNodeId":"ns=1;i=10401","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10401"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpBestEfficiency","dataType":"Double","description":[{"value":"Greatest value of pump efficiency obtained at given operating conditions"}],"displayName":[{"value":"PumpBestEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10402","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14064"},{"referenceType":"HasProperty","target":"ns=1;i=14065"},{"referenceType":"HasProperty","target":"ns=1;i=14066"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14064","parentNodeId":"ns=1;i=10402","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10402"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14065","parentNodeId":"ns=1;i=10402","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10402"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14066","parentNodeId":"ns=1;i=10402","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10402"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpEfficiency","dataType":"Double","description":[{"value":"Proportion of the pump power input, P, delivered as pump power output, Pu, at given operating conditions"}],"displayName":[{"value":"PumpEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10403","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14067"},{"referenceType":"HasProperty","target":"ns=1;i=14068"},{"referenceType":"HasProperty","target":"ns=1;i=14069"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14067","parentNodeId":"ns=1;i=10403","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10403"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14068","parentNodeId":"ns=1;i=10403","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10403"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14069","parentNodeId":"ns=1;i=10403","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10403"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpMechanicalPowerLosses","dataType":"Double","description":[{"value":"Power absorbed by friction in bearings and shaft seal at given operating conditions of the pump"}],"displayName":[{"value":"PumpMechanicalPowerLosses"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10404","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14070"},{"referenceType":"HasProperty","target":"ns=1;i=14071"},{"referenceType":"HasProperty","target":"ns=1;i=14072"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14070","parentNodeId":"ns=1;i=10404","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10404"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14071","parentNodeId":"ns=1;i=10404","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10404"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14072","parentNodeId":"ns=1;i=10404","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10404"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpRatedPowerInput","dataType":"Double","description":[{"value":"Power required by the pump at the rated conditions"}],"displayName":[{"value":"PumpRatedPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10405","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14073"},{"referenceType":"HasProperty","target":"ns=1;i=14074"},{"referenceType":"HasProperty","target":"ns=1;i=14075"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14073","parentNodeId":"ns=1;i=10405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14074","parentNodeId":"ns=1;i=10405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14075","parentNodeId":"ns=1;i=10405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpTotalHead","dataType":"Double","description":[{"value":"Difference between the total head at the outlet side of the pump and the total head at the inlet side of the pump"}],"displayName":[{"value":"PumpTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10406","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14076"},{"referenceType":"HasProperty","target":"ns=1;i=14077"},{"referenceType":"HasProperty","target":"ns=1;i=14078"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14076","parentNodeId":"ns=1;i=10406","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10406"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14077","parentNodeId":"ns=1;i=10406","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10406"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14078","parentNodeId":"ns=1;i=10406","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10406"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedDifferentialPressure","dataType":"Double","description":[{"value":"Differential pressure for the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedDifferentialPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10407","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14079"},{"referenceType":"HasProperty","target":"ns=1;i=14080"},{"referenceType":"HasProperty","target":"ns=1;i=14081"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14079","parentNodeId":"ns=1;i=10407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14080","parentNodeId":"ns=1;i=10407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14081","parentNodeId":"ns=1;i=10407","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10407"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedFlow","dataType":"Double","description":[{"value":"Rate of flow at the guarantee point"}],"displayName":[{"value":"RatedFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10408","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14082"},{"referenceType":"HasProperty","target":"ns=1;i=14083"},{"referenceType":"HasProperty","target":"ns=1;i=14084"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14082","parentNodeId":"ns=1;i=10408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14083","parentNodeId":"ns=1;i=10408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14084","parentNodeId":"ns=1;i=10408","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10408"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedMeanVelocityAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Rated flow at the inlet area of the installation divided by the inlet area of the installation"}],"displayName":[{"value":"RatedMeanVelocityAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10395","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14043"},{"referenceType":"HasProperty","target":"ns=1;i=14044"},{"referenceType":"HasProperty","target":"ns=1;i=14045"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14043","parentNodeId":"ns=1;i=10395","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10395"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14044","parentNodeId":"ns=1;i=10395","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10395"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14045","parentNodeId":"ns=1;i=10395","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10395"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedMeanVelocityAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Rated flow at the outlet area of the installation divided by the inlet area of the installation"}],"displayName":[{"value":"RatedMeanVelocityAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10396","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14046"},{"referenceType":"HasProperty","target":"ns=1;i=14047"},{"referenceType":"HasProperty","target":"ns=1;i=14048"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14046","parentNodeId":"ns=1;i=10396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10396"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14047","parentNodeId":"ns=1;i=10396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10396"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14048","parentNodeId":"ns=1;i=10396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10396"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Number of revolutions of the pump in a given time required to meet the rated conditions"}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10409","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14085"},{"referenceType":"HasProperty","target":"ns=1;i=14086"},{"referenceType":"HasProperty","target":"ns=1;i=14087"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14085","parentNodeId":"ns=1;i=10409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14086","parentNodeId":"ns=1;i=10409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14087","parentNodeId":"ns=1;i=10409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Head observed at inlet area of the installation, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10410","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14088"},{"referenceType":"HasProperty","target":"ns=1;i=14089"},{"referenceType":"HasProperty","target":"ns=1;i=14090"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14088","parentNodeId":"ns=1;i=10410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14089","parentNodeId":"ns=1;i=10410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14090","parentNodeId":"ns=1;i=10410","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Head observed at outlet area of the installation, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10411","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14091"},{"referenceType":"HasProperty","target":"ns=1;i=14092"},{"referenceType":"HasProperty","target":"ns=1;i=14093"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14091","parentNodeId":"ns=1;i=10411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14092","parentNodeId":"ns=1;i=10411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14093","parentNodeId":"ns=1;i=10411","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10411"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:UsefulLife","dataType":"Double","description":[{"value":"Time interval from first use until the instant when a limiting state is reached"}],"displayName":[{"value":"UsefulLife"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10412","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14094"},{"referenceType":"HasProperty","target":"ns=1;i=14095"},{"referenceType":"HasProperty","target":"ns=1;i=14096"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14094","parentNodeId":"ns=1;i=10412","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10412"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14095","parentNodeId":"ns=1;i=10412","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10412"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14096","parentNodeId":"ns=1;i=10412","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10412"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ValveSeatVelocity","dataType":"Double","description":[{"value":"Mean velocity of the flow through the valve seat at the specified operating conditions"}],"displayName":[{"value":"ValveSeatVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10413","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14097"},{"referenceType":"HasProperty","target":"ns=1;i=14098"},{"referenceType":"HasProperty","target":"ns=1;i=14099"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14097","parentNodeId":"ns=1;i=10413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14098","parentNodeId":"ns=1;i=10413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14099","parentNodeId":"ns=1;i=10413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ValveSpillVelocity","dataType":"Double","description":[{"value":"Mean velocity of the flow through the valve spill area"}],"displayName":[{"value":"ValveSpillVelocity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10414","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14100"},{"referenceType":"HasProperty","target":"ns=1;i=14101"},{"referenceType":"HasProperty","target":"ns=1;i=14102"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14100","parentNodeId":"ns=1;i=10414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14101","parentNodeId":"ns=1;i=10414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14102","parentNodeId":"ns=1;i=10414","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10414"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:VaporPressureOfThePumpedLiquid","dataType":"Double","description":[{"value":"Absolute pressure at which the fluid vaporizes corresponding to the temperature of the liquid"}],"displayName":[{"value":"VaporPressureOfThePumpedLiquid"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10415","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14103"},{"referenceType":"HasProperty","target":"ns=1;i=14104"},{"referenceType":"HasProperty","target":"ns=1;i=14105"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14103","parentNodeId":"ns=1;i=10415","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14104","parentNodeId":"ns=1;i=10415","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14105","parentNodeId":"ns=1;i=10415","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:VolumetricEfficiency","dataType":"Double","description":[{"value":"Ratio of the actual delivered volume at maximum pressure to the geometric displacement volume"}],"displayName":[{"value":"VolumetricEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10416","parentNodeId":"ns=1;i=5132","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14106"},{"referenceType":"HasProperty","target":"ns=1;i=14107"},{"referenceType":"HasProperty","target":"ns=1;i=14108"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5132"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14106","parentNodeId":"ns=1;i=10416","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10416"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14107","parentNodeId":"ns=1;i=10416","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10416"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14108","parentNodeId":"ns=1;i=10416","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10416"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SystemRequirements","description":[{"value":"Static system requirement properties for a pump."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5133","parentNodeId":"ns=1;i=5118","references":[{"referenceType":"HasComponent","target":"ns=1;i=10417"},{"referenceType":"HasComponent","target":"ns=1;i=10418"},{"referenceType":"HasComponent","target":"ns=1;i=10419"},{"referenceType":"HasComponent","target":"ns=1;i=10420"},{"referenceType":"HasComponent","target":"ns=1;i=10421"},{"referenceType":"HasComponent","target":"ns=1;i=10422"},{"referenceType":"HasComponent","target":"ns=1;i=10423"},{"referenceType":"HasComponent","target":"ns=1;i=10424"},{"referenceType":"HasComponent","target":"ns=1;i=10425"},{"referenceType":"HasComponent","target":"ns=1;i=10426"},{"referenceType":"HasComponent","target":"ns=1;i=10427"},{"referenceType":"HasComponent","target":"ns=1;i=10428"},{"referenceType":"HasComponent","target":"ns=1;i=10429"},{"referenceType":"HasComponent","target":"ns=1;i=10430"},{"referenceType":"HasComponent","target":"ns=1;i=10431"},{"referenceType":"HasComponent","target":"ns=1;i=10432"},{"referenceType":"HasComponent","target":"ns=1;i=10433"},{"referenceType":"HasComponent","target":"ns=1;i=10434"},{"referenceType":"HasComponent","target":"ns=1;i=10435"},{"referenceType":"HasComponent","target":"ns=1;i=10436"},{"referenceType":"HasComponent","target":"ns=1;i=10437"},{"referenceType":"HasComponent","target":"ns=1;i=10438"},{"referenceType":"HasComponent","target":"ns=1;i=10439"},{"referenceType":"HasComponent","target":"ns=1;i=10440"},{"referenceType":"HasComponent","target":"ns=1;i=10443"},{"referenceType":"HasComponent","target":"ns=1;i=10444"},{"referenceType":"HasComponent","target":"ns=1;i=10445"},{"referenceType":"HasComponent","target":"ns=1;i=10446"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10447"},{"referenceType":"HasComponent","target":"ns=1;i=10448"},{"referenceType":"HasComponent","target":"ns=1;i=10449"},{"referenceType":"HasComponent","target":"ns=1;i=10450"},{"referenceType":"HasComponent","target":"ns=1;i=10451"},{"referenceType":"HasComponent","target":"ns=1;i=10452"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5118"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1022"},{"referenceType":"HasComponent","target":"ns=1;i=10453"},{"referenceType":"HasComponent","target":"ns=1;i=10454"},{"referenceType":"HasComponent","target":"ns=1;i=10455"}],"typeDefinition":"ns=1;i=1022"},{"accessLevel":3,"browseName":"1:CompressionRatio","dataType":"Double","description":[{"value":"Ratio of the backing pressure, p3, to the inlet pressure, p1, of the vacuum pump without throughput"}],"displayName":[{"value":"CompressionRatio"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10417","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasProperty","target":"ns=1;i=13680"},{"referenceType":"HasProperty","target":"ns=1;i=13681"},{"referenceType":"HasProperty","target":"ns=1;i=13682"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13680","parentNodeId":"ns=1;i=10417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13681","parentNodeId":"ns=1;i=10417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13682","parentNodeId":"ns=1;i=10417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExplosionZone","dataType":"ExplosionZoneOptionSet","description":[{"value":"Categories of explosion zones for devices according to 2014/34/EU (ATEX)."}],"displayName":[{"value":"ExplosionZone"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10418","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13683"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13683","parentNodeId":"ns=1;i=10418","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10418"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Fieldbus","dataType":"FieldbusEnum","description":[{"value":"Selected fieldbus for the product"}],"displayName":[{"value":"Fieldbus"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10419","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13684"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13684","parentNodeId":"ns=1;i=10419","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10419"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Fluid","dataType":"String","description":[{"value":"Fluid that is handled by the pump at specified operating conditions"}],"displayName":[{"value":"Fluid"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10420","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13685"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13685","parentNodeId":"ns=1;i=10420","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10420"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:GasContent","dataType":"Double","description":[{"value":"Proportion of gaseous substance in the liquid to be pumped, either as a contaminant or as vapor from the main body of liquid"}],"displayName":[{"value":"GasContent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10421","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13686"},{"referenceType":"HasProperty","target":"ns=1;i=13687"},{"referenceType":"HasProperty","target":"ns=1;i=13688"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13686","parentNodeId":"ns=1;i=10421","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10421"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13687","parentNodeId":"ns=1;i=10421","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10421"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13688","parentNodeId":"ns=1;i=10421","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10421"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheInletSideOfTheInstallation","dataType":"Double","description":[{"value":"Height of the fluid level on the inlet side of the installation, or in the center of the inlet manifold"}],"displayName":[{"value":"HeightOfTheInletSideOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10422","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13689"},{"referenceType":"HasProperty","target":"ns=1;i=13690"},{"referenceType":"HasProperty","target":"ns=1;i=13691"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13689","parentNodeId":"ns=1;i=10422","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10422"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13690","parentNodeId":"ns=1;i=10422","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10422"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13691","parentNodeId":"ns=1;i=10422","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10422"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletSideOfTheInstallation","dataType":"Double","description":[{"value":"Height of the fluid level on the outlet side of the installation or in the center of the outlet manifold"}],"displayName":[{"value":"HeightOfTheOutletSideOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10423","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13692"},{"referenceType":"HasProperty","target":"ns=1;i=13693"},{"referenceType":"HasProperty","target":"ns=1;i=13694"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13692","parentNodeId":"ns=1;i=10423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13693","parentNodeId":"ns=1;i=10423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13694","parentNodeId":"ns=1;i=10423","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10423"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:HeightOfThePump","dataType":"Double","description":[{"value":"Height of the center of the pump"}],"displayName":[{"value":"HeightOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10424","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13695"},{"referenceType":"HasProperty","target":"ns=1;i=13696"},{"referenceType":"HasProperty","target":"ns=1;i=13697"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13695","parentNodeId":"ns=1;i=10424","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10424"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13696","parentNodeId":"ns=1;i=10424","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10424"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13697","parentNodeId":"ns=1;i=10424","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10424"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumAmbientTemperature","dataType":"Double","description":[{"value":"Highest ambient temperature to be expected under normal circumstances"}],"displayName":[{"value":"MaximumAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10425","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13698"},{"referenceType":"HasProperty","target":"ns=1;i=13699"},{"referenceType":"HasProperty","target":"ns=1;i=13700"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13698","parentNodeId":"ns=1;i=10425","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10425"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13699","parentNodeId":"ns=1;i=10425","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10425"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13700","parentNodeId":"ns=1;i=10425","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10425"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumFlow","dataType":"Double","description":[{"value":"Greatest rate of flow which is expected at operating conditions"}],"displayName":[{"value":"MaximumFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10426","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13701"},{"referenceType":"HasProperty","target":"ns=1;i=13702"},{"referenceType":"HasProperty","target":"ns=1;i=13703"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13701","parentNodeId":"ns=1;i=10426","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10426"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13702","parentNodeId":"ns=1;i=10426","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10426"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13703","parentNodeId":"ns=1;i=10426","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10426"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumHead","dataType":"Double","description":[{"value":"Highest total head developed by a pump at any rate of flow"}],"displayName":[{"value":"MaximumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10427","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13704"},{"referenceType":"HasProperty","target":"ns=1;i=13705"},{"referenceType":"HasProperty","target":"ns=1;i=13706"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13704","parentNodeId":"ns=1;i=10427","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10427"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13705","parentNodeId":"ns=1;i=10427","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10427"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13706","parentNodeId":"ns=1;i=10427","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10427"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumInletPressure","dataType":"Double","description":[{"value":"Highest inlet pressure to which the pump is subjected during operation"}],"displayName":[{"value":"MaximumInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10428","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13707"},{"referenceType":"HasProperty","target":"ns=1;i=13708"},{"referenceType":"HasProperty","target":"ns=1;i=13709"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13707","parentNodeId":"ns=1;i=10428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13708","parentNodeId":"ns=1;i=10428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13709","parentNodeId":"ns=1;i=10428","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumOutletPressure","dataType":"Double","description":[{"value":"Maximum possible pressure at outlet, due either to internal energy increase (rotodynamic pumps) or external downstream restrictions (volumetric pumps)"}],"displayName":[{"value":"MaximumOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10429","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13710"},{"referenceType":"HasProperty","target":"ns=1;i=13711"},{"referenceType":"HasProperty","target":"ns=1;i=13712"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13710","parentNodeId":"ns=1;i=10429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13711","parentNodeId":"ns=1;i=10429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13712","parentNodeId":"ns=1;i=10429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumRelativeHumidity","dataType":"Double","description":[{"value":"Highest relative humidity that can be expected under normal circumstances."}],"displayName":[{"value":"MaximumRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10430","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13713"},{"referenceType":"HasProperty","target":"ns=1;i=13714"},{"referenceType":"HasProperty","target":"ns=1;i=13715"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13713","parentNodeId":"ns=1;i=10430","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10430"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13714","parentNodeId":"ns=1;i=10430","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10430"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13715","parentNodeId":"ns=1;i=10430","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10430"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumTemperature","dataType":"Double","description":[{"value":"Highest fluid temperature to be expected under operating conditions"}],"displayName":[{"value":"MaximumTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10431","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13716"},{"referenceType":"HasProperty","target":"ns=1;i=13717"},{"referenceType":"HasProperty","target":"ns=1;i=13718"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13716","parentNodeId":"ns=1;i=10431","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10431"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13717","parentNodeId":"ns=1;i=10431","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10431"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13718","parentNodeId":"ns=1;i=10431","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10431"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanTimeBetweenFailures","dataType":"Double","description":[{"value":"Average of the times between failures"}],"displayName":[{"value":"MeanTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10432","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13719"},{"referenceType":"HasProperty","target":"ns=1;i=13720"},{"referenceType":"HasProperty","target":"ns=1;i=13721"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13719","parentNodeId":"ns=1;i=10432","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10432"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13720","parentNodeId":"ns=1;i=10432","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10432"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13721","parentNodeId":"ns=1;i=10432","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10432"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumAmbientTemperature","dataType":"Double","description":[{"value":"Lowest ambient temperature to be expected under normal circumstances"}],"displayName":[{"value":"MinimumAmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10433","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13722"},{"referenceType":"HasProperty","target":"ns=1;i=13723"},{"referenceType":"HasProperty","target":"ns=1;i=13724"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13722","parentNodeId":"ns=1;i=10433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13723","parentNodeId":"ns=1;i=10433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13724","parentNodeId":"ns=1;i=10433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumFlow","dataType":"Double","description":[{"value":"Smallest rate of flow which is expected at operating conditions"}],"displayName":[{"value":"MinimumFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10434","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13725"},{"referenceType":"HasProperty","target":"ns=1;i=13726"},{"referenceType":"HasProperty","target":"ns=1;i=13727"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13725","parentNodeId":"ns=1;i=10434","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10434"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13726","parentNodeId":"ns=1;i=10434","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10434"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13727","parentNodeId":"ns=1;i=10434","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10434"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumHead","dataType":"Double","description":[{"value":"Smallest total head developed by a pump at any rate of flow"}],"displayName":[{"value":"MinimumHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10435","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13728"},{"referenceType":"HasProperty","target":"ns=1;i=13729"},{"referenceType":"HasProperty","target":"ns=1;i=13730"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13728","parentNodeId":"ns=1;i=10435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13729","parentNodeId":"ns=1;i=10435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13730","parentNodeId":"ns=1;i=10435","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10435"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumInletPressure","dataType":"Double","description":[{"value":"Lowest inlet pressure that can occur during operation for the pump"}],"displayName":[{"value":"MinimumInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10436","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13731"},{"referenceType":"HasProperty","target":"ns=1;i=13732"},{"referenceType":"HasProperty","target":"ns=1;i=13733"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13731","parentNodeId":"ns=1;i=10436","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10436"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13732","parentNodeId":"ns=1;i=10436","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10436"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13733","parentNodeId":"ns=1;i=10436","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10436"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumOutletPressure","dataType":"Double","description":[{"value":"Lowest outlet pressure that can occur during operation for the pump"}],"displayName":[{"value":"MinimumOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10437","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13734"},{"referenceType":"HasProperty","target":"ns=1;i=13735"},{"referenceType":"HasProperty","target":"ns=1;i=13736"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13734","parentNodeId":"ns=1;i=10437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10437"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13735","parentNodeId":"ns=1;i=10437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10437"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13736","parentNodeId":"ns=1;i=10437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10437"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumRelativeHumidity","dataType":"Double","description":[{"value":"Lowest relative humidity to be expected under normal circumstances."}],"displayName":[{"value":"MinimumRelativeHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10438","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13737"},{"referenceType":"HasProperty","target":"ns=1;i=13738"},{"referenceType":"HasProperty","target":"ns=1;i=13739"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13737","parentNodeId":"ns=1;i=10438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10438"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13738","parentNodeId":"ns=1;i=10438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10438"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13739","parentNodeId":"ns=1;i=10438","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10438"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MinimumTemperature","dataType":"Double","description":[{"value":"Lowest fluid temperature to be expected under operating conditions"}],"displayName":[{"value":"MinimumTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10439","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13740"},{"referenceType":"HasProperty","target":"ns=1;i=13741"},{"referenceType":"HasProperty","target":"ns=1;i=13742"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13740","parentNodeId":"ns=1;i=10439","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10439"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13741","parentNodeId":"ns=1;i=10439","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10439"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13742","parentNodeId":"ns=1;i=10439","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10439"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Multi_Phase","dataType":"Boolean","description":[{"value":"Comprising a fluid together with substances in solid or gaseous states, whether due to deliberate addition or a change of state caused by a change in conditions. A \u0022True\u0022 status means that there is a possibility of multi-phase-fluid and a \u0022False\u0022 status means that there is no possibility of multi-phase-fluid."}],"displayName":[{"value":"Multi_Phase"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10440","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasProperty","target":"ns=1;i=13743"},{"referenceType":"HasProperty","target":"ns=1;i=10441"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10442"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13743","parentNodeId":"ns=1;i=10440","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10440"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10441","parentNodeId":"ns=1;i=10440","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10440"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10442","parentNodeId":"ns=1;i=10440","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10440"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NetPositiveInletPressureAvailable","dataType":"Double","description":[{"value":"Total pressure (including velocity pressure) at the pump inlet connection less the liquid vapor pressure at the present temperature of the liquid"}],"displayName":[{"value":"NetPositiveInletPressureAvailable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10443","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13744"},{"referenceType":"HasProperty","target":"ns=1;i=13745"},{"referenceType":"HasProperty","target":"ns=1;i=13746"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13744","parentNodeId":"ns=1;i=10443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13745","parentNodeId":"ns=1;i=10443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13746","parentNodeId":"ns=1;i=10443","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10443"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NormalFlow","dataType":"Double","description":[{"value":"Rate of flow at which usual operation is expected"}],"displayName":[{"value":"NormalFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10444","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13747"},{"referenceType":"HasProperty","target":"ns=1;i=13748"},{"referenceType":"HasProperty","target":"ns=1;i=13749"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13747","parentNodeId":"ns=1;i=10444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13748","parentNodeId":"ns=1;i=10444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13749","parentNodeId":"ns=1;i=10444","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10444"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NpshDatumPlane","dataType":"Double","description":[{"value":"Horizontal plane through the center of the circle described by the external points of the entrance edges of the impeller blades, in the first stage in the case of multi-stage pumps"}],"displayName":[{"value":"NpshDatumPlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10445","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13750"},{"referenceType":"HasProperty","target":"ns=1;i=13751"},{"referenceType":"HasProperty","target":"ns=1;i=13752"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13750","parentNodeId":"ns=1;i=10445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13751","parentNodeId":"ns=1;i=10445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13752","parentNodeId":"ns=1;i=10445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OperatingMode","dataType":"OperatingModeEnum","description":[{"value":"Specifies whether the pump is to be operated in single, parallel or series connection."}],"displayName":[{"value":"OperatingMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10446","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13753"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13753","parentNodeId":"ns=1;i=10446","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10446"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Inlet pressure of the installation for the working conditions"}],"displayName":[{"value":"RatedInletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10447","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13754"},{"referenceType":"HasProperty","target":"ns=1;i=13755"},{"referenceType":"HasProperty","target":"ns=1;i=13756"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13754","parentNodeId":"ns=1;i=10447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13755","parentNodeId":"ns=1;i=10447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13756","parentNodeId":"ns=1;i=10447","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10447"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedPumpUnitTotalHead","dataType":"Double","description":[{"value":"Difference of the total head, at the outlet side of the pump unit from the total head at the inlet side of the pump unit, at which usual operation is expected"}],"displayName":[{"value":"RatedPumpUnitTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10448","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13757"},{"referenceType":"HasProperty","target":"ns=1;i=13758"},{"referenceType":"HasProperty","target":"ns=1;i=13759"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13757","parentNodeId":"ns=1;i=10448","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10448"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13758","parentNodeId":"ns=1;i=10448","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10448"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13759","parentNodeId":"ns=1;i=10448","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10448"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ReferencePlane","dataType":"Double","description":[{"value":"Any horizontal plane for use as the datum for height measurement"}],"displayName":[{"value":"ReferencePlane"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10449","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13760"},{"referenceType":"HasProperty","target":"ns=1;i=13761"},{"referenceType":"HasProperty","target":"ns=1;i=13762"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13760","parentNodeId":"ns=1;i=10449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13761","parentNodeId":"ns=1;i=10449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13762","parentNodeId":"ns=1;i=10449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RequiredControlMode","dataType":"ControlModeEnum","description":[{"value":"Specifies which control mode is to be used for the use case."}],"displayName":[{"value":"RequiredControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10450","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13763"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13763","parentNodeId":"ns=1;i=10450","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10450"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RequiredTime","dataType":"Double","description":[{"value":"Time interval throughout which an item is required to be in an up state"}],"displayName":[{"value":"RequiredTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10451","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13764"},{"referenceType":"HasProperty","target":"ns=1;i=13765"},{"referenceType":"HasProperty","target":"ns=1;i=13766"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13764","parentNodeId":"ns=1;i=10451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13765","parentNodeId":"ns=1;i=10451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13766","parentNodeId":"ns=1;i=10451","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10451"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SolidContent","dataType":"Double","description":[{"value":"Proportion of solids contained in the fluid to be pumped, either as a contaminant or as a deliberate useful burden or suspension"}],"displayName":[{"value":"SolidContent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10452","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13767"},{"referenceType":"HasProperty","target":"ns=1;i=13768"},{"referenceType":"HasProperty","target":"ns=1;i=13769"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13767","parentNodeId":"ns=1;i=10452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13768","parentNodeId":"ns=1;i=10452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13769","parentNodeId":"ns=1;i=10452","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10452"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Throughput","dataType":"Double","description":[{"value":"Amount of fluid flowing through a duct"}],"displayName":[{"value":"Throughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10453","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13770"},{"referenceType":"HasProperty","target":"ns=1;i=13771"},{"referenceType":"HasProperty","target":"ns=1;i=13772"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13770","parentNodeId":"ns=1;i=10453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13771","parentNodeId":"ns=1;i=10453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13772","parentNodeId":"ns=1;i=10453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:UltimatePressureOfAVacuumPump","dataType":"Double","description":[{"value":"The ultimate pressure is the value to which the pressure in a standardized test dome approaches asymptotically during normal operation of the vacuum pump and without gas inlet. A difference can be made between the final pressure caused by gases and the final pressure caused by gases and vapors."}],"displayName":[{"value":"UltimatePressureOfAVacuumPump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10454","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13773"},{"referenceType":"HasProperty","target":"ns=1;i=13774"},{"referenceType":"HasProperty","target":"ns=1;i=13775"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13773","parentNodeId":"ns=1;i=10454","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10454"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13774","parentNodeId":"ns=1;i=10454","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10454"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13775","parentNodeId":"ns=1;i=10454","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10454"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:WorkingTemperature","dataType":"Double","description":[{"value":"Temperature determined by the given application and fluid."}],"displayName":[{"value":"WorkingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10455","parentNodeId":"ns=1;i=5133","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13776"},{"referenceType":"HasProperty","target":"ns=1;i=13777"},{"referenceType":"HasProperty","target":"ns=1;i=13778"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5133"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13776","parentNodeId":"ns=1;i=10455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13777","parentNodeId":"ns=1;i=10455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13778","parentNodeId":"ns=1;i=10455","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10455"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Documentation","description":[{"value":"Static documentation files of a pump."}],"displayName":[{"value":"Documentation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5119","parentNodeId":"ns=1;i=1052","references":[{"referenceType":"HasComponent","target":"ns=1;i=5141"},{"referenceType":"HasComponent","target":"ns=1;i=10475"},{"referenceType":"HasComponent","target":"ns=1;i=5142"},{"referenceType":"HasComponent","target":"ns=1;i=10495"},{"referenceType":"HasComponent","target":"ns=1;i=5143"},{"referenceType":"HasComponent","target":"ns=1;i=10515"},{"referenceType":"HasComponent","target":"ns=1;i=5144"},{"referenceType":"HasComponent","target":"ns=1;i=10535"},{"referenceType":"HasComponent","target":"ns=1;i=5145"},{"referenceType":"HasComponent","target":"ns=1;i=10555"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1006"},{"referenceType":"HasComponent","target":"ns=1;i=5146"},{"referenceType":"HasComponent","target":"ns=1;i=10575"},{"referenceType":"HasComponent","target":"ns=1;i=5147"},{"referenceType":"HasComponent","target":"ns=1;i=10595"},{"referenceType":"HasComponent","target":"ns=1;i=5148"},{"referenceType":"HasComponent","target":"ns=1;i=10615"},{"referenceType":"HasComponent","target":"ns=1;i=5149"},{"referenceType":"HasComponent","target":"ns=1;i=10635"},{"referenceType":"HasComponent","target":"ns=1;i=5150"},{"referenceType":"HasComponent","target":"ns=1;i=10655"},{"referenceType":"HasComponent","target":"ns=1;i=5151"},{"referenceType":"HasComponent","target":"ns=1;i=10675"},{"referenceType":"HasComponent","target":"ns=1;i=5152"},{"referenceType":"HasComponent","target":"ns=1;i=10695"},{"referenceType":"HasComponent","target":"ns=1;i=5153"},{"referenceType":"HasComponent","target":"ns=1;i=10715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5154"},{"referenceType":"HasComponent","target":"ns=1;i=10735"},{"referenceType":"HasComponent","target":"ns=1;i=5155"},{"referenceType":"HasComponent","target":"ns=1;i=10755"},{"referenceType":"HasComponent","target":"ns=1;i=5156"},{"referenceType":"HasComponent","target":"ns=1;i=10775"},{"referenceType":"HasComponent","target":"ns=1;i=5157"},{"referenceType":"HasComponent","target":"ns=1;i=10795"},{"referenceType":"HasComponent","target":"ns=1;i=5158"},{"referenceType":"HasComponent","target":"ns=1;i=10815"},{"referenceType":"HasComponent","target":"ns=1;i=5159"},{"referenceType":"HasComponent","target":"ns=1;i=10835"},{"referenceType":"HasComponent","target":"ns=1;i=5160"},{"referenceType":"HasComponent","target":"ns=1;i=10855"},{"referenceType":"HasComponent","target":"ns=1;i=5161"},{"referenceType":"HasComponent","target":"ns=1;i=10875"},{"referenceType":"HasComponent","target":"ns=1;i=5162"},{"referenceType":"HasComponent","target":"ns=1;i=10895"}],"typeDefinition":"ns=1;i=1006"},{"browseName":"1:Arrangements","description":[{"value":"Drawing showing replacement components layout for an item."}],"displayName":[{"value":"Arrangements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5141","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=10456"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10458"},{"referenceType":"HasProperty","target":"ns=1;i=6570"},{"referenceType":"HasComponent","target":"ns=1;i=10461"},{"referenceType":"HasProperty","target":"ns=1;i=10464"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10465"},{"referenceType":"HasComponent","target":"ns=1;i=10468"},{"referenceType":"HasProperty","target":"ns=1;i=10470"},{"referenceType":"HasProperty","target":"ns=1;i=10471"},{"referenceType":"HasProperty","target":"ns=1;i=10472"},{"referenceType":"HasComponent","target":"ns=1;i=10473"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10456","parentNodeId":"ns=1;i=5141","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5141"},{"referenceType":"HasProperty","target":"ns=1;i=10457"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10457","parentNodeId":"ns=1;i=10456","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10456"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10458","parentNodeId":"ns=1;i=5141","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5141"},{"referenceType":"HasProperty","target":"ns=1;i=10459"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10460"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10459","parentNodeId":"ns=1;i=10458","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10458"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10460","parentNodeId":"ns=1;i=10458","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10458"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6570","parentNodeId":"ns=1;i=5141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10461","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasProperty","target":"ns=1;i=10462"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5141"},{"referenceType":"HasProperty","target":"ns=1;i=10463"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10462","parentNodeId":"ns=1;i=10461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10461"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10463","parentNodeId":"ns=1;i=10461","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10461"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10464","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5141"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10465","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasProperty","target":"ns=1;i=10466"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10467"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5141"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10466","parentNodeId":"ns=1;i=10465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10465"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10467","parentNodeId":"ns=1;i=10465","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10465"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10468","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasProperty","target":"ns=1;i=10469"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5141"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10469","parentNodeId":"ns=1;i=10468","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10468"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10470","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5141"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10471","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5141"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10472","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5141"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10473","parentNodeId":"ns=1;i=5141","references":[{"referenceType":"HasProperty","target":"ns=1;i=10474"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5141"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10474","parentNodeId":"ns=1;i=10473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10473"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ArrangementsLink","dataType":"String","description":[{"value":"Drawing showing replacement components layout for an item."}],"displayName":[{"value":"ArrangementsLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10475","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13005"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13005","parentNodeId":"ns=1;i=10475","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10475"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Certificates","description":[{"value":"Specific safety and statutory regulations certificates for items (lifting equipment, steam boilers, pressure vessels,...)."}],"displayName":[{"value":"Certificates"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5142","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=10476"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10478"},{"referenceType":"HasProperty","target":"ns=1;i=6574"},{"referenceType":"HasComponent","target":"ns=1;i=10481"},{"referenceType":"HasProperty","target":"ns=1;i=10484"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10485"},{"referenceType":"HasComponent","target":"ns=1;i=10488"},{"referenceType":"HasProperty","target":"ns=1;i=10490"},{"referenceType":"HasProperty","target":"ns=1;i=10491"},{"referenceType":"HasProperty","target":"ns=1;i=10492"},{"referenceType":"HasComponent","target":"ns=1;i=10493"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10476","parentNodeId":"ns=1;i=5142","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5142"},{"referenceType":"HasProperty","target":"ns=1;i=10477"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10477","parentNodeId":"ns=1;i=10476","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10476"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10478","parentNodeId":"ns=1;i=5142","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5142"},{"referenceType":"HasProperty","target":"ns=1;i=10479"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10480"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10479","parentNodeId":"ns=1;i=10478","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10478"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10480","parentNodeId":"ns=1;i=10478","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10478"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6574","parentNodeId":"ns=1;i=5142","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5142"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10481","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasProperty","target":"ns=1;i=10482"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5142"},{"referenceType":"HasProperty","target":"ns=1;i=10483"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10482","parentNodeId":"ns=1;i=10481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10481"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10483","parentNodeId":"ns=1;i=10481","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10481"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10484","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5142"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10485","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasProperty","target":"ns=1;i=10486"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10487"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5142"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10486","parentNodeId":"ns=1;i=10485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10485"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10487","parentNodeId":"ns=1;i=10485","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10485"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10488","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasProperty","target":"ns=1;i=10489"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5142"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10489","parentNodeId":"ns=1;i=10488","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10488"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10490","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5142"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10491","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5142"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10492","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5142"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10493","parentNodeId":"ns=1;i=5142","references":[{"referenceType":"HasProperty","target":"ns=1;i=10494"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5142"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10494","parentNodeId":"ns=1;i=10493","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10493"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:CertificatesLink","dataType":"String","description":[{"value":"Specific safety and statutory regulations certificates for items (lifting equipment, steam boilers, pressure vessels,...)."}],"displayName":[{"value":"CertificatesLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10495","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13006"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13006","parentNodeId":"ns=1;i=10495","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10495"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:CircuitDiagram","description":[{"value":"Overall feeder and control circuits diagram."}],"displayName":[{"value":"CircuitDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5143","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=10496"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10498"},{"referenceType":"HasProperty","target":"ns=1;i=6588"},{"referenceType":"HasComponent","target":"ns=1;i=10501"},{"referenceType":"HasProperty","target":"ns=1;i=10504"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10505"},{"referenceType":"HasComponent","target":"ns=1;i=10508"},{"referenceType":"HasProperty","target":"ns=1;i=10510"},{"referenceType":"HasProperty","target":"ns=1;i=10511"},{"referenceType":"HasProperty","target":"ns=1;i=10512"},{"referenceType":"HasComponent","target":"ns=1;i=10513"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10496","parentNodeId":"ns=1;i=5143","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5143"},{"referenceType":"HasProperty","target":"ns=1;i=10497"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10497","parentNodeId":"ns=1;i=10496","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10496"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10498","parentNodeId":"ns=1;i=5143","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5143"},{"referenceType":"HasProperty","target":"ns=1;i=10499"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10500"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10499","parentNodeId":"ns=1;i=10498","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10498"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10500","parentNodeId":"ns=1;i=10498","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10498"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6588","parentNodeId":"ns=1;i=5143","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5143"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10501","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasProperty","target":"ns=1;i=10502"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5143"},{"referenceType":"HasProperty","target":"ns=1;i=10503"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10502","parentNodeId":"ns=1;i=10501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10501"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10503","parentNodeId":"ns=1;i=10501","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10501"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10504","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5143"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10505","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasProperty","target":"ns=1;i=10506"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10507"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5143"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10506","parentNodeId":"ns=1;i=10505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10505"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10507","parentNodeId":"ns=1;i=10505","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10505"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10508","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasProperty","target":"ns=1;i=10509"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5143"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10509","parentNodeId":"ns=1;i=10508","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10508"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10510","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5143"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10511","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5143"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10512","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5143"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10513","parentNodeId":"ns=1;i=5143","references":[{"referenceType":"HasProperty","target":"ns=1;i=10514"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5143"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10514","parentNodeId":"ns=1;i=10513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10513"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:CircuitDiagramLink","dataType":"String","description":[{"value":"Overall feeder and control circuits diagram."}],"displayName":[{"value":"CircuitDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10515","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13007"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13007","parentNodeId":"ns=1;i=10515","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10515"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ComponentsList","description":[{"value":"Comprehensive list of items which constitute part of another one."}],"displayName":[{"value":"ComponentsList"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5144","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10516"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10518"},{"referenceType":"HasProperty","target":"ns=1;i=6592"},{"referenceType":"HasComponent","target":"ns=1;i=10521"},{"referenceType":"HasProperty","target":"ns=1;i=10524"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10525"},{"referenceType":"HasComponent","target":"ns=1;i=10528"},{"referenceType":"HasProperty","target":"ns=1;i=10530"},{"referenceType":"HasProperty","target":"ns=1;i=10531"},{"referenceType":"HasProperty","target":"ns=1;i=10532"},{"referenceType":"HasComponent","target":"ns=1;i=10533"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10516","parentNodeId":"ns=1;i=5144","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5144"},{"referenceType":"HasProperty","target":"ns=1;i=10517"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10517","parentNodeId":"ns=1;i=10516","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10516"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10518","parentNodeId":"ns=1;i=5144","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5144"},{"referenceType":"HasProperty","target":"ns=1;i=10519"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10520"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10519","parentNodeId":"ns=1;i=10518","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10518"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10520","parentNodeId":"ns=1;i=10518","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10518"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=6592","parentNodeId":"ns=1;i=5144","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5144"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10521","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasProperty","target":"ns=1;i=10522"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5144"},{"referenceType":"HasProperty","target":"ns=1;i=10523"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10522","parentNodeId":"ns=1;i=10521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10521"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10523","parentNodeId":"ns=1;i=10521","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10521"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10524","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5144"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10525","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasProperty","target":"ns=1;i=10526"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10527"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5144"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10526","parentNodeId":"ns=1;i=10525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10525"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10527","parentNodeId":"ns=1;i=10525","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10525"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10528","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasProperty","target":"ns=1;i=10529"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5144"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10529","parentNodeId":"ns=1;i=10528","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10528"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10530","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5144"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10531","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5144"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10532","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5144"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10533","parentNodeId":"ns=1;i=5144","references":[{"referenceType":"HasProperty","target":"ns=1;i=10534"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5144"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10534","parentNodeId":"ns=1;i=10533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10533"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ComponentsListLink","dataType":"String","description":[{"value":"Comprehensive list of items which constitute part of another one."}],"displayName":[{"value":"ComponentsListLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10535","parentNodeId":"ns=1;i=5119","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13008"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13008","parentNodeId":"ns=1;i=10535","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10535"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Detail","description":[{"value":"Drawing with part list to ensure dismantling, repair and assembly of items."}],"displayName":[{"value":"Detail"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5145","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10536"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10538"},{"referenceType":"HasProperty","target":"ns=1;i=11389"},{"referenceType":"HasComponent","target":"ns=1;i=10541"},{"referenceType":"HasProperty","target":"ns=1;i=10544"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10545"},{"referenceType":"HasComponent","target":"ns=1;i=10548"},{"referenceType":"HasProperty","target":"ns=1;i=10550"},{"referenceType":"HasProperty","target":"ns=1;i=10551"},{"referenceType":"HasProperty","target":"ns=1;i=10552"},{"referenceType":"HasComponent","target":"ns=1;i=10553"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10536","parentNodeId":"ns=1;i=5145","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5145"},{"referenceType":"HasProperty","target":"ns=1;i=10537"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10537","parentNodeId":"ns=1;i=10536","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10536"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10538","parentNodeId":"ns=1;i=5145","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5145"},{"referenceType":"HasProperty","target":"ns=1;i=10539"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10540"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10539","parentNodeId":"ns=1;i=10538","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10538"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10540","parentNodeId":"ns=1;i=10538","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10538"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11389","parentNodeId":"ns=1;i=5145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10541","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasProperty","target":"ns=1;i=10542"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5145"},{"referenceType":"HasProperty","target":"ns=1;i=10543"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10542","parentNodeId":"ns=1;i=10541","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10541"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10543","parentNodeId":"ns=1;i=10541","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10541"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10544","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5145"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10545","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasProperty","target":"ns=1;i=10546"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10547"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5145"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10546","parentNodeId":"ns=1;i=10545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10545"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10547","parentNodeId":"ns=1;i=10545","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10545"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10548","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasProperty","target":"ns=1;i=10549"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5145"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10549","parentNodeId":"ns=1;i=10548","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10548"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10550","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5145"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10551","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5145"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10552","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5145"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10553","parentNodeId":"ns=1;i=5145","references":[{"referenceType":"HasProperty","target":"ns=1;i=10554"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5145"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10554","parentNodeId":"ns=1;i=10553","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10553"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:DetailLink","dataType":"String","description":[{"value":"Drawing with part list to ensure dismantling, repair and assembly of items."}],"displayName":[{"value":"DetailLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10555","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13009"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13009","parentNodeId":"ns=1;i=10555","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10555"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DuringMaintenanceServicesRendered","description":[{"value":"Final and/or interim report on services provided"}],"displayName":[{"value":"DuringMaintenanceServicesRendered"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5146","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10556"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10558"},{"referenceType":"HasProperty","target":"ns=1;i=12999"},{"referenceType":"HasComponent","target":"ns=1;i=10561"},{"referenceType":"HasProperty","target":"ns=1;i=10564"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10565"},{"referenceType":"HasComponent","target":"ns=1;i=10568"},{"referenceType":"HasProperty","target":"ns=1;i=10570"},{"referenceType":"HasProperty","target":"ns=1;i=10571"},{"referenceType":"HasProperty","target":"ns=1;i=10572"},{"referenceType":"HasComponent","target":"ns=1;i=10573"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10556","parentNodeId":"ns=1;i=5146","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5146"},{"referenceType":"HasProperty","target":"ns=1;i=10557"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10557","parentNodeId":"ns=1;i=10556","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10556"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10558","parentNodeId":"ns=1;i=5146","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5146"},{"referenceType":"HasProperty","target":"ns=1;i=10559"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10560"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10559","parentNodeId":"ns=1;i=10558","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10558"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10560","parentNodeId":"ns=1;i=10558","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10558"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12999","parentNodeId":"ns=1;i=5146","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5146"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10561","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasProperty","target":"ns=1;i=10562"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5146"},{"referenceType":"HasProperty","target":"ns=1;i=10563"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10562","parentNodeId":"ns=1;i=10561","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10561"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10563","parentNodeId":"ns=1;i=10561","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10561"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10564","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5146"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10565","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasProperty","target":"ns=1;i=10566"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10567"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5146"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10566","parentNodeId":"ns=1;i=10565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10565"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10567","parentNodeId":"ns=1;i=10565","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10565"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10568","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasProperty","target":"ns=1;i=10569"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5146"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10569","parentNodeId":"ns=1;i=10568","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10568"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10570","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5146"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10571","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5146"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10572","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5146"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10573","parentNodeId":"ns=1;i=5146","references":[{"referenceType":"HasProperty","target":"ns=1;i=10574"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5146"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10574","parentNodeId":"ns=1;i=10573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10573"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:DuringMaintenanceServicesRenderedLink","dataType":"String","description":[{"value":"Final and/or interim report on services provided"}],"displayName":[{"value":"DuringMaintenanceServicesRenderedLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10575","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13010"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13010","parentNodeId":"ns=1;i=10575","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10575"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ImplementationDescription","description":[{"value":"Explanation of the work carried out"}],"displayName":[{"value":"ImplementationDescription"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5147","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10576"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10578"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=13002"},{"referenceType":"HasComponent","target":"ns=1;i=10581"},{"referenceType":"HasProperty","target":"ns=1;i=10584"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10585"},{"referenceType":"HasComponent","target":"ns=1;i=10588"},{"referenceType":"HasProperty","target":"ns=1;i=10590"},{"referenceType":"HasProperty","target":"ns=1;i=10591"},{"referenceType":"HasProperty","target":"ns=1;i=10592"},{"referenceType":"HasComponent","target":"ns=1;i=10593"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10576","parentNodeId":"ns=1;i=5147","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5147"},{"referenceType":"HasProperty","target":"ns=1;i=10577"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10577","parentNodeId":"ns=1;i=10576","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10576"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10578","parentNodeId":"ns=1;i=5147","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5147"},{"referenceType":"HasProperty","target":"ns=1;i=10579"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10580"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10579","parentNodeId":"ns=1;i=10578","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10578"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10580","parentNodeId":"ns=1;i=10578","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10578"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13002","parentNodeId":"ns=1;i=5147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10581","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasProperty","target":"ns=1;i=10582"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5147"},{"referenceType":"HasProperty","target":"ns=1;i=10583"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10582","parentNodeId":"ns=1;i=10581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10581"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10583","parentNodeId":"ns=1;i=10581","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10581"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10584","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5147"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10585","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasProperty","target":"ns=1;i=10586"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10587"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5147"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10586","parentNodeId":"ns=1;i=10585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10585"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10587","parentNodeId":"ns=1;i=10585","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10585"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10588","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasProperty","target":"ns=1;i=10589"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5147"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10589","parentNodeId":"ns=1;i=10588","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10588"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10590","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5147"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10591","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5147"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10592","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5147"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10593","parentNodeId":"ns=1;i=5147","references":[{"referenceType":"HasProperty","target":"ns=1;i=10594"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5147"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10594","parentNodeId":"ns=1;i=10593","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10593"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ImplementationDescriptionLink","dataType":"String","description":[{"value":"Explanation of the work carried out"}],"displayName":[{"value":"ImplementationDescriptionLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10595","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13011"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13011","parentNodeId":"ns=1;i=10595","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10595"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Layout","description":[{"value":"Drawing showing all areas of a particular plant."}],"displayName":[{"value":"Layout"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5148","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10596"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10598"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=11392"},{"referenceType":"HasComponent","target":"ns=1;i=10601"},{"referenceType":"HasProperty","target":"ns=1;i=10604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10605"},{"referenceType":"HasComponent","target":"ns=1;i=10608"},{"referenceType":"HasProperty","target":"ns=1;i=10610"},{"referenceType":"HasProperty","target":"ns=1;i=10611"},{"referenceType":"HasProperty","target":"ns=1;i=10612"},{"referenceType":"HasComponent","target":"ns=1;i=10613"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10596","parentNodeId":"ns=1;i=5148","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5148"},{"referenceType":"HasProperty","target":"ns=1;i=10597"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10597","parentNodeId":"ns=1;i=10596","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10596"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10598","parentNodeId":"ns=1;i=5148","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5148"},{"referenceType":"HasProperty","target":"ns=1;i=10599"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10600"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10599","parentNodeId":"ns=1;i=10598","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10598"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10600","parentNodeId":"ns=1;i=10598","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10598"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11392","parentNodeId":"ns=1;i=5148","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5148"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10601","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasProperty","target":"ns=1;i=10602"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5148"},{"referenceType":"HasProperty","target":"ns=1;i=10603"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10602","parentNodeId":"ns=1;i=10601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10601"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10603","parentNodeId":"ns=1;i=10601","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10601"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10604","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5148"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10605","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasProperty","target":"ns=1;i=10606"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10607"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5148"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10606","parentNodeId":"ns=1;i=10605","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10605"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10607","parentNodeId":"ns=1;i=10605","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10605"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10608","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasProperty","target":"ns=1;i=10609"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5148"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10609","parentNodeId":"ns=1;i=10608","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10608"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10610","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5148"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10611","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5148"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10612","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5148"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10613","parentNodeId":"ns=1;i=5148","references":[{"referenceType":"HasProperty","target":"ns=1;i=10614"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5148"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10614","parentNodeId":"ns=1;i=10613","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10613"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LayoutLink","dataType":"String","description":[{"value":"Drawing showing all areas of a particular plant."}],"displayName":[{"value":"LayoutLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10615","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13012"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13012","parentNodeId":"ns=1;i=10615","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10615"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Location","description":[{"value":"Drawing showing the position of all field items within the considered area."}],"displayName":[{"value":"Location"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5149","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10616"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10618"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=12989"},{"referenceType":"HasComponent","target":"ns=1;i=10621"},{"referenceType":"HasProperty","target":"ns=1;i=10624"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10625"},{"referenceType":"HasComponent","target":"ns=1;i=10628"},{"referenceType":"HasProperty","target":"ns=1;i=10630"},{"referenceType":"HasProperty","target":"ns=1;i=10631"},{"referenceType":"HasProperty","target":"ns=1;i=10632"},{"referenceType":"HasComponent","target":"ns=1;i=10633"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10616","parentNodeId":"ns=1;i=5149","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5149"},{"referenceType":"HasProperty","target":"ns=1;i=10617"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10617","parentNodeId":"ns=1;i=10616","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10616"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10618","parentNodeId":"ns=1;i=5149","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5149"},{"referenceType":"HasProperty","target":"ns=1;i=10619"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10620"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10619","parentNodeId":"ns=1;i=10618","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10618"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10620","parentNodeId":"ns=1;i=10618","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10618"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12989","parentNodeId":"ns=1;i=5149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5149"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10621","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasProperty","target":"ns=1;i=10622"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5149"},{"referenceType":"HasProperty","target":"ns=1;i=10623"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10622","parentNodeId":"ns=1;i=10621","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10621"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10623","parentNodeId":"ns=1;i=10621","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10621"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10624","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5149"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10625","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasProperty","target":"ns=1;i=10626"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10627"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5149"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10626","parentNodeId":"ns=1;i=10625","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10625"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10627","parentNodeId":"ns=1;i=10625","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10625"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10628","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasProperty","target":"ns=1;i=10629"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5149"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10629","parentNodeId":"ns=1;i=10628","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10628"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10630","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5149"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10631","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5149"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10632","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5149"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10633","parentNodeId":"ns=1;i=5149","references":[{"referenceType":"HasProperty","target":"ns=1;i=10634"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5149"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10634","parentNodeId":"ns=1;i=10633","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10633"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LocationLink","dataType":"String","description":[{"value":"Drawing showing the position of all field items within the considered area."}],"displayName":[{"value":"LocationLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10635","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13013"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13013","parentNodeId":"ns=1;i=10635","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10635"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:LogicDiagram","description":[{"value":"System control diagram to clarify the overall system logic."}],"displayName":[{"value":"LogicDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5150","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10636"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10638"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=12990"},{"referenceType":"HasComponent","target":"ns=1;i=10641"},{"referenceType":"HasProperty","target":"ns=1;i=10644"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10645"},{"referenceType":"HasComponent","target":"ns=1;i=10648"},{"referenceType":"HasProperty","target":"ns=1;i=10650"},{"referenceType":"HasProperty","target":"ns=1;i=10651"},{"referenceType":"HasProperty","target":"ns=1;i=10652"},{"referenceType":"HasComponent","target":"ns=1;i=10653"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10636","parentNodeId":"ns=1;i=5150","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5150"},{"referenceType":"HasProperty","target":"ns=1;i=10637"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10637","parentNodeId":"ns=1;i=10636","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10636"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10638","parentNodeId":"ns=1;i=5150","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5150"},{"referenceType":"HasProperty","target":"ns=1;i=10639"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10640"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10639","parentNodeId":"ns=1;i=10638","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10638"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10640","parentNodeId":"ns=1;i=10638","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10638"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12990","parentNodeId":"ns=1;i=5150","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5150"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10641","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasProperty","target":"ns=1;i=10642"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5150"},{"referenceType":"HasProperty","target":"ns=1;i=10643"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10642","parentNodeId":"ns=1;i=10641","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10641"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10643","parentNodeId":"ns=1;i=10641","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10641"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10644","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5150"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10645","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasProperty","target":"ns=1;i=10646"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10647"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5150"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10646","parentNodeId":"ns=1;i=10645","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10645"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10647","parentNodeId":"ns=1;i=10645","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10645"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10648","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasProperty","target":"ns=1;i=10649"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5150"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10649","parentNodeId":"ns=1;i=10648","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10648"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10650","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5150"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10651","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5150"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10652","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5150"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10653","parentNodeId":"ns=1;i=5150","references":[{"referenceType":"HasProperty","target":"ns=1;i=10654"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5150"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10654","parentNodeId":"ns=1;i=10653","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10653"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LogicDiagramLink","dataType":"String","description":[{"value":"System control diagram to clarify the overall system logic."}],"displayName":[{"value":"LogicDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10655","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13014"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13014","parentNodeId":"ns=1;i=10655","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10655"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:LubricationMap","description":[{"value":"Drawing showing position of each item lubrication point, with lubrication data and specifications."}],"displayName":[{"value":"LubricationMap"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5151","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10656"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10658"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=12991"},{"referenceType":"HasComponent","target":"ns=1;i=10661"},{"referenceType":"HasProperty","target":"ns=1;i=10664"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10665"},{"referenceType":"HasComponent","target":"ns=1;i=10668"},{"referenceType":"HasProperty","target":"ns=1;i=10670"},{"referenceType":"HasProperty","target":"ns=1;i=10671"},{"referenceType":"HasProperty","target":"ns=1;i=10672"},{"referenceType":"HasComponent","target":"ns=1;i=10673"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10656","parentNodeId":"ns=1;i=5151","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5151"},{"referenceType":"HasProperty","target":"ns=1;i=10657"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10657","parentNodeId":"ns=1;i=10656","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10656"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10658","parentNodeId":"ns=1;i=5151","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5151"},{"referenceType":"HasProperty","target":"ns=1;i=10659"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10660"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10659","parentNodeId":"ns=1;i=10658","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10658"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10660","parentNodeId":"ns=1;i=10658","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10658"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12991","parentNodeId":"ns=1;i=5151","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5151"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10661","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasProperty","target":"ns=1;i=10662"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5151"},{"referenceType":"HasProperty","target":"ns=1;i=10663"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10662","parentNodeId":"ns=1;i=10661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10661"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10663","parentNodeId":"ns=1;i=10661","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10661"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10664","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5151"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10665","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasProperty","target":"ns=1;i=10666"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10667"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5151"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10666","parentNodeId":"ns=1;i=10665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10665"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10667","parentNodeId":"ns=1;i=10665","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10665"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10668","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasProperty","target":"ns=1;i=10669"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5151"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10669","parentNodeId":"ns=1;i=10668","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10668"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10670","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5151"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10671","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5151"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10672","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5151"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10673","parentNodeId":"ns=1;i=5151","references":[{"referenceType":"HasProperty","target":"ns=1;i=10674"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5151"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10674","parentNodeId":"ns=1;i=10673","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10673"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:LubricationMapLink","dataType":"String","description":[{"value":"Drawing showing position of each item lubrication point, with lubrication data and specifications."}],"displayName":[{"value":"LubricationMapLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10675","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13015"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13015","parentNodeId":"ns=1;i=10675","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10675"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceManual","description":[{"value":"Technical instructions intended to preserve an item in, or restore it to, a state in which it can perform a required function."}],"displayName":[{"value":"MaintenanceManual"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5152","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10676"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10678"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=12992"},{"referenceType":"HasComponent","target":"ns=1;i=10681"},{"referenceType":"HasProperty","target":"ns=1;i=10684"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10685"},{"referenceType":"HasComponent","target":"ns=1;i=10688"},{"referenceType":"HasProperty","target":"ns=1;i=10690"},{"referenceType":"HasProperty","target":"ns=1;i=10691"},{"referenceType":"HasProperty","target":"ns=1;i=10692"},{"referenceType":"HasComponent","target":"ns=1;i=10693"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10676","parentNodeId":"ns=1;i=5152","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5152"},{"referenceType":"HasProperty","target":"ns=1;i=10677"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10677","parentNodeId":"ns=1;i=10676","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10676"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10678","parentNodeId":"ns=1;i=5152","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5152"},{"referenceType":"HasProperty","target":"ns=1;i=10679"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10680"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10679","parentNodeId":"ns=1;i=10678","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10678"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10680","parentNodeId":"ns=1;i=10678","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10678"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12992","parentNodeId":"ns=1;i=5152","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5152"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10681","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasProperty","target":"ns=1;i=10682"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5152"},{"referenceType":"HasProperty","target":"ns=1;i=10683"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10682","parentNodeId":"ns=1;i=10681","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10681"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10683","parentNodeId":"ns=1;i=10681","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10681"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10684","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5152"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10685","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasProperty","target":"ns=1;i=10686"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10687"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5152"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10686","parentNodeId":"ns=1;i=10685","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10685"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10687","parentNodeId":"ns=1;i=10685","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10685"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10688","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasProperty","target":"ns=1;i=10689"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5152"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10689","parentNodeId":"ns=1;i=10688","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10688"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10690","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5152"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10691","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5152"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10692","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5152"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10693","parentNodeId":"ns=1;i=5152","references":[{"referenceType":"HasProperty","target":"ns=1;i=10694"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5152"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10694","parentNodeId":"ns=1;i=10693","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10693"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:MaintenanceManualLink","dataType":"String","description":[{"value":"Technical instructions intended to preserve an item in, or restore it to, a state in which it can perform a required function."}],"displayName":[{"value":"MaintenanceManualLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10695","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13016"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13016","parentNodeId":"ns=1;i=10695","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10695"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperationManual","description":[{"value":"Technical instructions to reach a proper item function performance according to its technical specifications and safety conditions."}],"displayName":[{"value":"OperationManual"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5153","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10696"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10698"},{"referenceType":"HasProperty","target":"ns=1;i=12993"},{"referenceType":"HasComponent","target":"ns=1;i=10701"},{"referenceType":"HasProperty","target":"ns=1;i=10704"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10705"},{"referenceType":"HasComponent","target":"ns=1;i=10708"},{"referenceType":"HasProperty","target":"ns=1;i=10710"},{"referenceType":"HasProperty","target":"ns=1;i=10711"},{"referenceType":"HasProperty","target":"ns=1;i=10712"},{"referenceType":"HasComponent","target":"ns=1;i=10713"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10696","parentNodeId":"ns=1;i=5153","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5153"},{"referenceType":"HasProperty","target":"ns=1;i=10697"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10697","parentNodeId":"ns=1;i=10696","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10696"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10698","parentNodeId":"ns=1;i=5153","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5153"},{"referenceType":"HasProperty","target":"ns=1;i=10699"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10700"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10699","parentNodeId":"ns=1;i=10698","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10698"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10700","parentNodeId":"ns=1;i=10698","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10698"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12993","parentNodeId":"ns=1;i=5153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10701","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasProperty","target":"ns=1;i=10702"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5153"},{"referenceType":"HasProperty","target":"ns=1;i=10703"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10702","parentNodeId":"ns=1;i=10701","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10701"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10703","parentNodeId":"ns=1;i=10701","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10701"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10704","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5153"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10705","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasProperty","target":"ns=1;i=10706"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10707"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5153"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10706","parentNodeId":"ns=1;i=10705","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10705"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10707","parentNodeId":"ns=1;i=10705","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10705"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10708","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasProperty","target":"ns=1;i=10709"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5153"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10709","parentNodeId":"ns=1;i=10708","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10708"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10710","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5153"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10711","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5153"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10712","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5153"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10713","parentNodeId":"ns=1;i=5153","references":[{"referenceType":"HasProperty","target":"ns=1;i=10714"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5153"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10714","parentNodeId":"ns=1;i=10713","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10713"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:OperationManualLink","dataType":"String","description":[{"value":"Technical instructions to reach a proper item function performance according to its technical specifications and safety conditions."}],"displayName":[{"value":"OperationManualLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10715","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13017"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13017","parentNodeId":"ns=1;i=10715","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10715"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PersonnelRecording","description":[{"value":"List of all activities (work order) performed by a technician. This list includes a predefined time period"}],"displayName":[{"value":"PersonnelRecording"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5154","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10716"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10718"},{"referenceType":"HasProperty","target":"ns=1;i=13000"},{"referenceType":"HasComponent","target":"ns=1;i=10721"},{"referenceType":"HasProperty","target":"ns=1;i=10724"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=10725"},{"referenceType":"HasComponent","target":"ns=1;i=10728"},{"referenceType":"HasProperty","target":"ns=1;i=10730"},{"referenceType":"HasProperty","target":"ns=1;i=10731"},{"referenceType":"HasProperty","target":"ns=1;i=10732"},{"referenceType":"HasComponent","target":"ns=1;i=10733"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10716","parentNodeId":"ns=1;i=5154","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5154"},{"referenceType":"HasProperty","target":"ns=1;i=10717"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10717","parentNodeId":"ns=1;i=10716","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10716"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10718","parentNodeId":"ns=1;i=5154","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5154"},{"referenceType":"HasProperty","target":"ns=1;i=10719"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10720"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10719","parentNodeId":"ns=1;i=10718","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10718"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10720","parentNodeId":"ns=1;i=10718","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10718"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13000","parentNodeId":"ns=1;i=5154","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5154"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10721","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasProperty","target":"ns=1;i=10722"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5154"},{"referenceType":"HasProperty","target":"ns=1;i=10723"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10722","parentNodeId":"ns=1;i=10721","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10721"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10723","parentNodeId":"ns=1;i=10721","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10721"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10724","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5154"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10725","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasProperty","target":"ns=1;i=10726"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10727"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5154"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10726","parentNodeId":"ns=1;i=10725","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10725"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10727","parentNodeId":"ns=1;i=10725","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10725"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10728","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasProperty","target":"ns=1;i=10729"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5154"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10729","parentNodeId":"ns=1;i=10728","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10728"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10730","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5154"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10731","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5154"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10732","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5154"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10733","parentNodeId":"ns=1;i=5154","references":[{"referenceType":"HasProperty","target":"ns=1;i=10734"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5154"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10734","parentNodeId":"ns=1;i=10733","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10733"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PersonnelRecordingLink","dataType":"String","description":[{"value":"List of all activities (work order) performed by a technician. This list includes a predefined time period"}],"displayName":[{"value":"PersonnelRecordingLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10735","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13018"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13018","parentNodeId":"ns=1;i=10735","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10735"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PipeAndInstrumentDiagram","description":[{"value":"Overall fluid conduction (air, steam, oil, fuel ...), and control diagram."}],"displayName":[{"value":"PipeAndInstrumentDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5155","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10736"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10738"},{"referenceType":"HasProperty","target":"ns=1;i=12994"},{"referenceType":"HasComponent","target":"ns=1;i=10741"},{"referenceType":"HasProperty","target":"ns=1;i=10744"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=10745"},{"referenceType":"HasComponent","target":"ns=1;i=10748"},{"referenceType":"HasProperty","target":"ns=1;i=10750"},{"referenceType":"HasProperty","target":"ns=1;i=10751"},{"referenceType":"HasProperty","target":"ns=1;i=10752"},{"referenceType":"HasComponent","target":"ns=1;i=10753"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10736","parentNodeId":"ns=1;i=5155","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5155"},{"referenceType":"HasProperty","target":"ns=1;i=10737"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10737","parentNodeId":"ns=1;i=10736","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10736"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10738","parentNodeId":"ns=1;i=5155","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5155"},{"referenceType":"HasProperty","target":"ns=1;i=10739"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10740"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10739","parentNodeId":"ns=1;i=10738","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10738"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10740","parentNodeId":"ns=1;i=10738","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10738"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12994","parentNodeId":"ns=1;i=5155","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5155"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10741","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasProperty","target":"ns=1;i=10742"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5155"},{"referenceType":"HasProperty","target":"ns=1;i=10743"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10742","parentNodeId":"ns=1;i=10741","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10741"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10743","parentNodeId":"ns=1;i=10741","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10741"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10744","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5155"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10745","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasProperty","target":"ns=1;i=10746"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10747"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5155"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10746","parentNodeId":"ns=1;i=10745","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10745"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10747","parentNodeId":"ns=1;i=10745","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10745"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10748","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasProperty","target":"ns=1;i=10749"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5155"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10749","parentNodeId":"ns=1;i=10748","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10748"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10750","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5155"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10751","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5155"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10752","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5155"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10753","parentNodeId":"ns=1;i=5155","references":[{"referenceType":"HasProperty","target":"ns=1;i=10754"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5155"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10754","parentNodeId":"ns=1;i=10753","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10753"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:PipeAndInstrumentDiagramLink","dataType":"String","description":[{"value":"Overall fluid conduction (air, steam, oil, fuel ...), and control diagram."}],"displayName":[{"value":"PipeAndInstrumentDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10755","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13019"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13019","parentNodeId":"ns=1;i=10755","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10755"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ScopeOfWork","description":[{"value":"The hours worked in the execution of the work order. The type of hours worked should be indicated: normal, in shifts, at night, overtime, etc."}],"displayName":[{"value":"ScopeOfWork"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5156","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10756"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10758"},{"referenceType":"HasProperty","target":"ns=1;i=13003"},{"referenceType":"HasComponent","target":"ns=1;i=10761"},{"referenceType":"HasProperty","target":"ns=1;i=10764"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10765"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasComponent","target":"ns=1;i=10768"},{"referenceType":"HasProperty","target":"ns=1;i=10770"},{"referenceType":"HasProperty","target":"ns=1;i=10771"},{"referenceType":"HasProperty","target":"ns=1;i=10772"},{"referenceType":"HasComponent","target":"ns=1;i=10773"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10756","parentNodeId":"ns=1;i=5156","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5156"},{"referenceType":"HasProperty","target":"ns=1;i=10757"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10757","parentNodeId":"ns=1;i=10756","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10756"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10758","parentNodeId":"ns=1;i=5156","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5156"},{"referenceType":"HasProperty","target":"ns=1;i=10759"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10760"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10759","parentNodeId":"ns=1;i=10758","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10758"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10760","parentNodeId":"ns=1;i=10758","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10758"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13003","parentNodeId":"ns=1;i=5156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10761","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasProperty","target":"ns=1;i=10762"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5156"},{"referenceType":"HasProperty","target":"ns=1;i=10763"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10762","parentNodeId":"ns=1;i=10761","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10761"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10763","parentNodeId":"ns=1;i=10761","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10761"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10764","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5156"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10765","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasProperty","target":"ns=1;i=10766"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10767"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5156"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10766","parentNodeId":"ns=1;i=10765","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10765"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10767","parentNodeId":"ns=1;i=10765","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10765"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10768","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasProperty","target":"ns=1;i=10769"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5156"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10769","parentNodeId":"ns=1;i=10768","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10768"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10770","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5156"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10771","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5156"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10772","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5156"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10773","parentNodeId":"ns=1;i=5156","references":[{"referenceType":"HasProperty","target":"ns=1;i=10774"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5156"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10774","parentNodeId":"ns=1;i=10773","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10773"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:ScopeOfWorkLink","dataType":"String","description":[{"value":"The hours worked in the execution of the work order. The type of hours worked should be indicated: normal, in shifts, at night, overtime, etc."}],"displayName":[{"value":"ScopeOfWorkLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10775","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13020"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13020","parentNodeId":"ns=1;i=10775","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10775"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SingleLineDiagram","description":[{"value":"Overall power distribution diagram (electrical, pneumatic, hydraulic). This kind of diagram includes switchboard circuits."}],"displayName":[{"value":"SingleLineDiagram"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5157","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10776"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10778"},{"referenceType":"HasProperty","target":"ns=1;i=12995"},{"referenceType":"HasComponent","target":"ns=1;i=10781"},{"referenceType":"HasProperty","target":"ns=1;i=10784"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10785"},{"referenceType":"HasComponent","target":"ns=1;i=10788"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=10790"},{"referenceType":"HasProperty","target":"ns=1;i=10791"},{"referenceType":"HasProperty","target":"ns=1;i=10792"},{"referenceType":"HasComponent","target":"ns=1;i=10793"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10776","parentNodeId":"ns=1;i=5157","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5157"},{"referenceType":"HasProperty","target":"ns=1;i=10777"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10777","parentNodeId":"ns=1;i=10776","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10776"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10778","parentNodeId":"ns=1;i=5157","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5157"},{"referenceType":"HasProperty","target":"ns=1;i=10779"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10780"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10779","parentNodeId":"ns=1;i=10778","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10778"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10780","parentNodeId":"ns=1;i=10778","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10778"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12995","parentNodeId":"ns=1;i=5157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10781","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasProperty","target":"ns=1;i=10782"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5157"},{"referenceType":"HasProperty","target":"ns=1;i=10783"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10782","parentNodeId":"ns=1;i=10781","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10781"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10783","parentNodeId":"ns=1;i=10781","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10781"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10784","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5157"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10785","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasProperty","target":"ns=1;i=10786"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10787"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5157"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10786","parentNodeId":"ns=1;i=10785","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10785"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10787","parentNodeId":"ns=1;i=10785","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10785"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10788","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasProperty","target":"ns=1;i=10789"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5157"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10789","parentNodeId":"ns=1;i=10788","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10788"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10790","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5157"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10791","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5157"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10792","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5157"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10793","parentNodeId":"ns=1;i=5157","references":[{"referenceType":"HasProperty","target":"ns=1;i=10794"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5157"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10794","parentNodeId":"ns=1;i=10793","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10793"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:SingleLineDiagramLink","dataType":"String","description":[{"value":"Overall power distribution diagram (electrical, pneumatic, hydraulic). This kind of diagram includes switchboard circuits."}],"displayName":[{"value":"SingleLineDiagramLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10795","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13021"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13021","parentNodeId":"ns=1;i=10795","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10795"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:SparePartReference","description":[{"value":"List of all spare parts used within the scope of the work order"}],"displayName":[{"value":"SparePartReference"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5158","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10796"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10798"},{"referenceType":"HasProperty","target":"ns=1;i=13004"},{"referenceType":"HasComponent","target":"ns=1;i=10801"},{"referenceType":"HasProperty","target":"ns=1;i=10804"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10805"},{"referenceType":"HasComponent","target":"ns=1;i=10808"},{"referenceType":"HasProperty","target":"ns=1;i=10810"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=10811"},{"referenceType":"HasProperty","target":"ns=1;i=10812"},{"referenceType":"HasComponent","target":"ns=1;i=10813"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10796","parentNodeId":"ns=1;i=5158","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5158"},{"referenceType":"HasProperty","target":"ns=1;i=10797"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10797","parentNodeId":"ns=1;i=10796","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10796"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10798","parentNodeId":"ns=1;i=5158","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5158"},{"referenceType":"HasProperty","target":"ns=1;i=10799"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10800"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10799","parentNodeId":"ns=1;i=10798","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10798"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10800","parentNodeId":"ns=1;i=10798","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10798"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13004","parentNodeId":"ns=1;i=5158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5158"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10801","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasProperty","target":"ns=1;i=10802"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5158"},{"referenceType":"HasProperty","target":"ns=1;i=10803"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10802","parentNodeId":"ns=1;i=10801","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10801"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10803","parentNodeId":"ns=1;i=10801","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10801"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10804","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5158"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10805","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasProperty","target":"ns=1;i=10806"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10807"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5158"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10806","parentNodeId":"ns=1;i=10805","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10805"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10807","parentNodeId":"ns=1;i=10805","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10805"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10808","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasProperty","target":"ns=1;i=10809"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5158"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10809","parentNodeId":"ns=1;i=10808","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10808"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10810","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5158"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10811","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5158"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10812","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5158"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10813","parentNodeId":"ns=1;i=5158","references":[{"referenceType":"HasProperty","target":"ns=1;i=10814"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5158"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10814","parentNodeId":"ns=1;i=10813","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10813"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:SparePartReferenceLink","dataType":"String","description":[{"value":"List of all spare parts used within the scope of the work order"}],"displayName":[{"value":"SparePartReferenceLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10815","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13022"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13022","parentNodeId":"ns=1;i=10815","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10815"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Staff","description":[{"value":"List of all maintenance workers involved in the execution of the work order"}],"displayName":[{"value":"Staff"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5159","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10816"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10818"},{"referenceType":"HasProperty","target":"ns=1;i=13001"},{"referenceType":"HasComponent","target":"ns=1;i=10821"},{"referenceType":"HasProperty","target":"ns=1;i=10824"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10825"},{"referenceType":"HasComponent","target":"ns=1;i=10828"},{"referenceType":"HasProperty","target":"ns=1;i=10830"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=10831"},{"referenceType":"HasProperty","target":"ns=1;i=10832"},{"referenceType":"HasComponent","target":"ns=1;i=10833"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10816","parentNodeId":"ns=1;i=5159","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5159"},{"referenceType":"HasProperty","target":"ns=1;i=10817"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10817","parentNodeId":"ns=1;i=10816","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10816"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10818","parentNodeId":"ns=1;i=5159","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5159"},{"referenceType":"HasProperty","target":"ns=1;i=10819"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10820"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10819","parentNodeId":"ns=1;i=10818","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10818"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10820","parentNodeId":"ns=1;i=10818","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10818"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13001","parentNodeId":"ns=1;i=5159","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5159"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10821","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasProperty","target":"ns=1;i=10822"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5159"},{"referenceType":"HasProperty","target":"ns=1;i=10823"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10822","parentNodeId":"ns=1;i=10821","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10821"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10823","parentNodeId":"ns=1;i=10821","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10821"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10824","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5159"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10825","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasProperty","target":"ns=1;i=10826"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10827"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5159"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10826","parentNodeId":"ns=1;i=10825","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10825"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10827","parentNodeId":"ns=1;i=10825","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10825"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10828","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasProperty","target":"ns=1;i=10829"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5159"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10829","parentNodeId":"ns=1;i=10828","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10828"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10830","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5159"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10831","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5159"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10832","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5159"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10833","parentNodeId":"ns=1;i=5159","references":[{"referenceType":"HasProperty","target":"ns=1;i=10834"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5159"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10834","parentNodeId":"ns=1;i=10833","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10833"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:StaffLink","dataType":"String","description":[{"value":"List of all maintenance workers involved in the execution of the work order"}],"displayName":[{"value":"StaffLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10835","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13023"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13023","parentNodeId":"ns=1;i=10835","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10835"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TechnicalData","description":[{"value":"Manufacturer\u0060s specification of the item."}],"displayName":[{"value":"TechnicalData"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5160","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10836"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10838"},{"referenceType":"HasProperty","target":"ns=1;i=12996"},{"referenceType":"HasComponent","target":"ns=1;i=10841"},{"referenceType":"HasProperty","target":"ns=1;i=10844"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10845"},{"referenceType":"HasComponent","target":"ns=1;i=10848"},{"referenceType":"HasProperty","target":"ns=1;i=10850"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=10851"},{"referenceType":"HasProperty","target":"ns=1;i=10852"},{"referenceType":"HasComponent","target":"ns=1;i=10853"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10836","parentNodeId":"ns=1;i=5160","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5160"},{"referenceType":"HasProperty","target":"ns=1;i=10837"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10837","parentNodeId":"ns=1;i=10836","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10836"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10838","parentNodeId":"ns=1;i=5160","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5160"},{"referenceType":"HasProperty","target":"ns=1;i=10839"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10840"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10839","parentNodeId":"ns=1;i=10838","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10838"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10840","parentNodeId":"ns=1;i=10838","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10838"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12996","parentNodeId":"ns=1;i=5160","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5160"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10841","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasProperty","target":"ns=1;i=10842"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5160"},{"referenceType":"HasProperty","target":"ns=1;i=10843"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10842","parentNodeId":"ns=1;i=10841","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10841"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10843","parentNodeId":"ns=1;i=10841","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10841"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10844","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5160"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10845","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasProperty","target":"ns=1;i=10846"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10847"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5160"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10846","parentNodeId":"ns=1;i=10845","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10845"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10847","parentNodeId":"ns=1;i=10845","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10845"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10848","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasProperty","target":"ns=1;i=10849"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5160"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10849","parentNodeId":"ns=1;i=10848","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10848"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10850","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5160"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10851","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5160"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10852","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5160"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10853","parentNodeId":"ns=1;i=5160","references":[{"referenceType":"HasProperty","target":"ns=1;i=10854"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5160"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10854","parentNodeId":"ns=1;i=10853","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10853"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:TechnicalDataLink","dataType":"String","description":[{"value":"Manufacturer\u0060s specification of the item."}],"displayName":[{"value":"TechnicalDataLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10855","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13024"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13024","parentNodeId":"ns=1;i=10855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TestProgramReport","description":[{"value":"Commissioning report which demonstrates that an item is in compliance with specifications."}],"displayName":[{"value":"TestProgramReport"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5161","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10856"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10858"},{"referenceType":"HasProperty","target":"ns=1;i=12997"},{"referenceType":"HasComponent","target":"ns=1;i=10861"},{"referenceType":"HasProperty","target":"ns=1;i=10864"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10865"},{"referenceType":"HasComponent","target":"ns=1;i=10868"},{"referenceType":"HasProperty","target":"ns=1;i=10870"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=10871"},{"referenceType":"HasProperty","target":"ns=1;i=10872"},{"referenceType":"HasComponent","target":"ns=1;i=10873"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10856","parentNodeId":"ns=1;i=5161","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5161"},{"referenceType":"HasProperty","target":"ns=1;i=10857"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10857","parentNodeId":"ns=1;i=10856","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10856"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10858","parentNodeId":"ns=1;i=5161","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5161"},{"referenceType":"HasProperty","target":"ns=1;i=10859"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10860"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10859","parentNodeId":"ns=1;i=10858","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10858"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10860","parentNodeId":"ns=1;i=10858","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10858"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12997","parentNodeId":"ns=1;i=5161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10861","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasProperty","target":"ns=1;i=10862"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5161"},{"referenceType":"HasProperty","target":"ns=1;i=10863"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10862","parentNodeId":"ns=1;i=10861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10861"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10863","parentNodeId":"ns=1;i=10861","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10861"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10864","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5161"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10865","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasProperty","target":"ns=1;i=10866"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10867"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5161"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10866","parentNodeId":"ns=1;i=10865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10865"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10867","parentNodeId":"ns=1;i=10865","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10865"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10868","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasProperty","target":"ns=1;i=10869"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5161"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10869","parentNodeId":"ns=1;i=10868","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10868"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10870","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5161"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10871","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5161"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10872","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5161"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10873","parentNodeId":"ns=1;i=5161","references":[{"referenceType":"HasProperty","target":"ns=1;i=10874"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5161"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10874","parentNodeId":"ns=1;i=10873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10873"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:TestProgramReportLink","dataType":"String","description":[{"value":"Commissioning report which demonstrates that an item is in compliance with specifications."}],"displayName":[{"value":"TestProgramReportLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10875","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13025"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13025","parentNodeId":"ns=1;i=10875","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10875"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:UnitMaintenanceReport","description":[{"value":"List of work orders for a particular unit. The list is created for a specified period of time"}],"displayName":[{"value":"UnitMaintenanceReport"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5162","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasComponent","target":"ns=1;i=10876"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=10878"},{"referenceType":"HasProperty","target":"ns=1;i=12998"},{"referenceType":"HasComponent","target":"ns=1;i=10881"},{"referenceType":"HasProperty","target":"ns=1;i=10884"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10885"},{"referenceType":"HasComponent","target":"ns=1;i=10888"},{"referenceType":"HasProperty","target":"ns=1;i=10890"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"},{"referenceType":"HasProperty","target":"ns=1;i=10891"},{"referenceType":"HasProperty","target":"ns=1;i=10892"},{"referenceType":"HasComponent","target":"ns=1;i=10893"}],"typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10876","parentNodeId":"ns=1;i=5162","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5162"},{"referenceType":"HasProperty","target":"ns=1;i=10877"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10877","parentNodeId":"ns=1;i=10876","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10876"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10878","parentNodeId":"ns=1;i=5162","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5162"},{"referenceType":"HasProperty","target":"ns=1;i=10879"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10880"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10879","parentNodeId":"ns=1;i=10878","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10878"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10880","parentNodeId":"ns=1;i=10878","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10878"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12998","parentNodeId":"ns=1;i=5162","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5162"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10881","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasProperty","target":"ns=1;i=10882"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5162"},{"referenceType":"HasProperty","target":"ns=1;i=10883"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10882","parentNodeId":"ns=1;i=10881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10881"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10883","parentNodeId":"ns=1;i=10881","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10881"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10884","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5162"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10885","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasProperty","target":"ns=1;i=10886"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=10887"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5162"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10886","parentNodeId":"ns=1;i=10885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10885"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10887","parentNodeId":"ns=1;i=10885","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10885"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10888","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasProperty","target":"ns=1;i=10889"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5162"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10889","parentNodeId":"ns=1;i=10888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10888"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10890","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5162"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10891","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5162"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10892","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5162"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=10893","parentNodeId":"ns=1;i=5162","references":[{"referenceType":"HasProperty","target":"ns=1;i=10894"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5162"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10894","parentNodeId":"ns=1;i=10893","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10893"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"1:UnitMaintenanceReportLink","dataType":"String","description":[{"value":"List of work orders for a particular unit. The list is created for a specified period of time"}],"displayName":[{"value":"UnitMaintenanceReportLink"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10895","parentNodeId":"ns=1;i=5119","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13026"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5119"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13026","parentNodeId":"ns=1;i=10895","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10895"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Events","description":[{"value":"States, alarms, and conditions of a pump."}],"displayName":[{"value":"Events"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5117","parentNodeId":"ns=1;i=1052","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1019"}],"typeDefinition":"ns=1;i=1019"},{"browseName":"1:SupervisionAuxiliaryDevice","description":[{"value":"Supervision auxiliary device specifies information for monitoring an additional device."}],"displayName":[{"value":"SupervisionAuxiliaryDevice"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5055","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=9870"},{"referenceType":"HasComponent","target":"ns=1;i=9873"},{"referenceType":"HasComponent","target":"ns=1;i=9876"},{"referenceType":"HasComponent","target":"ns=1;i=9879"},{"referenceType":"HasComponent","target":"ns=1;i=9882"},{"referenceType":"HasComponent","target":"ns=1;i=9885"},{"referenceType":"HasComponent","target":"ns=1;i=9888"},{"referenceType":"HasComponent","target":"ns=1;i=9891"},{"referenceType":"HasComponent","target":"ns=1;i=9894"},{"referenceType":"HasComponent","target":"ns=1;i=9897"},{"referenceType":"HasComponent","target":"ns=1;i=9900"},{"referenceType":"HasComponent","target":"ns=1;i=9903"},{"referenceType":"HasComponent","target":"ns=1;i=9906"},{"referenceType":"HasComponent","target":"ns=1;i=9909"},{"referenceType":"HasComponent","target":"ns=1;i=9912"},{"referenceType":"HasComponent","target":"ns=1;i=9915"},{"referenceType":"HasComponent","target":"ns=1;i=9918"},{"referenceType":"HasComponent","target":"ns=1;i=9921"},{"referenceType":"HasComponent","target":"ns=1;i=9924"},{"referenceType":"HasComponent","target":"ns=1;i=9927"},{"referenceType":"HasComponent","target":"ns=1;i=9930"},{"referenceType":"HasComponent","target":"ns=1;i=9933"},{"referenceType":"HasComponent","target":"ns=1;i=9936"},{"referenceType":"HasComponent","target":"ns=1;i=9939"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9943"},{"referenceType":"HasComponent","target":"ns=1;i=9946"},{"referenceType":"HasComponent","target":"ns=1;i=9949"},{"referenceType":"HasComponent","target":"ns=1;i=9952"},{"referenceType":"HasComponent","target":"ns=1;i=9955"},{"referenceType":"HasComponent","target":"ns=1;i=9958"},{"referenceType":"HasComponent","target":"ns=1;i=9961"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1017"},{"referenceType":"HasComponent","target":"ns=1;i=9964"},{"referenceType":"HasComponent","target":"ns=1;i=9967"},{"referenceType":"HasComponent","target":"ns=1;i=9970"},{"referenceType":"HasComponent","target":"ns=1;i=9973"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"}],"typeDefinition":"ns=1;i=1017"},{"accessLevel":5,"browseName":"1:ActuatorElement","dataType":"Boolean","description":[{"value":"This property indicates a fault in an actuator element."}],"displayName":[{"value":"ActuatorElement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9870","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12235"},{"referenceType":"HasProperty","target":"ns=1;i=9871"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9872"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12235","parentNodeId":"ns=1;i=9870","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9870"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9871","parentNodeId":"ns=1;i=9870","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9870"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9872","parentNodeId":"ns=1;i=9870","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9870"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AmbientTemperature","dataType":"Boolean","description":[{"value":"This property indicates an abnormal ambient temperature."}],"displayName":[{"value":"AmbientTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9873","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12236"},{"referenceType":"HasProperty","target":"ns=1;i=9874"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9875"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12236","parentNodeId":"ns=1;i=9873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9874","parentNodeId":"ns=1;i=9873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9873"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9875","parentNodeId":"ns=1;i=9873","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9873"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryDeviceFault","dataType":"Boolean","description":[{"value":"This property indicates a generic failure of an auxiliary device."}],"displayName":[{"value":"AuxiliaryDeviceFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9876","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12238"},{"referenceType":"HasProperty","target":"ns=1;i=9877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9878"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12238","parentNodeId":"ns=1;i=9876","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9876"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9877","parentNodeId":"ns=1;i=9876","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9876"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9878","parentNodeId":"ns=1;i=9876","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9876"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryMediumAbsence","dataType":"Boolean","description":[{"value":"This property indicates an absence of or wrong auxiliary medium."}],"displayName":[{"value":"AuxiliaryMediumAbsence"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9879","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12239"},{"referenceType":"HasProperty","target":"ns=1;i=9880"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9881"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12239","parentNodeId":"ns=1;i=9879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9879"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9880","parentNodeId":"ns=1;i=9879","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9879"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9881","parentNodeId":"ns=1;i=9879","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9879"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryMediumInsufficiency","dataType":"Boolean","description":[{"value":"This property indicates an insufficiency of auxiliary medium."}],"displayName":[{"value":"AuxiliaryMediumInsufficiency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9882","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12241"},{"referenceType":"HasProperty","target":"ns=1;i=9883"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9884"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12241","parentNodeId":"ns=1;i=9882","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9882"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9883","parentNodeId":"ns=1;i=9882","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9882"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9884","parentNodeId":"ns=1;i=9882","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9882"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryPowerPole","dataType":"Boolean","description":[{"value":"This property indicates an auxiliary power supply wrongly poled."}],"displayName":[{"value":"AuxiliaryPowerPole"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9885","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12242"},{"referenceType":"HasProperty","target":"ns=1;i=9886"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9887"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12242","parentNodeId":"ns=1;i=9885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9885"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9886","parentNodeId":"ns=1;i=9885","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9885"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9887","parentNodeId":"ns=1;i=9885","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9885"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AuxiliaryPowerRange","dataType":"Boolean","description":[{"value":"This property indicates an off-spec of the auxiliary power range."}],"displayName":[{"value":"AuxiliaryPowerRange"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9888","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12244"},{"referenceType":"HasProperty","target":"ns=1;i=9889"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9890"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12244","parentNodeId":"ns=1;i=9888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9888"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9889","parentNodeId":"ns=1;i=9888","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9888"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9890","parentNodeId":"ns=1;i=9888","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9888"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CommunicationError","dataType":"Boolean","description":[{"value":"This property indicates a communication error."}],"displayName":[{"value":"CommunicationError"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9891","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12245"},{"referenceType":"HasProperty","target":"ns=1;i=9892"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9893"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12245","parentNodeId":"ns=1;i=9891","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9891"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9892","parentNodeId":"ns=1;i=9891","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9891"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9893","parentNodeId":"ns=1;i=9891","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9891"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Corrosion","dataType":"Boolean","description":[{"value":"This property indicates corrosion/abrasion in parts in contact with medium."}],"displayName":[{"value":"Corrosion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9894","parentNodeId":"ns=1;i=5055","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=12247"},{"referenceType":"HasProperty","target":"ns=1;i=9895"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9896"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12247","parentNodeId":"ns=1;i=9894","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9894"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9895","parentNodeId":"ns=1;i=9894","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9894"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9896","parentNodeId":"ns=1;i=9894","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9894"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Deviation","dataType":"Boolean","description":[{"value":"This property indicates an inadmissible deviation from measurement."}],"displayName":[{"value":"Deviation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9897","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12248"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9898"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9899"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12248","parentNodeId":"ns=1;i=9897","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9897"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9898","parentNodeId":"ns=1;i=9897","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9897"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9899","parentNodeId":"ns=1;i=9897","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9897"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectromagneticInterference","dataType":"Boolean","description":[{"value":"This property indicates an abnormal electromagnetic interference."}],"displayName":[{"value":"ElectromagneticInterference"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9900","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12250"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9901"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9902"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12250","parentNodeId":"ns=1;i=9900","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9900"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9901","parentNodeId":"ns=1;i=9900","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9900"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9902","parentNodeId":"ns=1;i=9900","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9900"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectronicFault","dataType":"Boolean","description":[{"value":"This property indicates a fault in the device electronics."}],"displayName":[{"value":"ElectronicFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9903","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12251"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9904"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9905"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12251","parentNodeId":"ns=1;i=9903","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9903"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9904","parentNodeId":"ns=1;i=9903","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9903"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9905","parentNodeId":"ns=1;i=9903","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9903"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:EnergySupply","dataType":"Boolean","description":[{"value":"This property indicates an error in internal energy supply."}],"displayName":[{"value":"EnergySupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9906","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12253"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9907"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9908"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12253","parentNodeId":"ns=1;i=9906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9907","parentNodeId":"ns=1;i=9906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9906"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9908","parentNodeId":"ns=1;i=9906","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9906"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:EvaluationElectronics","dataType":"Boolean","description":[{"value":"This property indicates an error in evaluation electronics."}],"displayName":[{"value":"EvaluationElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9909","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12254"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9910"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9911"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12254","parentNodeId":"ns=1;i=9909","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9909"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9910","parentNodeId":"ns=1;i=9909","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9909"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9911","parentNodeId":"ns=1;i=9909","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9909"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ExciterError","dataType":"Boolean","description":[{"value":"This property indicates an error in the exciter of the sensor element."}],"displayName":[{"value":"ExciterError"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9912","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12256"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9913"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9914"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12256","parentNodeId":"ns=1;i=9912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9912"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9913","parentNodeId":"ns=1;i=9912","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9912"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9914","parentNodeId":"ns=1;i=9912","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9912"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Fouling","dataType":"Boolean","description":[{"value":"This property indicates a fouling on sensor element."}],"displayName":[{"value":"Fouling"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9915","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12257"},{"referenceType":"HasProperty","target":"ns=1;i=9916"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9917"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12257","parentNodeId":"ns=1;i=9915","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9915"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9916","parentNodeId":"ns=1;i=9915","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9915"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9917","parentNodeId":"ns=1;i=9915","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9915"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:HumidityElectronics","dataType":"Boolean","description":[{"value":"This property indicates an abnormal amount of humidity in electronics area."}],"displayName":[{"value":"HumidityElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9918","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12259"},{"referenceType":"HasProperty","target":"ns=1;i=9919"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9920"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12259","parentNodeId":"ns=1;i=9918","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9918"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9919","parentNodeId":"ns=1;i=9918","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9918"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9920","parentNodeId":"ns=1;i=9918","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9918"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Installation","dataType":"Boolean","description":[{"value":"This property indicates an installation fault."}],"displayName":[{"value":"Installation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9921","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12260"},{"referenceType":"HasProperty","target":"ns=1;i=9922"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9923"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12260","parentNodeId":"ns=1;i=9921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9922","parentNodeId":"ns=1;i=9921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9921"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9923","parentNodeId":"ns=1;i=9921","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9921"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Interruption","dataType":"Boolean","description":[{"value":"This property indicates an interruption of signal path or short circuit."}],"displayName":[{"value":"Interruption"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9924","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12262"},{"referenceType":"HasProperty","target":"ns=1;i=9925"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9926"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12262","parentNodeId":"ns=1;i=9924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9925","parentNodeId":"ns=1;i=9924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9924"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9926","parentNodeId":"ns=1;i=9924","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9924"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:LineLength","dataType":"Boolean","description":[{"value":"This property indicates that the maximum line length is exceeded."}],"displayName":[{"value":"LineLength"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9927","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12263"},{"referenceType":"HasProperty","target":"ns=1;i=9928"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9929"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12263","parentNodeId":"ns=1;i=9927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9928","parentNodeId":"ns=1;i=9927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9927"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9929","parentNodeId":"ns=1;i=9927","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9927"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaterialElectronics","dataType":"Boolean","description":[{"value":"This property indicates a foreign material in electronics area."}],"displayName":[{"value":"MaterialElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9930","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12265"},{"referenceType":"HasProperty","target":"ns=1;i=9931"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9932"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12265","parentNodeId":"ns=1;i=9930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9931","parentNodeId":"ns=1;i=9930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9930"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9932","parentNodeId":"ns=1;i=9930","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9930"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MeasuredMaterialElectronics","dataType":"Boolean","description":[{"value":"This property indicates measured material in electronics area."}],"displayName":[{"value":"MeasuredMaterialElectronics"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9933","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12266"},{"referenceType":"HasProperty","target":"ns=1;i=9934"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9935"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12266","parentNodeId":"ns=1;i=9933","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9933"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9934","parentNodeId":"ns=1;i=9933","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9933"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9935","parentNodeId":"ns=1;i=9933","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9933"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MechanicalDamage","dataType":"Boolean","description":[{"value":"This property indicates a mechanical damage."}],"displayName":[{"value":"MechanicalDamage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9936","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12268"},{"referenceType":"HasProperty","target":"ns=1;i=9937"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9938"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12268","parentNodeId":"ns=1;i=9936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9937","parentNodeId":"ns=1;i=9936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9936"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9938","parentNodeId":"ns=1;i=9936","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9936"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OperatingConditions","dataType":"Boolean","description":[{"value":"This property indicates a fault due to non-compliance with specified operating conditions."}],"displayName":[{"value":"OperatingConditions"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9939","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12269"},{"referenceType":"HasProperty","target":"ns=1;i=9941"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9942"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12269","parentNodeId":"ns=1;i=9939","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9939"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9941","parentNodeId":"ns=1;i=9939","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9939"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9942","parentNodeId":"ns=1;i=9939","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9939"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Other","dataType":"Boolean","description":[{"value":"This property indicates other faults."}],"displayName":[{"value":"Other"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9943","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12271"},{"referenceType":"HasProperty","target":"ns=1;i=9944"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9945"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12271","parentNodeId":"ns=1;i=9943","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9943"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9944","parentNodeId":"ns=1;i=9943","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9943"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9945","parentNodeId":"ns=1;i=9943","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9943"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Overloading","dataType":"Boolean","description":[{"value":"This property indicates an overloading."}],"displayName":[{"value":"Overloading"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9946","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12272"},{"referenceType":"HasProperty","target":"ns=1;i=9947"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9948"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12272","parentNodeId":"ns=1;i=9946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9947","parentNodeId":"ns=1;i=9946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9946"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9948","parentNodeId":"ns=1;i=9946","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9946"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ParameterSetting","dataType":"Boolean","description":[{"value":"This property indicates a parameter setting error."}],"displayName":[{"value":"ParameterSetting"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9949","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12274"},{"referenceType":"HasProperty","target":"ns=1;i=9950"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9951"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12274","parentNodeId":"ns=1;i=9949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9950","parentNodeId":"ns=1;i=9949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9949"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9951","parentNodeId":"ns=1;i=9949","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9949"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Peripheral","dataType":"Boolean","description":[{"value":"This property indicates an error in peripherals."}],"displayName":[{"value":"Peripheral"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9952","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12275"},{"referenceType":"HasProperty","target":"ns=1;i=9953"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9954"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12275","parentNodeId":"ns=1;i=9952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9953","parentNodeId":"ns=1;i=9952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9952"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9954","parentNodeId":"ns=1;i=9952","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9952"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ProcessInfluence","dataType":"Boolean","description":[{"value":"This property indicates a fault due to process influence."}],"displayName":[{"value":"ProcessInfluence"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9955","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12277"},{"referenceType":"HasProperty","target":"ns=1;i=9956"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9957"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12277","parentNodeId":"ns=1;i=9955","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9955"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9956","parentNodeId":"ns=1;i=9955","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9955"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9957","parentNodeId":"ns=1;i=9955","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9955"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SensorElement","dataType":"Boolean","description":[{"value":"This property indicates a fault in a sensor element."}],"displayName":[{"value":"SensorElement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9958","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12278"},{"referenceType":"HasProperty","target":"ns=1;i=9959"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9960"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12278","parentNodeId":"ns=1;i=9958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9959","parentNodeId":"ns=1;i=9958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9958"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9960","parentNodeId":"ns=1;i=9958","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9958"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:StartUp","dataType":"Boolean","description":[{"value":"This property indicate an installation fault or fault during start-up."}],"displayName":[{"value":"StartUp"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9961","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12280"},{"referenceType":"HasProperty","target":"ns=1;i=9962"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9963"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12280","parentNodeId":"ns=1;i=9961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9962","parentNodeId":"ns=1;i=9961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9961"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9963","parentNodeId":"ns=1;i=9961","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9961"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TemperatureShock","dataType":"Boolean","description":[{"value":"This property indicates an excessive temperature shock."}],"displayName":[{"value":"TemperatureShock"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9964","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12281"},{"referenceType":"HasProperty","target":"ns=1;i=9965"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"},{"referenceType":"HasProperty","target":"ns=1;i=9966"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12281","parentNodeId":"ns=1;i=9964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9964"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9965","parentNodeId":"ns=1;i=9964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9964"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9966","parentNodeId":"ns=1;i=9964","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9964"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Vibration","dataType":"Boolean","description":[{"value":"This property indicates an excessive vibration or impact load."}],"displayName":[{"value":"Vibration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9967","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12283"},{"referenceType":"HasProperty","target":"ns=1;i=9968"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9969"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12283","parentNodeId":"ns=1;i=9967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9968","parentNodeId":"ns=1;i=9967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9967"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9969","parentNodeId":"ns=1;i=9967","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9967"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveOperation","dataType":"Boolean","description":[{"value":"This property indicates that the wear reserve is used up by operation."}],"displayName":[{"value":"WearReserveOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9970","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12284"},{"referenceType":"HasProperty","target":"ns=1;i=9971"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9972"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12284","parentNodeId":"ns=1;i=9970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9970"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9971","parentNodeId":"ns=1;i=9970","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9970"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9972","parentNodeId":"ns=1;i=9970","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9970"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveWear","dataType":"Boolean","description":[{"value":"This property indicates that the wear reserve is used up by wear."}],"displayName":[{"value":"WearReserveWear"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9973","parentNodeId":"ns=1;i=5055","references":[{"referenceType":"HasProperty","target":"ns=1;i=12286"},{"referenceType":"HasProperty","target":"ns=1;i=9974"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9975"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5055"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12286","parentNodeId":"ns=1;i=9973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9974","parentNodeId":"ns=1;i=9973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9973"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9975","parentNodeId":"ns=1;i=9973","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9973"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionElectronics","description":[{"value":"Supervision Electrics specifies information for monitoring the electronics."}],"displayName":[{"value":"SupervisionElectronics"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5056","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=9976"},{"referenceType":"HasComponent","target":"ns=1;i=9979"},{"referenceType":"HasComponent","target":"ns=1;i=9982"},{"referenceType":"HasComponent","target":"ns=1;i=9985"},{"referenceType":"HasComponent","target":"ns=1;i=9988"},{"referenceType":"HasComponent","target":"ns=1;i=9991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=9994"},{"referenceType":"HasComponent","target":"ns=1;i=9997"},{"referenceType":"HasComponent","target":"ns=1;i=10000"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1018"},{"referenceType":"HasComponent","target":"ns=1;i=10003"},{"referenceType":"HasComponent","target":"ns=1;i=10006"},{"referenceType":"HasComponent","target":"ns=1;i=10009"},{"referenceType":"HasComponent","target":"ns=1;i=10012"},{"referenceType":"HasComponent","target":"ns=1;i=10015"},{"referenceType":"HasComponent","target":"ns=1;i=10018"},{"referenceType":"HasComponent","target":"ns=1;i=10021"},{"referenceType":"HasComponent","target":"ns=1;i=10024"},{"referenceType":"HasComponent","target":"ns=1;i=10027"},{"referenceType":"HasComponent","target":"ns=1;i=10030"},{"referenceType":"HasComponent","target":"ns=1;i=10033"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"}],"typeDefinition":"ns=1;i=1018"},{"accessLevel":5,"browseName":"1:ArmatureCircuit","dataType":"Boolean","description":[{"value":"This property indicates a failure in armature circuit."}],"displayName":[{"value":"ArmatureCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9976","parentNodeId":"ns=1;i=5056","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=12287"},{"referenceType":"HasProperty","target":"ns=1;i=9977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9978"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12287","parentNodeId":"ns=1;i=9976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9976"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9977","parentNodeId":"ns=1;i=9976","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9976"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9978","parentNodeId":"ns=1;i=9976","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9976"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CurrentInsideDevice","dataType":"Boolean","description":[{"value":"This property indicates unacceptable current inside the device."}],"displayName":[{"value":"CurrentInsideDevice"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9979","parentNodeId":"ns=1;i=5056","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=12289"},{"referenceType":"HasProperty","target":"ns=1;i=9980"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9981"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12289","parentNodeId":"ns=1;i=9979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9980","parentNodeId":"ns=1;i=9979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9979"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9981","parentNodeId":"ns=1;i=9979","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9979"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ElectricalFault","dataType":"Boolean","description":[{"value":"This property indicates a generic electrical fault."}],"displayName":[{"value":"ElectricalFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9982","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12290"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=9983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9984"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12290","parentNodeId":"ns=1;i=9982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9982"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9983","parentNodeId":"ns=1;i=9982","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9982"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9984","parentNodeId":"ns=1;i=9982","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9982"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:FieldCircuit","dataType":"Boolean","description":[{"value":"This property indicates a failure in field circuit."}],"displayName":[{"value":"FieldCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9985","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12292"},{"referenceType":"HasProperty","target":"ns=1;i=9986"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9987"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12292","parentNodeId":"ns=1;i=9985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9985"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9986","parentNodeId":"ns=1;i=9985","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9985"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9987","parentNodeId":"ns=1;i=9985","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9985"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:InstallationFault","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable electrical installation, e.g. mixed up phases."}],"displayName":[{"value":"InstallationFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9988","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12293"},{"referenceType":"HasProperty","target":"ns=1;i=9989"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9990"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12293","parentNodeId":"ns=1;i=9988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9988"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9989","parentNodeId":"ns=1;i=9988","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9988"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9990","parentNodeId":"ns=1;i=9988","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9988"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:InsulationResistance","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable low winding resistance."}],"displayName":[{"value":"InsulationResistance"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9991","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12295"},{"referenceType":"HasProperty","target":"ns=1;i=9992"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=9993"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12295","parentNodeId":"ns=1;i=9991","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9992","parentNodeId":"ns=1;i=9991","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9991"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9993","parentNodeId":"ns=1;i=9991","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9991"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PhaseFailure","dataType":"Boolean","description":[{"value":"This property indicates a phase failure."}],"displayName":[{"value":"PhaseFailure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9994","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12296"},{"referenceType":"HasProperty","target":"ns=1;i=9995"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=9996"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12296","parentNodeId":"ns=1;i=9994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9994"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9995","parentNodeId":"ns=1;i=9994","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9994"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9996","parentNodeId":"ns=1;i=9994","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9994"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ShortCircuit","dataType":"Boolean","description":[{"value":"This property indicates a short circuit."}],"displayName":[{"value":"ShortCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9997","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12298"},{"referenceType":"HasProperty","target":"ns=1;i=9998"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=9999"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12298","parentNodeId":"ns=1;i=9997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9998","parentNodeId":"ns=1;i=9997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9997"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9999","parentNodeId":"ns=1;i=9997","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=9997"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ShortToEarth","dataType":"Boolean","description":[{"value":"This property indicates a short to earth."}],"displayName":[{"value":"ShortToEarth"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10000","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12299"},{"referenceType":"HasProperty","target":"ns=1;i=10001"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10002"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12299","parentNodeId":"ns=1;i=10000","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10000"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10001","parentNodeId":"ns=1;i=10000","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10000"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10002","parentNodeId":"ns=1;i=10000","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10000"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrent","dataType":"Boolean","description":[{"value":"This property indicates a failure of supply current."}],"displayName":[{"value":"SupplyCurrent"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10003","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12301"},{"referenceType":"HasProperty","target":"ns=1;i=10004"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10005"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12301","parentNodeId":"ns=1;i=10003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10004","parentNodeId":"ns=1;i=10003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10003"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10005","parentNodeId":"ns=1;i=10003","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10003"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrentHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply current."}],"displayName":[{"value":"SupplyCurrentHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10006","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12302"},{"referenceType":"HasProperty","target":"ns=1;i=10007"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10008"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12302","parentNodeId":"ns=1;i=10006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10007","parentNodeId":"ns=1;i=10006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10006"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10008","parentNodeId":"ns=1;i=10006","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10006"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyCurrentLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply current."}],"displayName":[{"value":"SupplyCurrentLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10009","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12304"},{"referenceType":"HasProperty","target":"ns=1;i=10010"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10011"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12304","parentNodeId":"ns=1;i=10009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10010","parentNodeId":"ns=1;i=10009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10009"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10011","parentNodeId":"ns=1;i=10009","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10009"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequency","dataType":"Boolean","description":[{"value":"This property indicates unacceptable supply frequency."}],"displayName":[{"value":"SupplyFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10012","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12305"},{"referenceType":"HasProperty","target":"ns=1;i=10013"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10014"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12305","parentNodeId":"ns=1;i=10012","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10012"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10013","parentNodeId":"ns=1;i=10012","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10012"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10014","parentNodeId":"ns=1;i=10012","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10012"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequencyHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply frequency."}],"displayName":[{"value":"SupplyFrequencyHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10015","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12307"},{"referenceType":"HasProperty","target":"ns=1;i=10016"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10017"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12307","parentNodeId":"ns=1;i=10015","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10016","parentNodeId":"ns=1;i=10015","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10015"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10017","parentNodeId":"ns=1;i=10015","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10015"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyFrequencyLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply frequency."}],"displayName":[{"value":"SupplyFrequencyLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10018","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12308"},{"referenceType":"HasProperty","target":"ns=1;i=10019"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10020"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12308","parentNodeId":"ns=1;i=10018","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10019","parentNodeId":"ns=1;i=10018","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10018"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10020","parentNodeId":"ns=1;i=10018","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10018"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltage","dataType":"Boolean","description":[{"value":"This property indicates a failure of supply voltage."}],"displayName":[{"value":"SupplyVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10021","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12310"},{"referenceType":"HasProperty","target":"ns=1;i=10022"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10023"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12310","parentNodeId":"ns=1;i=10021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10022","parentNodeId":"ns=1;i=10021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10021"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10023","parentNodeId":"ns=1;i=10021","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10021"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltageHigh","dataType":"Boolean","description":[{"value":"This property indicates too high supply voltage."}],"displayName":[{"value":"SupplyVoltageHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10024","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12311"},{"referenceType":"HasProperty","target":"ns=1;i=10025"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10026"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12311","parentNodeId":"ns=1;i=10024","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10024"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10025","parentNodeId":"ns=1;i=10024","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10024"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10026","parentNodeId":"ns=1;i=10024","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10024"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SupplyVoltageLow","dataType":"Boolean","description":[{"value":"This property indicates too low supply voltage."}],"displayName":[{"value":"SupplyVoltageLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10027","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12313"},{"referenceType":"HasProperty","target":"ns=1;i=10028"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"},{"referenceType":"HasProperty","target":"ns=1;i=10029"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12313","parentNodeId":"ns=1;i=10027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10027"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10028","parentNodeId":"ns=1;i=10027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10027"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10029","parentNodeId":"ns=1;i=10027","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10027"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VoltageInsideDevice","dataType":"Boolean","description":[{"value":"This property indicates unacceptable voltage inside the device."}],"displayName":[{"value":"VoltageInsideDevice"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10030","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12314"},{"referenceType":"HasProperty","target":"ns=1;i=10031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10032"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12314","parentNodeId":"ns=1;i=10030","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10030"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10031","parentNodeId":"ns=1;i=10030","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10030"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10032","parentNodeId":"ns=1;i=10030","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10030"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WindingTemperature","dataType":"Boolean","description":[{"value":"This property indicates an unacceptable winding temperature."}],"displayName":[{"value":"WindingTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10033","parentNodeId":"ns=1;i=5056","references":[{"referenceType":"HasProperty","target":"ns=1;i=12316"},{"referenceType":"HasProperty","target":"ns=1;i=10034"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10035"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5056"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12316","parentNodeId":"ns=1;i=10033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10034","parentNodeId":"ns=1;i=10033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10033"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10035","parentNodeId":"ns=1;i=10033","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10033"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionHardware","description":[{"value":"Supervision hardware specifies supervising information related to device hardware."}],"displayName":[{"value":"SupervisionHardware"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5124","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=10036"},{"referenceType":"HasComponent","target":"ns=1;i=10039"},{"referenceType":"HasComponent","target":"ns=1;i=10042"},{"referenceType":"HasComponent","target":"ns=1;i=10045"},{"referenceType":"HasComponent","target":"ns=1;i=10048"},{"referenceType":"HasComponent","target":"ns=1;i=10051"},{"referenceType":"HasComponent","target":"ns=1;i=10054"},{"referenceType":"HasComponent","target":"ns=1;i=10057"},{"referenceType":"HasComponent","target":"ns=1;i=10060"},{"referenceType":"HasComponent","target":"ns=1;i=10063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10066"},{"referenceType":"HasComponent","target":"ns=1;i=10069"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1013"}],"typeDefinition":"ns=1;i=1013"},{"accessLevel":5,"browseName":"1:Communication","dataType":"Boolean","description":[{"value":"This attribute indicates a communication failure."}],"displayName":[{"value":"Communication"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10036","parentNodeId":"ns=1;i=5124","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=12317"},{"referenceType":"HasProperty","target":"ns=1;i=10037"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10038"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12317","parentNodeId":"ns=1;i=10036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10037","parentNodeId":"ns=1;i=10036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10036"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10038","parentNodeId":"ns=1;i=10036","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10036"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ComputingCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the computing elements of device hardware."}],"displayName":[{"value":"ComputingCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10039","parentNodeId":"ns=1;i=5124","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=12319"},{"referenceType":"HasProperty","target":"ns=1;i=10040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10041"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12319","parentNodeId":"ns=1;i=10039","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10039"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10040","parentNodeId":"ns=1;i=10039","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10039"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10041","parentNodeId":"ns=1;i=10039","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10039"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ControlCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the control elements of device hardware."}],"displayName":[{"value":"ControlCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10042","parentNodeId":"ns=1;i=5124","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=12320"},{"referenceType":"HasProperty","target":"ns=1;i=10043"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10044"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12320","parentNodeId":"ns=1;i=10042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10042"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10043","parentNodeId":"ns=1;i=10042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10042"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10044","parentNodeId":"ns=1;i=10042","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10042"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DCLinkSupply","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the dc power supply of device hardware."}],"displayName":[{"value":"DCLinkSupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10045","parentNodeId":"ns=1;i=5124","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=12322"},{"referenceType":"HasProperty","target":"ns=1;i=10046"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10047"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12322","parentNodeId":"ns=1;i=10045","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10045"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10046","parentNodeId":"ns=1;i=10045","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10045"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10047","parentNodeId":"ns=1;i=10045","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10045"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Eprom","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of an eprom."}],"displayName":[{"value":"Eprom"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10048","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12323"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=10049"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10050"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12323","parentNodeId":"ns=1;i=10048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10049","parentNodeId":"ns=1;i=10048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10048"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10050","parentNodeId":"ns=1;i=10048","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10048"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:HardwareFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of device hardware."}],"displayName":[{"value":"HardwareFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10051","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12325"},{"referenceType":"HasProperty","target":"ns=1;i=10052"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10053"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12325","parentNodeId":"ns=1;i=10051","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10051"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10052","parentNodeId":"ns=1;i=10051","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10051"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10053","parentNodeId":"ns=1;i=10051","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10051"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:IONA","dataType":"Boolean","description":[{"value":"This attribute indicates a disconnection between processing unit and device."}],"displayName":[{"value":"IONA"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10054","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12326"},{"referenceType":"HasProperty","target":"ns=1;i=10055"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10056"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12326","parentNodeId":"ns=1;i=10054","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10054"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10055","parentNodeId":"ns=1;i=10054","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10054"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10056","parentNodeId":"ns=1;i=10054","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10054"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MeasureCircuit","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the measurement elements of device hardware."}],"displayName":[{"value":"MeasureCircuit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10057","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12328"},{"referenceType":"HasProperty","target":"ns=1;i=10058"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10059"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12328","parentNodeId":"ns=1;i=10057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10057"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10058","parentNodeId":"ns=1;i=10057","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10057"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10059","parentNodeId":"ns=1;i=10057","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10057"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MicroProcessor","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the micro processor."}],"displayName":[{"value":"MicroProcessor"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10060","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12329"},{"referenceType":"HasProperty","target":"ns=1;i=10061"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10062"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12329","parentNodeId":"ns=1;i=10060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10061","parentNodeId":"ns=1;i=10060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10060"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10062","parentNodeId":"ns=1;i=10060","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10060"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:NetworkNA","dataType":"Boolean","description":[{"value":"This attribute indicates a disconnection of the device."}],"displayName":[{"value":"NetworkNA"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10063","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12331"},{"referenceType":"HasProperty","target":"ns=1;i=10064"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10065"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12331","parentNodeId":"ns=1;i=10063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10063"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10064","parentNodeId":"ns=1;i=10063","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10063"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10065","parentNodeId":"ns=1;i=10063","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10063"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PowerSupply","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in the power supply of device hardware."}],"displayName":[{"value":"PowerSupply"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10066","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12332"},{"referenceType":"HasProperty","target":"ns=1;i=10067"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=10068"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12332","parentNodeId":"ns=1;i=10066","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10066"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10067","parentNodeId":"ns=1;i=10066","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10066"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10068","parentNodeId":"ns=1;i=10066","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10066"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Ram","dataType":"Boolean","description":[{"value":"This attribute indicates a ram failure."}],"displayName":[{"value":"Ram"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10069","parentNodeId":"ns=1;i=5124","references":[{"referenceType":"HasProperty","target":"ns=1;i=12334"},{"referenceType":"HasProperty","target":"ns=1;i=10070"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5124"},{"referenceType":"HasProperty","target":"ns=1;i=10071"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12334","parentNodeId":"ns=1;i=10069","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10069"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10070","parentNodeId":"ns=1;i=10069","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10069"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10071","parentNodeId":"ns=1;i=10069","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10069"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionMechanics","description":[{"value":"Supervision mechanics specifies supervising information related to device mechanics."}],"displayName":[{"value":"SupervisionMechanics"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5125","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=10072"},{"referenceType":"HasComponent","target":"ns=1;i=10075"},{"referenceType":"HasComponent","target":"ns=1;i=10078"},{"referenceType":"HasComponent","target":"ns=1;i=10081"},{"referenceType":"HasComponent","target":"ns=1;i=10084"},{"referenceType":"HasComponent","target":"ns=1;i=10087"},{"referenceType":"HasComponent","target":"ns=1;i=10090"},{"referenceType":"HasComponent","target":"ns=1;i=10093"},{"referenceType":"HasComponent","target":"ns=1;i=10096"},{"referenceType":"HasComponent","target":"ns=1;i=10099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10102"},{"referenceType":"HasComponent","target":"ns=1;i=10105"},{"referenceType":"HasComponent","target":"ns=1;i=10108"},{"referenceType":"HasComponent","target":"ns=1;i=10111"},{"referenceType":"HasComponent","target":"ns=1;i=10114"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1012"},{"referenceType":"HasComponent","target":"ns=1;i=10117"}],"typeDefinition":"ns=1;i=1012"},{"accessLevel":5,"browseName":"1:AxialBearingAbrasion","dataType":"Boolean","description":[{"value":"This attribute indicates an unacceptable abrasion of the axial bearing."}],"displayName":[{"value":"AxialBearingAbrasion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10072","parentNodeId":"ns=1;i=5125","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=12335"},{"referenceType":"HasProperty","target":"ns=1;i=10073"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10074"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12335","parentNodeId":"ns=1;i=10072","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10072"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10073","parentNodeId":"ns=1;i=10072","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10072"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10074","parentNodeId":"ns=1;i=10072","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10072"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AxialBearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the axial bearing."}],"displayName":[{"value":"AxialBearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10075","parentNodeId":"ns=1;i=5125","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=12337"},{"referenceType":"HasProperty","target":"ns=1;i=10076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10077"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12337","parentNodeId":"ns=1;i=10075","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10075"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10076","parentNodeId":"ns=1;i=10075","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10075"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10077","parentNodeId":"ns=1;i=10075","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10075"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AxialBearingOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the axial bearing."}],"displayName":[{"value":"AxialBearingOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10078","parentNodeId":"ns=1;i=5125","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=12338"},{"referenceType":"HasProperty","target":"ns=1;i=10079"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10080"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12338","parentNodeId":"ns=1;i=10078","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10078"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10079","parentNodeId":"ns=1;i=10078","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10078"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10080","parentNodeId":"ns=1;i=10078","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10078"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic bearing failure."}],"displayName":[{"value":"BearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10081","parentNodeId":"ns=1;i=5125","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=12340"},{"referenceType":"HasProperty","target":"ns=1;i=10082"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10083"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12340","parentNodeId":"ns=1;i=10081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10081"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10082","parentNodeId":"ns=1;i=10081","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10081"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10083","parentNodeId":"ns=1;i=10081","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10081"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BrakeChopper","dataType":"Boolean","description":[{"value":"This attribute indicates a problem of the brake chopper."}],"displayName":[{"value":"BrakeChopper"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10084","parentNodeId":"ns=1;i=5125","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=12341"},{"referenceType":"HasProperty","target":"ns=1;i=10085"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10086"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12341","parentNodeId":"ns=1;i=10084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10084"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10085","parentNodeId":"ns=1;i=10084","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10084"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10086","parentNodeId":"ns=1;i=10084","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10084"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BrakeOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a brake."}],"displayName":[{"value":"BrakeOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10087","parentNodeId":"ns=1;i=5125","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=12343"},{"referenceType":"HasProperty","target":"ns=1;i=10088"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10089"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12343","parentNodeId":"ns=1;i=10087","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10087"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10088","parentNodeId":"ns=1;i=10087","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10087"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10089","parentNodeId":"ns=1;i=10087","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10087"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ExcessVibration","dataType":"Boolean","description":[{"value":"This attribute indicates unacceptable high mechanical vibration."}],"displayName":[{"value":"ExcessVibration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10090","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12344"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=10091"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10092"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12344","parentNodeId":"ns=1;i=10090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10090"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10091","parentNodeId":"ns=1;i=10090","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10090"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10092","parentNodeId":"ns=1;i=10090","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10090"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapWear","dataType":"Boolean","description":[{"value":"This attribute indicates a mechanical wear at gap."}],"displayName":[{"value":"GapWear"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10093","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12346"},{"referenceType":"HasProperty","target":"ns=1;i=10094"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10095"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12346","parentNodeId":"ns=1;i=10093","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10093"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10094","parentNodeId":"ns=1;i=10093","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10093"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10095","parentNodeId":"ns=1;i=10093","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10093"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MechanicalFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic mechanical fault."}],"displayName":[{"value":"MechanicalFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10096","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12347"},{"referenceType":"HasProperty","target":"ns=1;i=10097"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10098"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12347","parentNodeId":"ns=1;i=10096","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10096"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10097","parentNodeId":"ns=1;i=10096","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10096"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10098","parentNodeId":"ns=1;i=10096","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10096"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Misalignment","dataType":"Boolean","description":[{"value":"This attribute indicates a misalignment."}],"displayName":[{"value":"Misalignment"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10099","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12349"},{"referenceType":"HasProperty","target":"ns=1;i=10100"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10101"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12349","parentNodeId":"ns=1;i=10099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10100","parentNodeId":"ns=1;i=10099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10099"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10101","parentNodeId":"ns=1;i=10099","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10099"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingAbrasion","dataType":"Boolean","description":[{"value":"This attribute indicates an unacceptable abrasion of the radial bearing."}],"displayName":[{"value":"RadialBearingAbrasion"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10102","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12350"},{"referenceType":"HasProperty","target":"ns=1;i=10103"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=10104"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12350","parentNodeId":"ns=1;i=10102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10102"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10103","parentNodeId":"ns=1;i=10102","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10102"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10104","parentNodeId":"ns=1;i=10102","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10102"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the radial bearing."}],"displayName":[{"value":"RadialBearingFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10105","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12352"},{"referenceType":"HasProperty","target":"ns=1;i=10106"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=10107"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12352","parentNodeId":"ns=1;i=10105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10105"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10106","parentNodeId":"ns=1;i=10105","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10105"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10107","parentNodeId":"ns=1;i=10105","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10105"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RadialBearingOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the radial bearing."}],"displayName":[{"value":"RadialBearingOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10108","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12353"},{"referenceType":"HasProperty","target":"ns=1;i=10109"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=10110"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12353","parentNodeId":"ns=1;i=10108","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10108"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10109","parentNodeId":"ns=1;i=10108","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10108"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10110","parentNodeId":"ns=1;i=10108","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10108"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotorBlocked","dataType":"Boolean","description":[{"value":"This attribute indicates a blocked rotor."}],"displayName":[{"value":"RotorBlocked"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10111","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12355"},{"referenceType":"HasProperty","target":"ns=1;i=10112"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=10113"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12355","parentNodeId":"ns=1;i=10111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10111"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10112","parentNodeId":"ns=1;i=10111","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10111"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10113","parentNodeId":"ns=1;i=10111","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10111"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotorStationRubbing","dataType":"Boolean","description":[{"value":"This attribute indicates the rubbing of stator and rotor."}],"displayName":[{"value":"RotorStationRubbing"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10114","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12356"},{"referenceType":"HasProperty","target":"ns=1;i=10115"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"},{"referenceType":"HasProperty","target":"ns=1;i=10116"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12356","parentNodeId":"ns=1;i=10114","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10114"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10115","parentNodeId":"ns=1;i=10114","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10114"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10116","parentNodeId":"ns=1;i=10114","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10114"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Unbalance","dataType":"Boolean","description":[{"value":"This attribute indicates an unbalance."}],"displayName":[{"value":"Unbalance"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10117","parentNodeId":"ns=1;i=5125","references":[{"referenceType":"HasProperty","target":"ns=1;i=12358"},{"referenceType":"HasProperty","target":"ns=1;i=10118"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10119"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5125"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12358","parentNodeId":"ns=1;i=10117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10118","parentNodeId":"ns=1;i=10117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10117"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10119","parentNodeId":"ns=1;i=10117","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10117"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionProcessFluid","description":[{"value":"Supervision process fluid specifies information for monitoring the fluid of a pump."}],"displayName":[{"value":"SupervisionProcessFluid"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5126","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=10120"},{"referenceType":"HasComponent","target":"ns=1;i=10123"},{"referenceType":"HasComponent","target":"ns=1;i=10126"},{"referenceType":"HasComponent","target":"ns=1;i=10129"},{"referenceType":"HasComponent","target":"ns=1;i=10132"},{"referenceType":"HasComponent","target":"ns=1;i=10135"},{"referenceType":"HasComponent","target":"ns=1;i=10138"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10141"},{"referenceType":"HasComponent","target":"ns=1;i=10144"},{"referenceType":"HasComponent","target":"ns=1;i=10147"},{"referenceType":"HasComponent","target":"ns=1;i=10150"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1015"},{"referenceType":"HasComponent","target":"ns=1;i=10153"},{"referenceType":"HasComponent","target":"ns=1;i=10156"}],"typeDefinition":"ns=1;i=1015"},{"accessLevel":5,"browseName":"1:Blockage","dataType":"Boolean","description":[{"value":"This attribute indicates a closed valve operation."}],"displayName":[{"value":"Blockage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10120","parentNodeId":"ns=1;i=5126","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=12359"},{"referenceType":"HasProperty","target":"ns=1;i=10121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10122"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12359","parentNodeId":"ns=1;i=10120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10121","parentNodeId":"ns=1;i=10120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10120"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10122","parentNodeId":"ns=1;i=10120","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10120"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Cavitation","dataType":"Boolean","description":[{"value":"This attribute indicates cavitation of the pump liquid."}],"displayName":[{"value":"Cavitation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10123","parentNodeId":"ns=1;i=5126","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=12362"},{"referenceType":"HasProperty","target":"ns=1;i=10124"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10125"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12362","parentNodeId":"ns=1;i=10123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10123"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10124","parentNodeId":"ns=1;i=10123","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10123"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10125","parentNodeId":"ns=1;i=10123","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10123"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Condensation","dataType":"Boolean","description":[{"value":"This attribute indicates abnormal condensation in flow medium."}],"displayName":[{"value":"Condensation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10126","parentNodeId":"ns=1;i=5126","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=12363"},{"referenceType":"HasProperty","target":"ns=1;i=10127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10128"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12363","parentNodeId":"ns=1;i=10126","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10127","parentNodeId":"ns=1;i=10126","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10126"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10128","parentNodeId":"ns=1;i=10126","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10126"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Dry","dataType":"Boolean","description":[{"value":"This attribute indicates a dry running."}],"displayName":[{"value":"Dry"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10129","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12365"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=10130"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10131"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12365","parentNodeId":"ns=1;i=10129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10130","parentNodeId":"ns=1;i=10129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10129"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10131","parentNodeId":"ns=1;i=10129","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10129"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Flow","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal flow of the pump fluid."}],"displayName":[{"value":"Flow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10132","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12366"},{"referenceType":"HasProperty","target":"ns=1;i=10133"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10134"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12366","parentNodeId":"ns=1;i=10132","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10132"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10133","parentNodeId":"ns=1;i=10132","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10132"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10134","parentNodeId":"ns=1;i=10132","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10132"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Gas","dataType":"Boolean","description":[{"value":"This attribute indicates a significant amount of gas in the pump liquid."}],"displayName":[{"value":"Gas"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10135","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12368"},{"referenceType":"HasProperty","target":"ns=1;i=10136"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10137"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12368","parentNodeId":"ns=1;i=10135","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10135"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10136","parentNodeId":"ns=1;i=10135","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10135"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10137","parentNodeId":"ns=1;i=10135","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10135"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Liquid","dataType":"Boolean","description":[{"value":"This attribute indicates a significant amount of liquid in the flow medium."}],"displayName":[{"value":"Liquid"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10138","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12369"},{"referenceType":"HasProperty","target":"ns=1;i=10139"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10140"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12369","parentNodeId":"ns=1;i=10138","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10138"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10139","parentNodeId":"ns=1;i=10138","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10138"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10140","parentNodeId":"ns=1;i=10138","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10138"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Pressure","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal pressure of the pump fluid."}],"displayName":[{"value":"Pressure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10141","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12371"},{"referenceType":"HasProperty","target":"ns=1;i=10142"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=10143"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12371","parentNodeId":"ns=1;i=10141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10142","parentNodeId":"ns=1;i=10141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10141"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10143","parentNodeId":"ns=1;i=10141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10141"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ProcessFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic process problem."}],"displayName":[{"value":"ProcessFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10144","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12372"},{"referenceType":"HasProperty","target":"ns=1;i=10145"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=10146"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12372","parentNodeId":"ns=1;i=10144","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10144"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10145","parentNodeId":"ns=1;i=10144","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10144"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10146","parentNodeId":"ns=1;i=10144","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10144"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Solid","dataType":"Boolean","description":[{"value":"This attribute indicates an significant amount of solid in the pump fluid."}],"displayName":[{"value":"Solid"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10147","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12374"},{"referenceType":"HasProperty","target":"ns=1;i=10148"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=10149"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12374","parentNodeId":"ns=1;i=10147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10147"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10148","parentNodeId":"ns=1;i=10147","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10147"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10149","parentNodeId":"ns=1;i=10147","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10147"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Stall","dataType":"Boolean","description":[{"value":"This attribute indicates a stall of the pump liquid."}],"displayName":[{"value":"Stall"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10150","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12375"},{"referenceType":"HasProperty","target":"ns=1;i=10151"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=10152"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12375","parentNodeId":"ns=1;i=10150","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10150"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10151","parentNodeId":"ns=1;i=10150","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10150"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10152","parentNodeId":"ns=1;i=10150","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10150"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Temperature","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal temperature of the pump fluid."}],"displayName":[{"value":"Temperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10153","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12377"},{"referenceType":"HasProperty","target":"ns=1;i=10154"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"},{"referenceType":"HasProperty","target":"ns=1;i=10155"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12377","parentNodeId":"ns=1;i=10153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10154","parentNodeId":"ns=1;i=10153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10153"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10155","parentNodeId":"ns=1;i=10153","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10153"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Viscosity","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal viscosity of the pump liquid."}],"displayName":[{"value":"Viscosity"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10156","parentNodeId":"ns=1;i=5126","references":[{"referenceType":"HasProperty","target":"ns=1;i=12378"},{"referenceType":"HasProperty","target":"ns=1;i=10157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10158"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5126"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12378","parentNodeId":"ns=1;i=10156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10156"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10157","parentNodeId":"ns=1;i=10156","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10156"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10158","parentNodeId":"ns=1;i=10156","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10156"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionPumpOperation","description":[{"value":"Supervision pump operation specifies information for monitoring the pump operation."}],"displayName":[{"value":"SupervisionPumpOperation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5127","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=10159"},{"referenceType":"HasComponent","target":"ns=1;i=10162"},{"referenceType":"HasComponent","target":"ns=1;i=10165"},{"referenceType":"HasComponent","target":"ns=1;i=10168"},{"referenceType":"HasComponent","target":"ns=1;i=11396"},{"referenceType":"HasComponent","target":"ns=1;i=11400"},{"referenceType":"HasComponent","target":"ns=1;i=11404"},{"referenceType":"HasComponent","target":"ns=1;i=11409"},{"referenceType":"HasComponent","target":"ns=1;i=11413"},{"referenceType":"HasComponent","target":"ns=1;i=11418"},{"referenceType":"HasComponent","target":"ns=1;i=11422"},{"referenceType":"HasComponent","target":"ns=1;i=11427"},{"referenceType":"HasComponent","target":"ns=1;i=11431"},{"referenceType":"HasComponent","target":"ns=1;i=12091"},{"referenceType":"HasComponent","target":"ns=1;i=12095"},{"referenceType":"HasComponent","target":"ns=1;i=12100"},{"referenceType":"HasComponent","target":"ns=1;i=12104"},{"referenceType":"HasComponent","target":"ns=1;i=12109"},{"referenceType":"HasComponent","target":"ns=1;i=12113"},{"referenceType":"HasComponent","target":"ns=1;i=12118"},{"referenceType":"HasComponent","target":"ns=1;i=12122"},{"referenceType":"HasComponent","target":"ns=1;i=12127"},{"referenceType":"HasComponent","target":"ns=1;i=12131"},{"referenceType":"HasComponent","target":"ns=1;i=12136"},{"referenceType":"HasComponent","target":"ns=1;i=12140"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12145"},{"referenceType":"HasComponent","target":"ns=1;i=12149"},{"referenceType":"HasComponent","target":"ns=1;i=12154"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1016"},{"referenceType":"HasComponent","target":"ns=1;i=12158"},{"referenceType":"HasComponent","target":"ns=1;i=12167"},{"referenceType":"HasComponent","target":"ns=1;i=12172"},{"referenceType":"HasComponent","target":"ns=1;i=12163"},{"referenceType":"HasComponent","target":"ns=1;i=12176"},{"referenceType":"HasComponent","target":"ns=1;i=12181"},{"referenceType":"HasComponent","target":"ns=1;i=12185"},{"referenceType":"HasComponent","target":"ns=1;i=12190"},{"referenceType":"HasComponent","target":"ns=1;i=12194"}],"typeDefinition":"ns=1;i=1016"},{"accessLevel":5,"browseName":"1:AccessoryLiquidFlow","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the accessory liquid flow, e.g. the buffer fluid flow or operating fluid flow."}],"displayName":[{"value":"AccessoryLiquidFlow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10159","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12380"},{"referenceType":"HasProperty","target":"ns=1;i=10160"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10161"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12380","parentNodeId":"ns=1;i=10159","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10159"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10160","parentNodeId":"ns=1;i=10159","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10159"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10161","parentNodeId":"ns=1;i=10159","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10159"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidHigh","dataType":"Boolean","description":[{"value":"This attribute indicates a high limited accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10162","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12381"},{"referenceType":"HasProperty","target":"ns=1;i=10163"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10164"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12381","parentNodeId":"ns=1;i=10162","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10162"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10163","parentNodeId":"ns=1;i=10162","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10162"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10164","parentNodeId":"ns=1;i=10162","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10162"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidLow","dataType":"Boolean","description":[{"value":"This attribute indicates a low limited accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10165","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12383"},{"referenceType":"HasProperty","target":"ns=1;i=10166"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10167"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12383","parentNodeId":"ns=1;i=10165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10166","parentNodeId":"ns=1;i=10165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10165"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10167","parentNodeId":"ns=1;i=10165","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10165"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the accessory liquid, e.g. the buffer fluid or operating fluid."}],"displayName":[{"value":"AccessoryLiquidOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10168","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12384"},{"referenceType":"HasProperty","target":"ns=1;i=10169"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10918"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12384","parentNodeId":"ns=1;i=10168","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10168"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10169","parentNodeId":"ns=1;i=10168","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10168"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10918","parentNodeId":"ns=1;i=10168","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10168"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AccessoryLiquidPressure","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal pressure of the accessory liquid, e.g. the buffer fluid pressure or operating fluid pressure."}],"displayName":[{"value":"AccessoryLiquidPressure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11396","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12386"},{"referenceType":"HasProperty","target":"ns=1;i=11397"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11398"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12386","parentNodeId":"ns=1;i=11396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11396"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11397","parentNodeId":"ns=1;i=11396","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11396"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11398","parentNodeId":"ns=1;i=11396","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11396"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:AmbientTemperature","dataType":"Boolean","description":[{"value":"This attribute indicates an abnormal ambient temperature."}],"displayName":[{"value":"AmbientTemperature"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11400","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12387"},{"referenceType":"HasProperty","target":"ns=1;i=11401"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11403"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12387","parentNodeId":"ns=1;i=11400","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11400"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11401","parentNodeId":"ns=1;i=11400","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11400"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11403","parentNodeId":"ns=1;i=11400","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11400"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CaseOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the case."}],"displayName":[{"value":"CaseOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11404","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12389"},{"referenceType":"HasProperty","target":"ns=1;i=11406"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11407"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12389","parentNodeId":"ns=1;i=11404","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11404"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11406","parentNodeId":"ns=1;i=11404","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11404"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11407","parentNodeId":"ns=1;i=11404","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11404"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ControllerOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a controller."}],"displayName":[{"value":"ControllerOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11409","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12390"},{"referenceType":"HasProperty","target":"ns=1;i=11410"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11412"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12390","parentNodeId":"ns=1;i=11409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11410","parentNodeId":"ns=1;i=11409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11409"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11412","parentNodeId":"ns=1;i=11409","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11409"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ConverterOverheat","dataType":"Boolean","description":[{"value":"This property indicates an overheating of a converter."}],"displayName":[{"value":"ConverterOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11413","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12392"},{"referenceType":"HasProperty","target":"ns=1;i=11415"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11416"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12392","parentNodeId":"ns=1;i=11413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11415","parentNodeId":"ns=1;i=11413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11413"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11416","parentNodeId":"ns=1;i=11413","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11413"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantFlow","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the coolant flow."}],"displayName":[{"value":"CoolantFlow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11418","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12393"},{"referenceType":"HasProperty","target":"ns=1;i=11419"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11421"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12393","parentNodeId":"ns=1;i=11418","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11418"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11419","parentNodeId":"ns=1;i=11418","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11418"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11421","parentNodeId":"ns=1;i=11418","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11418"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantHigh","dataType":"Boolean","description":[{"value":"This attribute indicates that the coolant is high limited."}],"displayName":[{"value":"CoolantHigh"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11422","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12395"},{"referenceType":"HasProperty","target":"ns=1;i=11424"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11425"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12395","parentNodeId":"ns=1;i=11422","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11422"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11424","parentNodeId":"ns=1;i=11422","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11422"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11425","parentNodeId":"ns=1;i=11422","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11422"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantLow","dataType":"Boolean","description":[{"value":"This attribute indicates that the coolant is low limited."}],"displayName":[{"value":"CoolantLow"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11427","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12396"},{"referenceType":"HasProperty","target":"ns=1;i=11428"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11430"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12396","parentNodeId":"ns=1;i=11427","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11427"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11428","parentNodeId":"ns=1;i=11427","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11427"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11430","parentNodeId":"ns=1;i=11427","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11427"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:CoolantOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of the coolant liquid."}],"displayName":[{"value":"CoolantOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11431","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12398"},{"referenceType":"HasProperty","target":"ns=1;i=11433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11434"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12398","parentNodeId":"ns=1;i=11431","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11431"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11433","parentNodeId":"ns=1;i=11431","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11431"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11434","parentNodeId":"ns=1;i=11431","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11431"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Deceleration","dataType":"Boolean","description":[{"value":"This attribute indicates a deceleration of a pump."}],"displayName":[{"value":"Deceleration"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12091","parentNodeId":"ns=1;i=5127","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12399"},{"referenceType":"HasProperty","target":"ns=1;i=12092"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12094"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12399","parentNodeId":"ns=1;i=12091","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12091"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12092","parentNodeId":"ns=1;i=12091","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12091"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12094","parentNodeId":"ns=1;i=12091","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12091"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DirtyImpeller","dataType":"Boolean","description":[{"value":"This attribute indicates a dirty impeller."}],"displayName":[{"value":"DirtyImpeller"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12095","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12401"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12097"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12098"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12401","parentNodeId":"ns=1;i=12095","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12095"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12097","parentNodeId":"ns=1;i=12095","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12095"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12098","parentNodeId":"ns=1;i=12095","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12095"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:DriveOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a drive."}],"displayName":[{"value":"DriveOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12100","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12402"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12101"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12103"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12402","parentNodeId":"ns=1;i=12100","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12100"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12101","parentNodeId":"ns=1;i=12100","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12100"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12103","parentNodeId":"ns=1;i=12100","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12100"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GeneratorOperation","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump is working as a generator (in flow)."}],"displayName":[{"value":"GeneratorOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12104","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12404"},{"referenceType":"HasProperty","target":"ns=1;i=12106"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12107"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12404","parentNodeId":"ns=1;i=12104","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12104"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12106","parentNodeId":"ns=1;i=12104","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12104"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12107","parentNodeId":"ns=1;i=12104","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12104"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Leakage","dataType":"Boolean","description":[{"value":"This attribute indicates a leakage problem, e.g. leakage of the mechanical seal."}],"displayName":[{"value":"Leakage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12109","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12405"},{"referenceType":"HasProperty","target":"ns=1;i=12110"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12112"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12405","parentNodeId":"ns=1;i=12109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12110","parentNodeId":"ns=1;i=12109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12109"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12112","parentNodeId":"ns=1;i=12109","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12109"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Lubricant","dataType":"Boolean","description":[{"value":"This attribute indicates a problem with the lubricant."}],"displayName":[{"value":"Lubricant"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12113","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12407"},{"referenceType":"HasProperty","target":"ns=1;i=12115"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12116"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12407","parentNodeId":"ns=1;i=12113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12115","parentNodeId":"ns=1;i=12113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12113"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12116","parentNodeId":"ns=1;i=12113","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12113"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumNumberStarts","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum number of pump start cycles is exceeded."}],"displayName":[{"value":"MaximumNumberStarts"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12118","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12408"},{"referenceType":"HasProperty","target":"ns=1;i=12119"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12121"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12408","parentNodeId":"ns=1;i=12118","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12118"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12119","parentNodeId":"ns=1;i=12118","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12118"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12121","parentNodeId":"ns=1;i=12118","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12118"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumOperationTime","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum time of pump operation is exceeded."}],"displayName":[{"value":"MaximumOperationTime"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12122","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12410"},{"referenceType":"HasProperty","target":"ns=1;i=12124"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12125"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12410","parentNodeId":"ns=1;i=12122","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12122"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12124","parentNodeId":"ns=1;i=12122","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12122"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12125","parentNodeId":"ns=1;i=12122","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12122"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MaximumStartsAtTime","dataType":"Boolean","description":[{"value":"This attribute indicates that the maximum number of pump start cycles per timespan is exceeded."}],"displayName":[{"value":"MaximumStartsAtTime"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12127","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12411"},{"referenceType":"HasProperty","target":"ns=1;i=12128"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12130"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12411","parentNodeId":"ns=1;i=12127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12128","parentNodeId":"ns=1;i=12127","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12127"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12130","parentNodeId":"ns=1;i=12127","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12127"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MotorHumidity","dataType":"Boolean","description":[{"value":"This attribute indicates unacceptable humidity in the motor."}],"displayName":[{"value":"MotorHumidity"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12131","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12413"},{"referenceType":"HasProperty","target":"ns=1;i=12133"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12134"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12413","parentNodeId":"ns=1;i=12131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12131"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12133","parentNodeId":"ns=1;i=12131","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12131"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12134","parentNodeId":"ns=1;i=12131","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12131"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:MotorOverheat","dataType":"Boolean","description":[{"value":"This attribute indicates an overheating of a motor."}],"displayName":[{"value":"MotorOverheat"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12136","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12414"},{"referenceType":"HasProperty","target":"ns=1;i=12137"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12139"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12414","parentNodeId":"ns=1;i=12136","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12136"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12137","parentNodeId":"ns=1;i=12136","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12136"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12139","parentNodeId":"ns=1;i=12136","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12136"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OperationFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic operation problem of a pump."}],"displayName":[{"value":"OperationFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12140","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12416"},{"referenceType":"HasProperty","target":"ns=1;i=12142"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12143"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12416","parentNodeId":"ns=1;i=12140","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12140"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12142","parentNodeId":"ns=1;i=12140","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12140"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12143","parentNodeId":"ns=1;i=12140","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12140"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverLoad","dataType":"Boolean","description":[{"value":"This attribute indicates an over load."}],"displayName":[{"value":"OverLoad"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12145","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12417"},{"referenceType":"HasProperty","target":"ns=1;i=12146"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12148"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12417","parentNodeId":"ns=1;i=12145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12146","parentNodeId":"ns=1;i=12145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12145"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12148","parentNodeId":"ns=1;i=12145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12145"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverSpeed","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump operates over normal speed."}],"displayName":[{"value":"OverSpeed"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12149","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12419"},{"referenceType":"HasProperty","target":"ns=1;i=12151"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12152"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12419","parentNodeId":"ns=1;i=12149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12149"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12151","parentNodeId":"ns=1;i=12149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12149"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12152","parentNodeId":"ns=1;i=12149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12149"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:PartialLoad","dataType":"Boolean","description":[{"value":"This attribute indicates a partial load."}],"displayName":[{"value":"PartialLoad"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12154","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12420"},{"referenceType":"HasProperty","target":"ns=1;i=12155"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12157"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12420","parentNodeId":"ns=1;i=12154","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12154"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12155","parentNodeId":"ns=1;i=12154","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12154"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12157","parentNodeId":"ns=1;i=12154","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12154"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Synchronisation","dataType":"Boolean","description":[{"value":"This attribute indicates a synchronization problem of a pump."}],"displayName":[{"value":"Synchronisation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12158","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12422"},{"referenceType":"HasProperty","target":"ns=1;i=12160"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12161"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12422","parentNodeId":"ns=1;i=12158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12158"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12160","parentNodeId":"ns=1;i=12158","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12158"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12161","parentNodeId":"ns=1;i=12158","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12158"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TemperatureFault","dataType":"Boolean","description":[{"value":"This attribute indicates a generic temperature problem of a pump."}],"displayName":[{"value":"TemperatureFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12167","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12425"},{"referenceType":"HasProperty","target":"ns=1;i=12169"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12170"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12425","parentNodeId":"ns=1;i=12167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12167"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12169","parentNodeId":"ns=1;i=12167","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12167"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12170","parentNodeId":"ns=1;i=12167","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12167"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TimeOut","dataType":"Boolean","description":[{"value":"This attribute indicates a start up time out."}],"displayName":[{"value":"TimeOut"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12172","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12426"},{"referenceType":"HasProperty","target":"ns=1;i=12173"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12175"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12426","parentNodeId":"ns=1;i=12172","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12172"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12173","parentNodeId":"ns=1;i=12172","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12172"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12175","parentNodeId":"ns=1;i=12172","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12172"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TMSFailure","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of the temperature management system."}],"displayName":[{"value":"TMSFailure"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12163","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12423"},{"referenceType":"HasProperty","target":"ns=1;i=12164"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12166"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12423","parentNodeId":"ns=1;i=12163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12163"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12164","parentNodeId":"ns=1;i=12163","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12163"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12166","parentNodeId":"ns=1;i=12163","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12163"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TorqueLimit","dataType":"Boolean","description":[{"value":"This attribute indicates a limitation problem of a pump."}],"displayName":[{"value":"TorqueLimit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12176","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12428"},{"referenceType":"HasProperty","target":"ns=1;i=12178"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasProperty","target":"ns=1;i=12179"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12428","parentNodeId":"ns=1;i=12176","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12176"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12178","parentNodeId":"ns=1;i=12176","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12176"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12179","parentNodeId":"ns=1;i=12176","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12176"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:TurbineOperation","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump is working as a turbine (reverse flow)."}],"displayName":[{"value":"TurbineOperation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12181","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12429"},{"referenceType":"HasProperty","target":"ns=1;i=12182"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12184"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12429","parentNodeId":"ns=1;i=12181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12181"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12182","parentNodeId":"ns=1;i=12181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12181"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12184","parentNodeId":"ns=1;i=12181","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12181"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:UnderSpeed","dataType":"Boolean","description":[{"value":"This attribute indicates that the pump operates under normal speed."}],"displayName":[{"value":"UnderSpeed"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12185","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12431"},{"referenceType":"HasProperty","target":"ns=1;i=12187"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12188"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12431","parentNodeId":"ns=1;i=12185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12185"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12187","parentNodeId":"ns=1;i=12185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12185"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12188","parentNodeId":"ns=1;i=12185","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12185"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VelocityLimit","dataType":"Boolean","description":[{"value":"This attribute indicates a limitation problem of a pump."}],"displayName":[{"value":"VelocityLimit"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12190","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12432"},{"referenceType":"HasProperty","target":"ns=1;i=12191"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12193"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12432","parentNodeId":"ns=1;i=12190","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12190"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12191","parentNodeId":"ns=1;i=12190","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12190"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12193","parentNodeId":"ns=1;i=12190","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12190"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:WearReserveExhausted","dataType":"Boolean","description":[{"value":"This attribute indicates that the wear reserve of the pump is exhausted."}],"displayName":[{"value":"WearReserveExhausted"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12194","parentNodeId":"ns=1;i=5127","references":[{"referenceType":"HasProperty","target":"ns=1;i=12434"},{"referenceType":"HasProperty","target":"ns=1;i=12196"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12197"},{"referenceType":"HasTypeDefinition","target":"i=2373"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5127"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12434","parentNodeId":"ns=1;i=12194","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12194"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12196","parentNodeId":"ns=1;i=12194","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12194"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12197","parentNodeId":"ns=1;i=12194","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12194"}],"typeDefinition":"i=68"},{"browseName":"1:SupervisionSoftware","description":[{"value":"Supervision software specifies supervising information related to device software."}],"displayName":[{"value":"SupervisionSoftware"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5128","parentNodeId":"ns=1;i=5117","references":[{"referenceType":"HasComponent","target":"ns=1;i=12199"},{"referenceType":"HasComponent","target":"ns=1;i=12203"},{"referenceType":"HasComponent","target":"ns=1;i=12208"},{"referenceType":"HasComponent","target":"ns=1;i=12212"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12217"},{"referenceType":"HasComponent","target":"ns=1;i=12221"},{"referenceType":"HasComponent","target":"ns=1;i=12226"},{"referenceType":"HasComponent","target":"ns=1;i=12230"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5117"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1014"}],"typeDefinition":"ns=1;i=1014"},{"accessLevel":5,"browseName":"1:Application","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in application software."}],"displayName":[{"value":"Application"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12199","parentNodeId":"ns=1;i=5128","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12435"},{"referenceType":"HasProperty","target":"ns=1;i=12200"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12202"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12435","parentNodeId":"ns=1;i=12199","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12199"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12200","parentNodeId":"ns=1;i=12199","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12199"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12202","parentNodeId":"ns=1;i=12199","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12199"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Communication","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in communication software."}],"displayName":[{"value":"Communication"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12203","parentNodeId":"ns=1;i=5128","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12437"},{"referenceType":"HasProperty","target":"ns=1;i=12205"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12206"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12437","parentNodeId":"ns=1;i=12203","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12203"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12205","parentNodeId":"ns=1;i=12203","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12203"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12206","parentNodeId":"ns=1;i=12203","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12203"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Control","dataType":"Boolean","description":[{"value":"This attribute indicates a failure in control software."}],"displayName":[{"value":"Control"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12208","parentNodeId":"ns=1;i=5128","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12438"},{"referenceType":"HasProperty","target":"ns=1;i=12209"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12211"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12438","parentNodeId":"ns=1;i=12208","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12208"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12209","parentNodeId":"ns=1;i=12208","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12208"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12211","parentNodeId":"ns=1;i=12208","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12208"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Memory","dataType":"Boolean","description":[{"value":"This attribute indicates a memory resource problem."}],"displayName":[{"value":"Memory"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12212","parentNodeId":"ns=1;i=5128","references":[{"referenceType":"HasProperty","target":"ns=1;i=12440"},{"referenceType":"HasProperty","target":"ns=1;i=12214"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=12215"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12440","parentNodeId":"ns=1;i=12212","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12212"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12214","parentNodeId":"ns=1;i=12212","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12212"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12215","parentNodeId":"ns=1;i=12212","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12212"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OS","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of operation system software."}],"displayName":[{"value":"OS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12217","parentNodeId":"ns=1;i=5128","references":[{"referenceType":"HasProperty","target":"ns=1;i=12441"},{"referenceType":"HasProperty","target":"ns=1;i=12218"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12220"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12441","parentNodeId":"ns=1;i=12217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12217"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12218","parentNodeId":"ns=1;i=12217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12217"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12220","parentNodeId":"ns=1;i=12217","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12217"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Parameter","dataType":"Boolean","description":[{"value":"This attribute indicates a parameter problem."}],"displayName":[{"value":"Parameter"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12221","parentNodeId":"ns=1;i=5128","references":[{"referenceType":"HasProperty","target":"ns=1;i=12443"},{"referenceType":"HasProperty","target":"ns=1;i=12223"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12224"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12443","parentNodeId":"ns=1;i=12221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12223","parentNodeId":"ns=1;i=12221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12221"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12224","parentNodeId":"ns=1;i=12221","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12221"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SoftwareFault","dataType":"Boolean","description":[{"value":"This attribute indicates a failure of device software."}],"displayName":[{"value":"SoftwareFault"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12226","parentNodeId":"ns=1;i=5128","references":[{"referenceType":"HasProperty","target":"ns=1;i=12444"},{"referenceType":"HasProperty","target":"ns=1;i=12227"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12229"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12444","parentNodeId":"ns=1;i=12226","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12226"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12227","parentNodeId":"ns=1;i=12226","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12226"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12229","parentNodeId":"ns=1;i=12226","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12226"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SoftwareReset","dataType":"Boolean","description":[{"value":"This attribute indicates a software reset."}],"displayName":[{"value":"SoftwareReset"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12230","parentNodeId":"ns=1;i=5128","references":[{"referenceType":"HasProperty","target":"ns=1;i=12446"},{"referenceType":"HasProperty","target":"ns=1;i=12232"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5128"},{"referenceType":"HasProperty","target":"ns=1;i=12233"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12446","parentNodeId":"ns=1;i=12230","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12230"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12232","parentNodeId":"ns=1;i=12230","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12230"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12233","parentNodeId":"ns=1;i=12230","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12230"}],"typeDefinition":"i=68"},{"browseName":"3:Identification","description":[{"value":"Identification information of a pump."}],"displayName":[{"value":"Identification"}],"modellingRule":"Mandatory","nodeClass":"Object","nodeId":"ns=1;i=5120","parentNodeId":"ns=1;i=1052","references":[{"referenceType":"HasProperty","target":"ns=1;i=10908"},{"referenceType":"HasProperty","target":"ns=1;i=10896"},{"referenceType":"HasProperty","target":"ns=1;i=10897"},{"referenceType":"HasProperty","target":"ns=1;i=10909"},{"referenceType":"HasProperty","target":"ns=1;i=10910"},{"referenceType":"HasProperty","target":"ns=1;i=10898"},{"referenceType":"HasProperty","target":"ns=1;i=10911"},{"referenceType":"HasProperty","target":"ns=1;i=10912"},{"referenceType":"HasProperty","target":"ns=1;i=10899"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasProperty","target":"ns=1;i=10900"},{"referenceType":"HasProperty","target":"ns=1;i=10901"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=9747"},{"referenceType":"HasProperty","target":"ns=1;i=10902"},{"referenceType":"HasComponent","target":"ns=1;i=5163"},{"referenceType":"HasProperty","target":"ns=1;i=10903"},{"referenceType":"HasProperty","target":"ns=1;i=10904"},{"referenceType":"HasProperty","target":"ns=1;i=10913"},{"referenceType":"HasProperty","target":"ns=1;i=10914"},{"referenceType":"HasProperty","target":"ns=1;i=10915"},{"referenceType":"HasProperty","target":"ns=1;i=10905"},{"referenceType":"HasProperty","target":"ns=1;i=9748"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1005"},{"referenceType":"HasProperty","target":"ns=1;i=9749"},{"referenceType":"HasProperty","target":"ns=1;i=10906"},{"referenceType":"HasProperty","target":"ns=1;i=10916"},{"referenceType":"HasProperty","target":"ns=1;i=10917"},{"referenceType":"HasProperty","target":"ns=1;i=10907"}],"typeDefinition":"ns=1;i=1005"},{"browseName":"1:ArticleNumber","dataType":"String","description":[{"value":"Alphanumeric character sequence identifying a manufactured, non-configurable product."}],"displayName":[{"value":"ArticleNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10908","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"3:AssetId","dataType":"String","description":[{"locale":"en","value":"To be used by end users to store a unique identification in the context of their overall application. Servers shall support at least 40 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 40 Unicode characters into that field."}],"displayName":[{"value":"AssetId"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10896","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003C/uax:String\u003E"},{"accessLevel":3,"browseName":"3:ComponentName","dataType":"LocalizedText","description":[{"locale":"en","value":"To be used by end users to store a human-readable localized text for the MachineryItem. The minimum number of locales supported for this property shall be two. Servers shall support at least 40 Unicode characters for the clients writing the text part of each locale, this means clients can expect to be able to write texts with a length of 40 Unicode characters into that field."}],"displayName":[{"value":"ComponentName"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10897","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:LocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022 /\u003E"},{"browseName":"1:CountryOfOrigin","dataType":"String","description":[{"value":"Country in which the product is manufactured."}],"displayName":[{"value":"CountryOfOrigin"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10909","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DayOfConstruction","dataType":"Int32","description":[{"value":"The optional DayOfConstrucition provides the day of the month in which the manufacturing process of the machine has been completed. It shall be a number and never change during the life-cycle of a machine."}],"displayName":[{"value":"DayOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10910","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:DeviceClass","dataType":"String","description":[{"value":"Domain or for what purpose this item is used."}],"displayName":[{"value":"DeviceClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10898","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003EPump\u003C/uax:String\u003E"},{"browseName":"1:FabricationNumber","dataType":"String","description":[{"value":"Alphanumeric character sequence assigned to a fabricated product, which allows the date, time and circumstances of fabrication to be traced."}],"displayName":[{"value":"FabricationNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10911","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GTINCode","dataType":"String","description":[{"value":"Bar code number that identifies the device based on the Global Trade Item Number system."}],"displayName":[{"value":"GTINCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10912","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:HardwareRevision","dataType":"String","description":[{"locale":"en","value":"A string representation of the revision level of the hardware of a MachineryItem. Hardware is physical equipment, as opposed to programs, procedures, rules and associated documentation. Many machines will not provide such information due to the modular and configurable nature of the machine."}],"displayName":[{"value":"HardwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10899","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:InitialOperationDate","dataType":"DateTime","description":[{"locale":"en","value":"The date, when the MachineryItem was switched on the first time after it has left the manufacturer plant."}],"displayName":[{"value":"InitialOperationDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10900","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"2:Location","dataType":"String","description":[{"locale":"en","value":"To be used by end users to store the location of the machine in a scheme specific to the end user. Servers shall support at least 60 Unicode characters for the clients writing this value, this means clients can expect to be able to write strings with a length of 60 Unicode characters into that field."}],"displayName":[{"value":"Location"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10901","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:Manufacturer","dataType":"LocalizedText","description":[{"locale":"en","value":"A human-readable, localized name of the manufacturer of the MachineryItem."}],"displayName":[{"value":"Manufacturer"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9747","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:ManufacturerUri","dataType":"String","description":[{"locale":"en","value":"A globally unique identifier of the manufacturer of the MachineryItem."}],"displayName":[{"value":"ManufacturerUri"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10902","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Markings","description":[{"value":"Safety instructions for safe use, e.g. temperature and pressure resistance, electrostatic charge, high voltage, radioactivity, explosive protection."}],"displayName":[{"value":"Markings"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5163","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasComponent","target":"ns=1;i=5238"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5120"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1002"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"ns=1;i=1002"},{"browseName":"1:\u003CMarking\u003E","displayName":[{"value":"\u003CMarking\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5238","parentNodeId":"ns=1;i=5163","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5163"},{"referenceType":"HasComponent","target":"ns=1;i=12929"},{"referenceType":"HasTypeDefinition","target":"i=11575"},{"referenceType":"HasComponent","target":"ns=1;i=12931"},{"referenceType":"HasProperty","target":"ns=1;i=12934"},{"referenceType":"HasComponent","target":"ns=1;i=12935"},{"referenceType":"HasProperty","target":"ns=1;i=12938"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=12939"},{"referenceType":"HasComponent","target":"ns=1;i=12942"},{"referenceType":"HasProperty","target":"ns=1;i=12944"},{"referenceType":"HasProperty","target":"ns=1;i=12945"},{"referenceType":"HasProperty","target":"ns=1;i=12946"},{"referenceType":"HasComponent","target":"ns=1;i=12947"}],"symbolicName":"Marking","typeDefinition":"i=11575"},{"browseName":"Close","displayName":[{"value":"Close"}],"methodDeclarationId":"i=11583","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=12929","parentNodeId":"ns=1;i=5238","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5238"},{"referenceType":"HasProperty","target":"ns=1;i=12930"},{"referenceType":"HasModellingRule","target":"i=78"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12930","parentNodeId":"ns=1;i=12929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12929"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"GetPosition","displayName":[{"value":"GetPosition"}],"methodDeclarationId":"i=11590","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=12931","parentNodeId":"ns=1;i=5238","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5238"},{"referenceType":"HasProperty","target":"ns=1;i=12932"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=12933"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12932","parentNodeId":"ns=1;i=12931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12931"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12933","parentNodeId":"ns=1;i=12931","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12931"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"MimeType","dataType":"String","displayName":[{"value":"MimeType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12934","parentNodeId":"ns=1;i=5238","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5238"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Open","displayName":[{"value":"Open"}],"methodDeclarationId":"i=11580","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=12935","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasProperty","target":"ns=1;i=12936"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5238"},{"referenceType":"HasProperty","target":"ns=1;i=12937"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12936","parentNodeId":"ns=1;i=12935","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12935"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EMode\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=3\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12937","parentNodeId":"ns=1;i=12935","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12935"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"OpenCount","dataType":"UInt16","displayName":[{"value":"OpenCount"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12938","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5238"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"Read","displayName":[{"value":"Read"}],"methodDeclarationId":"i=11585","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=12939","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasProperty","target":"ns=1;i=12940"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=12941"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5238"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12940","parentNodeId":"ns=1;i=12939","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12939"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003ELength\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=6\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"arrayDimensions":"0","browseName":"OutputArguments","dataType":"Argument","displayName":[{"value":"OutputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12941","parentNodeId":"ns=1;i=12939","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12939"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"SetPosition","displayName":[{"value":"SetPosition"}],"methodDeclarationId":"i=11593","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=12942","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasProperty","target":"ns=1;i=12943"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5238"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12943","parentNodeId":"ns=1;i=12942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12942"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EPosition\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=9\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"Size","dataType":"UInt64","displayName":[{"value":"Size"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12944","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5238"}],"typeDefinition":"i=68"},{"browseName":"UserWritable","dataType":"Boolean","displayName":[{"value":"UserWritable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12945","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5238"}],"typeDefinition":"i=68"},{"browseName":"Writable","dataType":"Boolean","displayName":[{"value":"Writable"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12946","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5238"}],"typeDefinition":"i=68"},{"browseName":"Write","displayName":[{"value":"Write"}],"methodDeclarationId":"i=11588","modellingRule":"Mandatory","nodeClass":"Method","nodeId":"ns=1;i=12947","parentNodeId":"ns=1;i=5238","references":[{"referenceType":"HasProperty","target":"ns=1;i=12948"},{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5238"}]},{"arrayDimensions":"0","browseName":"InputArguments","dataType":"Argument","displayName":[{"value":"InputArguments"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=12948","parentNodeId":"ns=1;i=12947","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12947"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EFileHandle\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=7\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003Cuax:ExtensionObject\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=297\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Argument\u003E\n \u003Cuax:Name\u003EData\u003C/uax:Name\u003E\n \u003Cuax:DataType\u003E\n \u003Cuax:Identifier\u003Ei=15\u003C/uax:Identifier\u003E\n \u003C/uax:DataType\u003E\n \u003Cuax:ValueRank\u003E-1\u003C/uax:ValueRank\u003E\n \u003Cuax:ArrayDimensions /\u003E\n \u003Cuax:Description /\u003E\n \u003C/uax:Argument\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E\n \u003C/uax:ListOfExtensionObject\u003E"},{"browseName":"3:Model","dataType":"LocalizedText","description":[{"locale":"en","value":"A human-readable, localized name of the model of the MachineryItem."}],"displayName":[{"value":"Model"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10903","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"2:MonthOfConstruction","dataType":"Byte","description":[{"locale":"en","value":"The month in which the manufacturing process of the MachineryItem has been completed. It shall be a number between 1 and 12, representing the month from January to December."}],"displayName":[{"value":"MonthOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10904","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NationalStockNumber","dataType":"String","description":[{"value":"13-digit numeric code, identifying all \u0027standardized material items of supply\u0027 as recognized by the United States Department of Defense."}],"displayName":[{"value":"NationalStockNumber"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10913","parentNodeId":"ns=1;i=5120","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OrderProductCode","dataType":"String","description":[{"value":"Unique combination of numbers and letters used to order the device."}],"displayName":[{"value":"OrderProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10914","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PhysicalAddress","dataType":"PhysicalAddressDataType","description":[{"value":"Physical address of the manufacturer."}],"displayName":[{"value":"PhysicalAddress"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10915","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ens=1;i=5017\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003CPhysicalAddressDataType xmlns=\u0022http://opcfoundation.org/UA/Pumps/Types.xsd\u0022\u003E\n \u003CEncodingMask\u003E0\u003C/EncodingMask\u003E\n \u003C/PhysicalAddressDataType\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"3:ProductCode","dataType":"String","description":[{"locale":"en","value":"A machine-readable string of the model of the MachineryItem, that might include options like the hardware configuration of the model. This information might be provided by the ERP system of the vendor. For example, it can be used as order information."}],"displayName":[{"value":"ProductCode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10905","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:ProductInstanceUri","dataType":"String","description":[{"locale":"en","value":"A globally unique resource identifier provided by the manufacturer of the machine"}],"displayName":[{"locale":"en","value":"ProductInstanceUri"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9748","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:SerialNumber","dataType":"String","description":[{"locale":"en","value":"A string containing a unique production number of the manufacturer of the MachineryItem. The global uniqueness of the serial number is only given in the context of the manufacturer, and potentially the model. The value shall not change during the life-cycle of the MachineryItem."}],"displayName":[{"value":"SerialNumber"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=9749","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"}],"typeDefinition":"i=68"},{"browseName":"3:SoftwareRevision","dataType":"String","description":[{"locale":"en","value":"A string representation of the revision level of a MachineryItem. In most cases, MachineryItems consist of several software components. In that case, information about the software components might be provided as additional information in the address space, including individual revision information. In that case, this property is either not provided or provides an overall software revision level. The value might change during the life-cycle of a MachineryItem."}],"displayName":[{"value":"SoftwareRevision"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10906","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"}],"typeDefinition":"i=68"},{"browseName":"1:Supplier","dataType":"String","description":[{"value":"Name of the supplier or vendor of a device."}],"displayName":[{"value":"Supplier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10916","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"}],"typeDefinition":"i=68"},{"browseName":"1:TypeOfProduct","dataType":"String","description":[{"value":"Characterisation of the device based on its usage, operation principle, and its fabricated form."}],"displayName":[{"value":"TypeOfProduct"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10917","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"}],"typeDefinition":"i=68"},{"browseName":"2:YearOfConstruction","dataType":"UInt16","description":[{"locale":"en","value":"The year (Gregorian calendar) in which the manufacturing process of the MachineryItem has been completed. It shall be a four-digit number and never change during the life-cycle of a MachineryItem."}],"displayName":[{"value":"YearOfConstruction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10907","parentNodeId":"ns=1;i=5120","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5120"}],"typeDefinition":"i=68"},{"browseName":"3:Maintenance","description":[{"value":"Maintenance data of a pump."}],"displayName":[{"value":"Maintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5121","parentNodeId":"ns=1;i=1052","references":[{"referenceType":"HasComponent","target":"ns=1;i=5164"},{"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasComponent","target":"ns=1;i=5166"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5167"}],"typeDefinition":"ns=1;i=1011"},{"browseName":"1:BreakdownMaintenance","description":[{"value":"Properties for breakdown maintenance."}],"displayName":[{"value":"BreakdownMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5164","parentNodeId":"ns=1;i=5121","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5121"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1010"},{"referenceType":"HasComponent","target":"ns=1;i=10919"},{"referenceType":"HasComponent","target":"ns=1;i=10920"},{"referenceType":"HasComponent","target":"ns=1;i=10921"},{"referenceType":"HasComponent","target":"ns=1;i=10924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10925"}],"typeDefinition":"ns=1;i=1010"},{"browseName":"1:CorrectiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the maintenance time when active corrective maintenance is carried out on an item, including technical, logistic and internal administrative delays"}],"displayName":[{"value":"CorrectiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10919","parentNodeId":"ns=1;i=5164","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5164"},{"referenceType":"HasProperty","target":"ns=1;i=11385"},{"referenceType":"HasProperty","target":"ns=1;i=11386"},{"referenceType":"HasProperty","target":"ns=1;i=11387"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11385","parentNodeId":"ns=1;i=10919","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10919"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11386","parentNodeId":"ns=1;i=10919","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10919"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11387","parentNodeId":"ns=1;i=10919","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10919"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Criticality","dataType":"Double","description":[{"value":"Index of the severity of an effect combined with the probability of expected frequency of its occurrence"}],"displayName":[{"value":"Criticality"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10920","parentNodeId":"ns=1;i=5164","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5164"},{"referenceType":"HasProperty","target":"ns=1;i=11388"},{"referenceType":"HasProperty","target":"ns=1;i=11390"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11388","parentNodeId":"ns=1;i=10920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10920"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11390","parentNodeId":"ns=1;i=10920","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10920"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Failure","dataType":"Boolean","description":[{"value":"Termination of the ability of an item to perform a required function. A \u0022True\u0022 status means that the pump has a failure and a \u0022False\u0022 status means that the pump has no failure."}],"displayName":[{"value":"Failure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10921","parentNodeId":"ns=1;i=5164","references":[{"referenceType":"HasProperty","target":"ns=1;i=11395"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5164"},{"referenceType":"HasProperty","target":"ns=1;i=10922"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10923"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11395","parentNodeId":"ns=1;i=10921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10922","parentNodeId":"ns=1;i=10921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10921"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10923","parentNodeId":"ns=1;i=10921","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10921"}],"typeDefinition":"i=68"},{"browseName":"1:NumberOfFailures","dataType":"Int32","description":[{"value":"Number of failures of an object"}],"displayName":[{"value":"NumberOfFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10924","parentNodeId":"ns=1;i=5164","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11391"},{"referenceType":"HasProperty","target":"ns=1;i=11393"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5164"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11391","parentNodeId":"ns=1;i=10924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11393","parentNodeId":"ns=1;i=10924","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10924"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Severity","dataType":"String","description":[{"value":"Extent of loss, damage or harm caused by a fault or failure"}],"displayName":[{"value":"Severity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10925","parentNodeId":"ns=1;i=5164","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11394"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5164"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11394","parentNodeId":"ns=1;i=10925","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10925"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ConditionBasedMaintenance","description":[{"value":"Properties for condition based maintenance."}],"displayName":[{"value":"ConditionBasedMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5165","parentNodeId":"ns=1;i=5121","references":[{"referenceType":"HasComponent","target":"ns=1;i=10926"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5121"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1008"},{"referenceType":"HasComponent","target":"ns=1;i=10927"},{"referenceType":"HasComponent","target":"ns=1;i=10928"},{"referenceType":"HasComponent","target":"ns=1;i=10929"},{"referenceType":"HasComponent","target":"ns=1;i=10930"},{"referenceType":"HasComponent","target":"ns=1;i=10931"},{"referenceType":"HasComponent","target":"ns=1;i=10932"},{"referenceType":"HasComponent","target":"ns=1;i=14642"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10933"},{"referenceType":"HasComponent","target":"ns=1;i=10934"},{"referenceType":"HasComponent","target":"ns=1;i=10935"}],"typeDefinition":"ns=1;i=1008"},{"browseName":"1:Availability","dataType":"Double","description":[{"value":"Probability that a machine will, when used under specified conditions, operate satisfactorily and effectively"}],"displayName":[{"value":"Availability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10926","parentNodeId":"ns=1;i=5165","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13027"},{"referenceType":"HasProperty","target":"ns=1;i=13028"},{"referenceType":"HasProperty","target":"ns=1;i=13029"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13027","parentNodeId":"ns=1;i=10926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13028","parentNodeId":"ns=1;i=10926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13029","parentNodeId":"ns=1;i=10926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Durability","dataType":"Double","description":[{"value":"Actual reliability of an item considering operating modes, operating conditions and possible preventive maintenance actions carried out"}],"displayName":[{"value":"Durability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10927","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13030"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasProperty","target":"ns=1;i=13031"},{"referenceType":"HasProperty","target":"ns=1;i=13032"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13030","parentNodeId":"ns=1;i=10927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13031","parentNodeId":"ns=1;i=10927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13032","parentNodeId":"ns=1;i=10927","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10927"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ExpectedReliability","dataType":"Double","description":[{"value":"Reliability of an item determined by design and manufacture under expected conditions of operation and maintenance"}],"displayName":[{"value":"ExpectedReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10928","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13033"},{"referenceType":"HasProperty","target":"ns=1;i=13034"},{"referenceType":"HasProperty","target":"ns=1;i=13035"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13033","parentNodeId":"ns=1;i=10928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13034","parentNodeId":"ns=1;i=10928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13035","parentNodeId":"ns=1;i=10928","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10928"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InstantaneousAvailability","dataType":"Double","description":[{"value":"Probability that an item is in a state to perform as required at a given instant, under given conditions, assuming that the necessary external resources are provided"}],"displayName":[{"value":"InstantaneousAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10929","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13036"},{"referenceType":"HasProperty","target":"ns=1;i=13037"},{"referenceType":"HasProperty","target":"ns=1;i=13038"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13036","parentNodeId":"ns=1;i=10929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13037","parentNodeId":"ns=1;i=10929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13038","parentNodeId":"ns=1;i=10929","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10929"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IntrinsicMaintainability","dataType":"Double","description":[{"value":"Maintainability of an item determined by the design under expected conditions of maintenance and logistic support"}],"displayName":[{"value":"IntrinsicMaintainability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10930","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13039"},{"referenceType":"HasProperty","target":"ns=1;i=13040"},{"referenceType":"HasProperty","target":"ns=1;i=13041"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13039","parentNodeId":"ns=1;i=10930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13040","parentNodeId":"ns=1;i=10930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13041","parentNodeId":"ns=1;i=10930","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10930"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IntrinsicReliability","dataType":"Double","description":[{"value":"Reliability of an item determined by design and manufacture under expected conditions of operation assuming that no preventive maintenance task is carried out, excepting routine maintenance"}],"displayName":[{"value":"IntrinsicReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10931","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13042"},{"referenceType":"HasProperty","target":"ns=1;i=13043"},{"referenceType":"HasProperty","target":"ns=1;i=13044"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13042","parentNodeId":"ns=1;i=10931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13043","parentNodeId":"ns=1;i=10931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13044","parentNodeId":"ns=1;i=10931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Maintainability","dataType":"Double","description":[{"value":"Ability of a machine or part of a system to be retained in, or restored to, a state in which it can perform the required function(s)"}],"displayName":[{"value":"Maintainability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10932","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13045"},{"referenceType":"HasProperty","target":"ns=1;i=13046"},{"referenceType":"HasProperty","target":"ns=1;i=13047"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13045","parentNodeId":"ns=1;i=10932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13046","parentNodeId":"ns=1;i=10932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13047","parentNodeId":"ns=1;i=10932","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10932"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperationalReliability","dataType":"Double","description":[{"value":"Actual reliability of an item considering operating modes, operating conditions and possible preventive maintenance actions carried out"}],"displayName":[{"value":"OperationalReliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14642","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14646"},{"referenceType":"HasProperty","target":"ns=1;i=14647"},{"referenceType":"HasProperty","target":"ns=1;i=14648"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14646","parentNodeId":"ns=1;i=14642","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14642"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14647","parentNodeId":"ns=1;i=14642","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14642"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14648","parentNodeId":"ns=1;i=14642","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14642"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProductionBasedAvailability","dataType":"Double","description":[{"value":"Ratio of actual production to required production, or any other reference level, over a specified period of time"}],"displayName":[{"value":"ProductionBasedAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10933","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13048"},{"referenceType":"HasProperty","target":"ns=1;i=13049"},{"referenceType":"HasProperty","target":"ns=1;i=13050"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13048","parentNodeId":"ns=1;i=10933","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10933"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13049","parentNodeId":"ns=1;i=10933","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10933"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13050","parentNodeId":"ns=1;i=10933","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10933"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Reliability","dataType":"Double","description":[{"value":"Probability that a machine will perform its required functions without failure for a specified time period when used under specified conditions"}],"displayName":[{"value":"Reliability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10934","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13051"},{"referenceType":"HasProperty","target":"ns=1;i=13052"},{"referenceType":"HasProperty","target":"ns=1;i=13053"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13051","parentNodeId":"ns=1;i=10934","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10934"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13052","parentNodeId":"ns=1;i=10934","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10934"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13053","parentNodeId":"ns=1;i=10934","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10934"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeBasedAvailability","dataType":"Double","description":[{"value":"During a given period of time, percentage of the time during which an item was able to perform when required"}],"displayName":[{"value":"TimeBasedAvailability"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10935","parentNodeId":"ns=1;i=5165","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13054"},{"referenceType":"HasProperty","target":"ns=1;i=13055"},{"referenceType":"HasProperty","target":"ns=1;i=13056"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5165"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13054","parentNodeId":"ns=1;i=10935","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10935"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13055","parentNodeId":"ns=1;i=10935","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10935"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13056","parentNodeId":"ns=1;i=10935","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10935"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:GeneralMaintenance","description":[{"value":"General maintenance properties."}],"displayName":[{"value":"GeneralMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5166","parentNodeId":"ns=1;i=5121","references":[{"referenceType":"HasComponent","target":"ns=1;i=10936"},{"referenceType":"HasComponent","target":"ns=1;i=14599"},{"referenceType":"HasComponent","target":"ns=1;i=14600"},{"referenceType":"HasComponent","target":"ns=1;i=10937"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5121"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1007"},{"referenceType":"HasComponent","target":"ns=1;i=14601"},{"referenceType":"HasComponent","target":"ns=1;i=10938"},{"referenceType":"HasComponent","target":"ns=1;i=10939"},{"referenceType":"HasComponent","target":"ns=1;i=10940"},{"referenceType":"HasComponent","target":"ns=1;i=10941"},{"referenceType":"HasComponent","target":"ns=1;i=10942"},{"referenceType":"HasComponent","target":"ns=1;i=10943"},{"referenceType":"HasComponent","target":"ns=1;i=14602"},{"referenceType":"HasComponent","target":"ns=1;i=10946"},{"referenceType":"HasComponent","target":"ns=1;i=10947"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=10948"},{"referenceType":"HasComponent","target":"ns=1;i=14603"},{"referenceType":"HasComponent","target":"ns=1;i=10949"},{"referenceType":"HasComponent","target":"ns=1;i=10950"},{"referenceType":"HasComponent","target":"ns=1;i=10951"},{"referenceType":"HasComponent","target":"ns=1;i=14604"}],"typeDefinition":"ns=1;i=1007"},{"browseName":"1:ActiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the maintenance time when active maintenance is carried out on an item."}],"displayName":[{"value":"ActiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10936","parentNodeId":"ns=1;i=5166","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12952"},{"referenceType":"HasProperty","target":"ns=1;i=12953"},{"referenceType":"HasProperty","target":"ns=1;i=12954"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12952","parentNodeId":"ns=1;i=10936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12953","parentNodeId":"ns=1;i=10936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12954","parentNodeId":"ns=1;i=10936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:DownTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in a down state"}],"displayName":[{"value":"DownTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14599","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14623"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasProperty","target":"ns=1;i=14624"},{"referenceType":"HasProperty","target":"ns=1;i=14625"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14623","parentNodeId":"ns=1;i=14599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14624","parentNodeId":"ns=1;i=14599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14625","parentNodeId":"ns=1;i=14599","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14599"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ExternalDisabledTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an external disabled state"}],"displayName":[{"value":"ExternalDisabledTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14600","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14626"},{"referenceType":"HasProperty","target":"ns=1;i=14627"},{"referenceType":"HasProperty","target":"ns=1;i=14628"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14626","parentNodeId":"ns=1;i=14600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14627","parentNodeId":"ns=1;i=14600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14628","parentNodeId":"ns=1;i=14600","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14600"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FailureRate","dataType":"Double","description":[{"value":"Number of failures within a population divided by the number of life units used by that population"}],"displayName":[{"value":"FailureRate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10937","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12955"},{"referenceType":"HasProperty","target":"ns=1;i=12956"},{"referenceType":"HasProperty","target":"ns=1;i=12957"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12955","parentNodeId":"ns=1;i=10937","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10937"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12956","parentNodeId":"ns=1;i=10937","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10937"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12957","parentNodeId":"ns=1;i=10937","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10937"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:IdleTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an idle state"}],"displayName":[{"value":"IdleTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14601","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14629"},{"referenceType":"HasProperty","target":"ns=1;i=14630"},{"referenceType":"HasProperty","target":"ns=1;i=14631"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14629","parentNodeId":"ns=1;i=14601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14630","parentNodeId":"ns=1;i=14601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14631","parentNodeId":"ns=1;i=14601","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14601"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceLevel","dataType":"MaintenanceLevelEnum","description":[{"value":"Maintenance task categorization by complexity"}],"displayName":[{"value":"MaintenanceLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10938","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12951"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12951","parentNodeId":"ns=1;i=10938","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10938"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaintenanceTime","dataType":"Double","description":[{"value":"Time interval when maintenance is carried out on an item including technical, logistic and internal administrative delays"}],"displayName":[{"value":"MaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10939","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12958"},{"referenceType":"HasProperty","target":"ns=1;i=12959"},{"referenceType":"HasProperty","target":"ns=1;i=12960"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12958","parentNodeId":"ns=1;i=10939","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10939"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12959","parentNodeId":"ns=1;i=10939","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10939"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12960","parentNodeId":"ns=1;i=10939","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10939"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanOperatingTimeBetweenFailures","dataType":"Double","description":[{"value":"Average of the operating times between failures"}],"displayName":[{"value":"MeanOperatingTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10940","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12961"},{"referenceType":"HasProperty","target":"ns=1;i=12962"},{"referenceType":"HasProperty","target":"ns=1;i=12963"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12961","parentNodeId":"ns=1;i=10940","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10940"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12962","parentNodeId":"ns=1;i=10940","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10940"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12963","parentNodeId":"ns=1;i=10940","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10940"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanRepairTime","dataType":"Double","description":[{"value":"Average of the repair times"}],"displayName":[{"value":"MeanRepairTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10941","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12964"},{"referenceType":"HasProperty","target":"ns=1;i=12965"},{"referenceType":"HasProperty","target":"ns=1;i=12966"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12964","parentNodeId":"ns=1;i=10941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12965","parentNodeId":"ns=1;i=10941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12966","parentNodeId":"ns=1;i=10941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MeanTimeToRestauration","dataType":"Double","description":[{"value":"Average of the time to restauration"}],"displayName":[{"value":"MeanTimeToRestauration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10942","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12967"},{"referenceType":"HasProperty","target":"ns=1;i=12968"},{"referenceType":"HasProperty","target":"ns=1;i=12969"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12967","parentNodeId":"ns=1;i=10942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10942"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12968","parentNodeId":"ns=1;i=10942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10942"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12969","parentNodeId":"ns=1;i=10942","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10942"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Obsolescence","dataType":"Boolean","description":[{"value":"Inability of an item to be maintained due to the unavailability on the market of the necessary resources at acceptable technical and/or economic conditions. A \u0022True\u0022 status means that the pump is obsolete and a \u0022False\u0022 status means that the pump is not obsolete."}],"displayName":[{"value":"Obsolescence"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10943","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasProperty","target":"ns=1;i=12985"},{"referenceType":"HasProperty","target":"ns=1;i=10944"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=10945"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12985","parentNodeId":"ns=1;i=10943","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10943"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10944","parentNodeId":"ns=1;i=10943","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10943"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=10945","parentNodeId":"ns=1;i=10943","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10943"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in operating state"}],"displayName":[{"value":"OperatingTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14602","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14632"},{"referenceType":"HasProperty","target":"ns=1;i=14633"},{"referenceType":"HasProperty","target":"ns=1;i=14634"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14632","parentNodeId":"ns=1;i=14602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14633","parentNodeId":"ns=1;i=14602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14634","parentNodeId":"ns=1;i=14602","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14602"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTimeBetweenFailures","dataType":"Double","description":[{"value":"Operating time between consecutive failures"}],"displayName":[{"value":"OperatingTimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10946","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12970"},{"referenceType":"HasProperty","target":"ns=1;i=12971"},{"referenceType":"HasProperty","target":"ns=1;i=12972"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12970","parentNodeId":"ns=1;i=10946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12971","parentNodeId":"ns=1;i=10946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12972","parentNodeId":"ns=1;i=10946","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10946"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OperatingTimeToFailure","dataType":"Double","description":[{"value":"Operating time accumulated from the first use, or from restoration, until failure"}],"displayName":[{"value":"OperatingTimeToFailure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10947","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12973"},{"referenceType":"HasProperty","target":"ns=1;i=12974"},{"referenceType":"HasProperty","target":"ns=1;i=12975"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12973","parentNodeId":"ns=1;i=10947","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10947"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12974","parentNodeId":"ns=1;i=10947","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10947"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12975","parentNodeId":"ns=1;i=10947","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10947"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RepairTime","dataType":"Double","description":[{"value":"Part of corrective maintenance time when repair is carried out on an item."}],"displayName":[{"value":"RepairTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10948","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12976"},{"referenceType":"HasProperty","target":"ns=1;i=12977"},{"referenceType":"HasProperty","target":"ns=1;i=12978"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12976","parentNodeId":"ns=1;i=10948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12977","parentNodeId":"ns=1;i=10948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12978","parentNodeId":"ns=1;i=10948","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10948"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:StandbyTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in a standby state"}],"displayName":[{"value":"StandbyTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14603","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14635"},{"referenceType":"HasProperty","target":"ns=1;i=14636"},{"referenceType":"HasProperty","target":"ns=1;i=14637"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14635","parentNodeId":"ns=1;i=14603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14636","parentNodeId":"ns=1;i=14603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14637","parentNodeId":"ns=1;i=14603","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14603"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:StateOfTheItem","dataType":"StateOfTheItemEnum","description":[{"value":"Current state of the item"}],"displayName":[{"value":"StateOfTheItem"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10949","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12950"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12950","parentNodeId":"ns=1;i=10949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeBetweenFailures","dataType":"Double","description":[{"value":"Duration between consecutive failures"}],"displayName":[{"value":"TimeBetweenFailures"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10950","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12979"},{"referenceType":"HasProperty","target":"ns=1;i=12980"},{"referenceType":"HasProperty","target":"ns=1;i=12981"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12979","parentNodeId":"ns=1;i=10950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12980","parentNodeId":"ns=1;i=10950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12981","parentNodeId":"ns=1;i=10950","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10950"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TimeToRestoration","dataType":"Double","description":[{"value":"Time interval, from the instant of failure, until restoration"}],"displayName":[{"value":"TimeToRestoration"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10951","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12982"},{"referenceType":"HasProperty","target":"ns=1;i=12983"},{"referenceType":"HasProperty","target":"ns=1;i=12984"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12982","parentNodeId":"ns=1;i=10951","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12983","parentNodeId":"ns=1;i=10951","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12984","parentNodeId":"ns=1;i=10951","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10951"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:UpTime","dataType":"Double","description":[{"value":"Measured time interval throughout which an item is in an up state"}],"displayName":[{"value":"UpTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14604","parentNodeId":"ns=1;i=5166","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14638"},{"referenceType":"HasProperty","target":"ns=1;i=14639"},{"referenceType":"HasProperty","target":"ns=1;i=14640"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5166"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14638","parentNodeId":"ns=1;i=14604","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14639","parentNodeId":"ns=1;i=14604","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14640","parentNodeId":"ns=1;i=14604","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14604"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PreventiveMaintenance","description":[{"value":"Properties for preventive maintenance."}],"displayName":[{"value":"PreventiveMaintenance"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5167","parentNodeId":"ns=1;i=5121","references":[{"referenceType":"HasComponent","target":"ns=1;i=10952"},{"referenceType":"HasComponent","target":"ns=1;i=10953"},{"referenceType":"HasComponent","target":"ns=1;i=10954"},{"referenceType":"HasComponent","target":"ns=1;i=10955"},{"referenceType":"HasComponent","target":"ns=1;i=10956"},{"referenceType":"HasComponent","target":"ns=1;i=10957"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5121"},{"referenceType":"HasComponent","target":"ns=1;i=10958"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1009"}],"typeDefinition":"ns=1;i=1009"},{"accessLevel":3,"browseName":"1:ActivePreventiveMaintenanceTime","dataType":"Double","description":[{"value":"This attribute indicates the date of installation or commissioning of the device."}],"displayName":[{"value":"ActivePreventiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10952","parentNodeId":"ns=1;i=5167","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11374"},{"referenceType":"HasProperty","target":"ns=1;i=11375"},{"referenceType":"HasProperty","target":"ns=1;i=11376"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11374","parentNodeId":"ns=1;i=10952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11375","parentNodeId":"ns=1;i=10952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11376","parentNodeId":"ns=1;i=10952","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10952"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:InstallationDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device was last inspected."}],"displayName":[{"value":"InstallationDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10953","parentNodeId":"ns=1;i=5167","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11380"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11380","parentNodeId":"ns=1;i=10953","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10953"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:LastInspectionDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device is scheduled for the next inspection."}],"displayName":[{"value":"LastInspectionDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10954","parentNodeId":"ns=1;i=5167","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11381"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11381","parentNodeId":"ns=1;i=10954","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10954"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:LastServicingDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device is scheduled for the next servicing."}],"displayName":[{"value":"LastServicingDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10955","parentNodeId":"ns=1;i=5167","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11382"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11382","parentNodeId":"ns=1;i=10955","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10955"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NextInspectionDate","dataType":"DateTime","description":[{"value":"This attribute identifies the date when the device was last serviced."}],"displayName":[{"value":"NextInspectionDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10956","parentNodeId":"ns=1;i=5167","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11383"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11383","parentNodeId":"ns=1;i=10956","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10956"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NextServicingDate","dataType":"DateTime","description":[{"value":"Part of maintenance time when preventive maintenance is carried out on an item, including technical, logistic and internal administrative delays"}],"displayName":[{"value":"NextServicingDate"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10957","parentNodeId":"ns=1;i=5167","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11384"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11384","parentNodeId":"ns=1;i=10957","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10957"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PreventiveMaintenanceTime","dataType":"Double","description":[{"value":"Part of the active maintenance time taken to perform a preventive maintenance"}],"displayName":[{"value":"PreventiveMaintenanceTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10958","parentNodeId":"ns=1;i=5167","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11377"},{"referenceType":"HasProperty","target":"ns=1;i=11378"},{"referenceType":"HasProperty","target":"ns=1;i=11379"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5167"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11377","parentNodeId":"ns=1;i=10958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11378","parentNodeId":"ns=1;i=10958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11379","parentNodeId":"ns=1;i=10958","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10958"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"3:Operational","description":[{"value":"Process data for control, actuation, signals, and measurements of the pump."}],"displayName":[{"value":"Operational"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5122","parentNodeId":"ns=1;i=1052","references":[{"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasComponent","target":"ns=1;i=5233"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1053"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=5236"}],"typeDefinition":"ns=1;i=1053"},{"browseName":"1:BypassActuation","description":[{"value":"Actuation parameters for a bypass valve of a pump."}],"displayName":[{"value":"BypassActuation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5230","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1025"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasComponent","target":"ns=1;i=11301"},{"referenceType":"HasComponent","target":"ns=1;i=11304"},{"referenceType":"HasComponent","target":"ns=1;i=11305"},{"referenceType":"HasComponent","target":"ns=1;i=11307"},{"referenceType":"HasComponent","target":"ns=1;i=11308"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11311"},{"referenceType":"HasComponent","target":"ns=1;i=11313"}],"typeDefinition":"ns=1;i=1025"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11301","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasProperty","target":"ns=1;i=11645"},{"referenceType":"HasProperty","target":"ns=1;i=11302"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11303"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11645","parentNodeId":"ns=1;i=11301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11301"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11302","parentNodeId":"ns=1;i=11301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11301"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11303","parentNodeId":"ns=1;i=11301","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11301"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11304","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11646"},{"referenceType":"HasProperty","target":"ns=1;i=11647"},{"referenceType":"HasProperty","target":"ns=1;i=11648"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11646","parentNodeId":"ns=1;i=11304","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11304"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11647","parentNodeId":"ns=1;i=11304","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11304"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11648","parentNodeId":"ns=1;i=11304","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11304"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11305","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11649"},{"referenceType":"HasProperty","target":"ns=1;i=11306"},{"referenceType":"HasProperty","target":"ns=1;i=11650"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11649","parentNodeId":"ns=1;i=11305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11306","parentNodeId":"ns=1;i=11305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11305"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11650","parentNodeId":"ns=1;i=11305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11307","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11653"},{"referenceType":"HasProperty","target":"ns=1;i=11654"},{"referenceType":"HasProperty","target":"ns=1;i=11655"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11653","parentNodeId":"ns=1;i=11307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11307"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11654","parentNodeId":"ns=1;i=11307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11307"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11655","parentNodeId":"ns=1;i=11307","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11307"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11308","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasProperty","target":"ns=1;i=11643"},{"referenceType":"HasProperty","target":"ns=1;i=11309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11310"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11643","parentNodeId":"ns=1;i=11308","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11308"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11309","parentNodeId":"ns=1;i=11308","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11308"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11310","parentNodeId":"ns=1;i=11308","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11308"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11311","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11651"},{"referenceType":"HasProperty","target":"ns=1;i=11312"},{"referenceType":"HasProperty","target":"ns=1;i=11652"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11651","parentNodeId":"ns=1;i=11311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11312","parentNodeId":"ns=1;i=11311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11311"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11652","parentNodeId":"ns=1;i=11311","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11311"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11313","parentNodeId":"ns=1;i=5230","references":[{"referenceType":"HasProperty","target":"ns=1;i=11644"},{"referenceType":"HasProperty","target":"ns=1;i=11314"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5230"},{"referenceType":"HasProperty","target":"ns=1;i=11315"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11644","parentNodeId":"ns=1;i=11313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11313"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11314","parentNodeId":"ns=1;i=11313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11313"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11315","parentNodeId":"ns=1;i=11313","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11313"}],"typeDefinition":"i=68"},{"browseName":"1:Control","description":[{"value":"Control parameters for a pump."}],"displayName":[{"value":"Control"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5231","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasComponent","target":"ns=1;i=11316"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasComponent","target":"ns=1;i=11317"},{"referenceType":"HasComponent","target":"ns=1;i=11318"},{"referenceType":"HasComponent","target":"ns=1;i=11319"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1021"},{"referenceType":"HasComponent","target":"ns=1;i=11320"},{"referenceType":"HasComponent","target":"ns=1;i=11321"},{"referenceType":"HasComponent","target":"ns=1;i=11322"},{"referenceType":"HasComponent","target":"ns=1;i=11323"},{"referenceType":"HasComponent","target":"ns=1;i=11324"},{"referenceType":"HasComponent","target":"ns=1;i=11325"},{"referenceType":"HasComponent","target":"ns=1;i=11326"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11327"},{"referenceType":"HasComponent","target":"ns=1;i=11328"}],"typeDefinition":"ns=1;i=1021"},{"accessLevel":3,"browseName":"1:CommandVariable","dataType":"Double","description":[{"value":"Variable quantity, which is not influenced by the control but is introduced into the control system from outside with the aim of making the final controlled variable follow it in a given relationship"}],"displayName":[{"value":"CommandVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11316","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasProperty","target":"ns=1;i=13816"},{"referenceType":"HasProperty","target":"ns=1;i=13817"},{"referenceType":"HasProperty","target":"ns=1;i=13818"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13816","parentNodeId":"ns=1;i=11316","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11316"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13817","parentNodeId":"ns=1;i=11316","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11316"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13818","parentNodeId":"ns=1;i=11316","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11316"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlDifferenceVariable","dataType":"Double","description":[{"value":"Difference between the reference variable and the feedback variable"}],"displayName":[{"value":"ControlDifferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11317","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasProperty","target":"ns=1;i=13841"},{"referenceType":"HasProperty","target":"ns=1;i=13842"},{"referenceType":"HasProperty","target":"ns=1;i=13843"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13841","parentNodeId":"ns=1;i=11317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11317"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13842","parentNodeId":"ns=1;i=11317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11317"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13843","parentNodeId":"ns=1;i=11317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11317"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControlledVariable","dataType":"Double","description":[{"value":"Output variable of the controlled system that will be acted upon by one or more manipulated variables"}],"displayName":[{"value":"ControlledVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11318","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasProperty","target":"ns=1;i=13844"},{"referenceType":"HasProperty","target":"ns=1;i=13845"},{"referenceType":"HasProperty","target":"ns=1;i=13846"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13844","parentNodeId":"ns=1;i=11318","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11318"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13845","parentNodeId":"ns=1;i=11318","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11318"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13846","parentNodeId":"ns=1;i=11318","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11318"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ControllerOutputVariable","dataType":"Double","description":[{"value":"Output variable of the controlling element, which is deducted from the control difference variable and is also the input variable of the actuator"}],"displayName":[{"value":"ControllerOutputVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11319","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasProperty","target":"ns=1;i=13847"},{"referenceType":"HasProperty","target":"ns=1;i=13848"},{"referenceType":"HasProperty","target":"ns=1;i=13849"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13847","parentNodeId":"ns=1;i=11319","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11319"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13848","parentNodeId":"ns=1;i=11319","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11319"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13849","parentNodeId":"ns=1;i=11319","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11319"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DeadTime","dataType":"Double","description":[{"value":"In a dead-time element the duration of the time interval by which the output variable is shifted relative to the input variable"}],"displayName":[{"value":"DeadTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11320","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasProperty","target":"ns=1;i=13819"},{"referenceType":"HasProperty","target":"ns=1;i=13820"},{"referenceType":"HasProperty","target":"ns=1;i=13821"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13819","parentNodeId":"ns=1;i=11320","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11320"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13820","parentNodeId":"ns=1;i=11320","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11320"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13821","parentNodeId":"ns=1;i=11320","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11320"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DerivativeActionCoefficient","dataType":"Double","description":[{"value":"For a derivative element, the quotient of the value of the output variable to the value of the time derivative of the input variable"}],"displayName":[{"value":"DerivativeActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11321","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13822"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasProperty","target":"ns=1;i=13823"},{"referenceType":"HasProperty","target":"ns=1;i=13824"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13822","parentNodeId":"ns=1;i=11321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11321"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13823","parentNodeId":"ns=1;i=11321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11321"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13824","parentNodeId":"ns=1;i=11321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11321"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11322","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13850"},{"referenceType":"HasProperty","target":"ns=1;i=13851"},{"referenceType":"HasProperty","target":"ns=1;i=13852"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13850","parentNodeId":"ns=1;i=11322","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11322"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13851","parentNodeId":"ns=1;i=11322","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11322"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13852","parentNodeId":"ns=1;i=11322","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11322"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FinalControlledVariable","dataType":"Double","description":[{"value":"Variable quantity which has, or combination of variable quantities which have, to be influenced by the control"}],"displayName":[{"value":"FinalControlledVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11323","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13825"},{"referenceType":"HasProperty","target":"ns=1;i=13826"},{"referenceType":"HasProperty","target":"ns=1;i=13827"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13825","parentNodeId":"ns=1;i=11323","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11323"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13826","parentNodeId":"ns=1;i=11323","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11323"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13827","parentNodeId":"ns=1;i=11323","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11323"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IntegralActionCoefficient","dataType":"Double","description":[{"value":"For an integral element, the quotient of the time derivative of the output variable to the fixed value of the input variable"}],"displayName":[{"value":"IntegralActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11324","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13828"},{"referenceType":"HasProperty","target":"ns=1;i=13829"},{"referenceType":"HasProperty","target":"ns=1;i=13830"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13828","parentNodeId":"ns=1;i=11324","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11324"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13829","parentNodeId":"ns=1;i=11324","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11324"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13830","parentNodeId":"ns=1;i=11324","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11324"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedVariable","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11325","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13831"},{"referenceType":"HasProperty","target":"ns=1;i=13832"},{"referenceType":"HasProperty","target":"ns=1;i=13833"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13831","parentNodeId":"ns=1;i=11325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13832","parentNodeId":"ns=1;i=11325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13833","parentNodeId":"ns=1;i=11325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OperatingMode","dataType":"String","description":[{"value":"Characterization of the way and the extent to which the human operator intervenes in the control equipment"}],"displayName":[{"value":"OperatingMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11326","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=13840"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13840","parentNodeId":"ns=1;i=11326","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11326"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ProportionalActionCoefficient","dataType":"Double","description":[{"value":"For a proportional element, the quotient of the variation of the output variable to the corresponding variation of the input variable"}],"displayName":[{"value":"ProportionalActionCoefficient"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11327","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13834"},{"referenceType":"HasProperty","target":"ns=1;i=13835"},{"referenceType":"HasProperty","target":"ns=1;i=13836"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13834","parentNodeId":"ns=1;i=11327","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11327"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13835","parentNodeId":"ns=1;i=11327","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11327"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13836","parentNodeId":"ns=1;i=11327","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11327"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11328","parentNodeId":"ns=1;i=5231","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13837"},{"referenceType":"HasProperty","target":"ns=1;i=13838"},{"referenceType":"HasProperty","target":"ns=1;i=13839"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5231"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13837","parentNodeId":"ns=1;i=11328","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11328"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13838","parentNodeId":"ns=1;i=11328","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11328"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13839","parentNodeId":"ns=1;i=11328","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11328"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"Measurements at a pump."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5196","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasComponent","target":"ns=1;i=15099"},{"referenceType":"HasComponent","target":"ns=1;i=15101"},{"referenceType":"HasComponent","target":"ns=1;i=15103"},{"referenceType":"HasComponent","target":"ns=1;i=15105"},{"referenceType":"HasComponent","target":"ns=1;i=15107"},{"referenceType":"HasComponent","target":"ns=1;i=15109"},{"referenceType":"HasComponent","target":"ns=1;i=15111"},{"referenceType":"HasComponent","target":"ns=1;i=15113"},{"referenceType":"HasComponent","target":"ns=1;i=15115"},{"referenceType":"HasComponent","target":"ns=1;i=15117"},{"referenceType":"HasComponent","target":"ns=1;i=15119"},{"referenceType":"HasComponent","target":"ns=1;i=15121"},{"referenceType":"HasComponent","target":"ns=1;i=15123"},{"referenceType":"HasComponent","target":"ns=1;i=15125"},{"referenceType":"HasComponent","target":"ns=1;i=15127"},{"referenceType":"HasComponent","target":"ns=1;i=15129"},{"referenceType":"HasComponent","target":"ns=1;i=15131"},{"referenceType":"HasComponent","target":"ns=1;i=15133"},{"referenceType":"HasComponent","target":"ns=1;i=15135"},{"referenceType":"HasComponent","target":"ns=1;i=15137"},{"referenceType":"HasComponent","target":"ns=1;i=15139"},{"referenceType":"HasComponent","target":"ns=1;i=15141"},{"referenceType":"HasComponent","target":"ns=1;i=15143"},{"referenceType":"HasComponent","target":"ns=1;i=15145"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1054"},{"referenceType":"HasComponent","target":"ns=1;i=15147"},{"referenceType":"HasComponent","target":"ns=1;i=15149"},{"referenceType":"HasComponent","target":"ns=1;i=15151"},{"referenceType":"HasComponent","target":"ns=1;i=15153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=15155"},{"referenceType":"HasComponent","target":"ns=1;i=15157"},{"referenceType":"HasComponent","target":"ns=1;i=15159"},{"referenceType":"HasComponent","target":"ns=1;i=15161"},{"referenceType":"HasComponent","target":"ns=1;i=15163"},{"referenceType":"HasComponent","target":"ns=1;i=15165"},{"referenceType":"HasComponent","target":"ns=1;i=15167"},{"referenceType":"HasComponent","target":"ns=1;i=15169"},{"referenceType":"HasComponent","target":"ns=1;i=15171"},{"referenceType":"HasComponent","target":"ns=1;i=15173"},{"referenceType":"HasComponent","target":"ns=1;i=15175"},{"referenceType":"HasComponent","target":"ns=1;i=15177"},{"referenceType":"HasComponent","target":"ns=1;i=15179"},{"referenceType":"HasComponent","target":"ns=1;i=15181"},{"referenceType":"HasComponent","target":"ns=1;i=15183"},{"referenceType":"HasComponent","target":"ns=1;i=15185"},{"referenceType":"HasComponent","target":"ns=1;i=15187"},{"referenceType":"HasComponent","target":"ns=1;i=15189"},{"referenceType":"HasComponent","target":"ns=1;i=15191"},{"referenceType":"HasComponent","target":"ns=1;i=15193"},{"referenceType":"HasComponent","target":"ns=1;i=15195"},{"referenceType":"HasComponent","target":"ns=1;i=15197"}],"typeDefinition":"ns=1;i=1054"},{"browseName":"1:\u003CVibration\u003E","displayName":[{"value":"\u003CVibration\u003E"}],"modellingRule":"MandatoryPlaceholder","nodeClass":"Object","nodeId":"ns=1;i=5229","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasComponent","target":"ns=1;i=14993"},{"referenceType":"HasComponent","target":"ns=1;i=14995"},{"referenceType":"HasComponent","target":"ns=1;i=14997"},{"referenceType":"HasComponent","target":"ns=1;i=14999"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasComponent","target":"ns=1;i=15001"},{"referenceType":"HasComponent","target":"ns=1;i=15003"},{"referenceType":"HasComponent","target":"ns=1;i=15005"},{"referenceType":"HasComponent","target":"ns=1;i=15007"},{"referenceType":"HasComponent","target":"ns=1;i=15009"},{"referenceType":"HasComponent","target":"ns=1;i=15011"},{"referenceType":"HasModellingRule","target":"i=11508"},{"referenceType":"HasComponent","target":"ns=1;i=15013"},{"referenceType":"HasComponent","target":"ns=1;i=15015"},{"referenceType":"HasComponent","target":"ns=1;i=15017"},{"referenceType":"HasComponent","target":"ns=1;i=15019"},{"referenceType":"HasComponent","target":"ns=1;i=15021"},{"referenceType":"HasComponent","target":"ns=1;i=15023"},{"referenceType":"HasComponent","target":"ns=1;i=15025"},{"referenceType":"HasComponent","target":"ns=1;i=15027"},{"referenceType":"HasComponent","target":"ns=1;i=15029"},{"referenceType":"HasComponent","target":"ns=1;i=15031"},{"referenceType":"HasComponent","target":"ns=1;i=15033"},{"referenceType":"HasComponent","target":"ns=1;i=15035"},{"referenceType":"HasComponent","target":"ns=1;i=15036"},{"referenceType":"HasComponent","target":"ns=1;i=15038"},{"referenceType":"HasComponent","target":"ns=1;i=15040"},{"referenceType":"HasComponent","target":"ns=1;i=15042"},{"referenceType":"HasComponent","target":"ns=1;i=15044"},{"referenceType":"HasComponent","target":"ns=1;i=15046"},{"referenceType":"HasComponent","target":"ns=1;i=15048"},{"referenceType":"HasComponent","target":"ns=1;i=15050"},{"referenceType":"HasComponent","target":"ns=1;i=15052"},{"referenceType":"HasComponent","target":"ns=1;i=15054"},{"referenceType":"HasComponent","target":"ns=1;i=15056"},{"referenceType":"HasComponent","target":"ns=1;i=15058"},{"referenceType":"HasComponent","target":"ns=1;i=15060"},{"referenceType":"HasComponent","target":"ns=1;i=15062"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1055"}],"symbolicName":"Vibration","typeDefinition":"ns=1;i=1055"},{"accessLevel":5,"browseName":"1:1XPhase","dataType":"Double","description":[{"value":"Phase of the 1X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"1XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14993","parentNodeId":"ns=1;i=5229","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15470"},{"referenceType":"HasProperty","target":"ns=1;i=15471"},{"referenceType":"HasProperty","target":"ns=1;i=15472"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XPhase","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15470","parentNodeId":"ns=1;i=14993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15471","parentNodeId":"ns=1;i=14993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15472","parentNodeId":"ns=1;i=14993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14995","parentNodeId":"ns=1;i=5229","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15473"},{"referenceType":"HasProperty","target":"ns=1;i=15474"},{"referenceType":"HasProperty","target":"ns=1;i=15475"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S1XRelativeShaftVibrationP_P","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15473","parentNodeId":"ns=1;i=14995","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14995"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15474","parentNodeId":"ns=1;i=14995","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14995"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15475","parentNodeId":"ns=1;i=14995","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14995"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XPhase","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"2XPhase"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14997","parentNodeId":"ns=1;i=5229","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15476"},{"referenceType":"HasProperty","target":"ns=1;i=15477"},{"referenceType":"HasProperty","target":"ns=1;i=15478"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XPhase","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15476","parentNodeId":"ns=1;i=14997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15477","parentNodeId":"ns=1;i=14997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15478","parentNodeId":"ns=1;i=14997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:2XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Oscillation range at the double rotation frequency of the shaft under consideration, expressed as displacement."}],"displayName":[{"value":"2XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14999","parentNodeId":"ns=1;i=5229","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15479"},{"referenceType":"HasProperty","target":"ns=1;i=15480"},{"referenceType":"HasProperty","target":"ns=1;i=15481"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"S2XRelativeShaftVibrationP_P","typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15479","parentNodeId":"ns=1;i=14999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15480","parentNodeId":"ns=1;i=14999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15481","parentNodeId":"ns=1;i=14999","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14999"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndex","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndex"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15001","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasProperty","target":"ns=1;i=15482"},{"referenceType":"HasProperty","target":"ns=1;i=15483"},{"referenceType":"HasProperty","target":"ns=1;i=15484"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15482","parentNodeId":"ns=1;i=15001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15483","parentNodeId":"ns=1;i=15001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15484","parentNodeId":"ns=1;i=15001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BearingIndexPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"BearingIndexPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15003","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasProperty","target":"ns=1;i=15485"},{"referenceType":"HasProperty","target":"ns=1;i=15486"},{"referenceType":"HasProperty","target":"ns=1;i=15487"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15485","parentNodeId":"ns=1;i=15003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15486","parentNodeId":"ns=1;i=15003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15487","parentNodeId":"ns=1;i=15003","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15003"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration in units of the acceleration of gravity g. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15005","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasProperty","target":"ns=1;i=15488"},{"referenceType":"HasProperty","target":"ns=1;i=15489"},{"referenceType":"HasProperty","target":"ns=1;i=15490"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15488","parentNodeId":"ns=1;i=15005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15489","parentNodeId":"ns=1;i=15005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15490","parentNodeId":"ns=1;i=15005","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15005"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:BroadbandCavitationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal due to cavitation within a defined frequency range, expressed as acceleration. The frequency range is regularly defined by the user."}],"displayName":[{"value":"BroadbandCavitationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15007","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasProperty","target":"ns=1;i=15491"},{"referenceType":"HasProperty","target":"ns=1;i=15492"},{"referenceType":"HasProperty","target":"ns=1;i=15493"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15491","parentNodeId":"ns=1;i=15007","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15007"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15492","parentNodeId":"ns=1;i=15007","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15007"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15493","parentNodeId":"ns=1;i=15007","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15007"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:GapVoltage","dataType":"Double","description":[{"value":"Sum value of the oscillation ranges of the vibration at all frequencies except the rotation frequency of the shaft under consideration, expressed as displacement. Regularly, only the frequency range below the rotational frequency is considered."}],"displayName":[{"value":"GapVoltage"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15009","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15494"},{"referenceType":"HasProperty","target":"ns=1;i=15495"},{"referenceType":"HasProperty","target":"ns=1;i=15496"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15494","parentNodeId":"ns=1;i=15009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15495","parentNodeId":"ns=1;i=15009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15496","parentNodeId":"ns=1;i=15009","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15009"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:Not1XRelativeShaftVibrationP_P","dataType":"Double","description":[{"value":"Phase of the 2X relative shaft vibration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"Not1XRelativeShaftVibrationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15011","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15497"},{"referenceType":"HasProperty","target":"ns=1;i=15498"},{"referenceType":"HasProperty","target":"ns=1;i=15499"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15497","parentNodeId":"ns=1;i=15011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15498","parentNodeId":"ns=1;i=15011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15499","parentNodeId":"ns=1;i=15011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAcceleration0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAcceleration0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15013","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15500"},{"referenceType":"HasProperty","target":"ns=1;i=15501"},{"referenceType":"HasProperty","target":"ns=1;i=15502"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15500","parentNodeId":"ns=1;i=15013","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15501","parentNodeId":"ns=1;i=15013","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15502","parentNodeId":"ns=1;i=15013","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15013"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15015","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15503"},{"referenceType":"HasProperty","target":"ns=1;i=15504"},{"referenceType":"HasProperty","target":"ns=1;i=15505"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15503","parentNodeId":"ns=1;i=15015","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15504","parentNodeId":"ns=1;i=15015","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15505","parentNodeId":"ns=1;i=15015","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15015"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerG0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15017","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15506"},{"referenceType":"HasProperty","target":"ns=1;i=15507"},{"referenceType":"HasProperty","target":"ns=1;i=15508"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15506","parentNodeId":"ns=1;i=15017","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15507","parentNodeId":"ns=1;i=15017","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15508","parentNodeId":"ns=1;i=15017","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15017"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerG_RMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration in units of the acceleration of gravity g"}],"displayName":[{"value":"OverallVibrationAccelerationPerG_RMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15019","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15509"},{"referenceType":"HasProperty","target":"ns=1;i=15510"},{"referenceType":"HasProperty","target":"ns=1;i=15511"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15509","parentNodeId":"ns=1;i=15019","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15019"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15510","parentNodeId":"ns=1;i=15019","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15019"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15511","parentNodeId":"ns=1;i=15019","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15019"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationPerGP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as acceleration in units of the acceleration of gravity g. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationAccelerationPerGP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15021","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15512"},{"referenceType":"HasProperty","target":"ns=1;i=15513"},{"referenceType":"HasProperty","target":"ns=1;i=15514"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15512","parentNodeId":"ns=1;i=15021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15513","parentNodeId":"ns=1;i=15021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15514","parentNodeId":"ns=1;i=15021","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15021"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationAccelerationRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement, expressed as acceleration"}],"displayName":[{"value":"OverallVibrationAccelerationRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15023","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15515"},{"referenceType":"HasProperty","target":"ns=1;i=15516"},{"referenceType":"HasProperty","target":"ns=1;i=15517"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15515","parentNodeId":"ns=1;i=15023","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15023"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15516","parentNodeId":"ns=1;i=15023","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15023"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15517","parentNodeId":"ns=1;i=15023","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15023"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15025","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15518"},{"referenceType":"HasProperty","target":"ns=1;i=15519"},{"referenceType":"HasProperty","target":"ns=1;i=15520"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15518","parentNodeId":"ns=1;i=15025","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15025"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15519","parentNodeId":"ns=1;i=15025","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15025"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15520","parentNodeId":"ns=1;i=15025","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15025"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationDisplacementRMS","dataType":"Double","description":[{"value":"Root mean square of oscillation range, expressed as local displacement. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationDisplacementRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15027","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15521"},{"referenceType":"HasProperty","target":"ns=1;i=15522"},{"referenceType":"HasProperty","target":"ns=1;i=15523"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15521","parentNodeId":"ns=1;i=15027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15027"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15522","parentNodeId":"ns=1;i=15027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15027"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E13384\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B5m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emicrometre (micron)\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15523","parentNodeId":"ns=1;i=15027","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15027"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocity0_P","dataType":"Double","description":[{"value":"Maximum oscillation amplitude, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocity0_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15029","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15524"},{"referenceType":"HasProperty","target":"ns=1;i=15525"},{"referenceType":"HasProperty","target":"ns=1;i=15526"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15524","parentNodeId":"ns=1;i=15029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15525","parentNodeId":"ns=1;i=15029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15526","parentNodeId":"ns=1;i=15029","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15029"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityP_P","dataType":"Double","description":[{"value":"Oscillation range, expressed as velocity. The oscillation range is the difference between the minimum and maximum value within the time range under consideration."}],"displayName":[{"value":"OverallVibrationVelocityP_P"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15031","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15527"},{"referenceType":"HasProperty","target":"ns=1;i=15528"},{"referenceType":"HasProperty","target":"ns=1;i=15529"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15527","parentNodeId":"ns=1;i=15031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15528","parentNodeId":"ns=1;i=15031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15529","parentNodeId":"ns=1;i=15031","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15031"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:OverallVibrationVelocityRMS","dataType":"Double","description":[{"value":"Root mean square of the oscillation displacement expressed as velocity"}],"displayName":[{"value":"OverallVibrationVelocityRMS"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15033","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15530"},{"referenceType":"HasProperty","target":"ns=1;i=15531"},{"referenceType":"HasProperty","target":"ns=1;i=15532"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15530","parentNodeId":"ns=1;i=15033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15531","parentNodeId":"ns=1;i=15033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15532","parentNodeId":"ns=1;i=15033","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15033"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ReferenceStandardForVibrationMeasurement","dataType":"String","description":[{"value":"Standard to which statements on vibration measurement refer."}],"displayName":[{"value":"ReferenceStandardForVibrationMeasurement"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15035","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=15533"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15533","parentNodeId":"ns=1;i=15035","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15035"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase1X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the rotation frequency (1X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15036","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15534"},{"referenceType":"HasProperty","target":"ns=1;i=15535"},{"referenceType":"HasProperty","target":"ns=1;i=15536"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15534","parentNodeId":"ns=1;i=15036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15535","parentNodeId":"ns=1;i=15036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15536","parentNodeId":"ns=1;i=15036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:RotationalPhase2X","dataType":"Double","description":[{"value":"Phase of the vibration amplitude at the first harmonic of the rotation frequency (2X) of the object under consideration related to a reference point of time. The reference point of time for the phase is defined by a so called phase reference sensor."}],"displayName":[{"value":"RotationalPhase2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15038","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15537"},{"referenceType":"HasProperty","target":"ns=1;i=15538"},{"referenceType":"HasProperty","target":"ns=1;i=15539"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15537","parentNodeId":"ns=1;i=15038","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15038"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15538","parentNodeId":"ns=1;i=15038","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15038"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E17476\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E\u00B0\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edegree [unit of angle]\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15539","parentNodeId":"ns=1;i=15038","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15038"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:SpeedOfRotation","dataType":"Double","description":[{"value":"Number of revolutions per time."}],"displayName":[{"value":"SpeedOfRotation"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15040","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15540"},{"referenceType":"HasProperty","target":"ns=1;i=15541"},{"referenceType":"HasProperty","target":"ns=1;i=15542"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15540","parentNodeId":"ns=1;i=15040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15541","parentNodeId":"ns=1;i=15040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15542","parentNodeId":"ns=1;i=15040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:ThrustPosition","dataType":"Double","description":[{"value":"Measure for the distance between the sensor and the shaft, expressed as device output voltage"}],"displayName":[{"value":"ThrustPosition"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15042","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15543"},{"referenceType":"HasProperty","target":"ns=1;i=15544"},{"referenceType":"HasProperty","target":"ns=1;i=15545"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15543","parentNodeId":"ns=1;i=15042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15042"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15544","parentNodeId":"ns=1;i=15042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15042"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5066068\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15545","parentNodeId":"ns=1;i=15042","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15042"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequencies","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequencies"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15044","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15546"},{"referenceType":"HasProperty","target":"ns=1;i=15547"},{"referenceType":"HasProperty","target":"ns=1;i=15548"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15546","parentNodeId":"ns=1;i=15044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15547","parentNodeId":"ns=1;i=15044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15548","parentNodeId":"ns=1;i=15044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBearingDefectFrequenciesPerG","dataType":"Double","description":[{"value":"Amplitude of the oscillation envelope at the roller bearing defect frequencies after high pass filtering, expressed as acceleration in units of the acceleration of gravity g. The parameter for the high pass filtering and oscillation envelope are regularly defined by the user."}],"displayName":[{"value":"VibrationAmplitudeAtTheBearingDefectFrequenciesPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15046","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15549"},{"referenceType":"HasProperty","target":"ns=1;i=15550"},{"referenceType":"HasProperty","target":"ns=1;i=15551"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15549","parentNodeId":"ns=1;i=15046","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15046"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15550","parentNodeId":"ns=1;i=15046","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15046"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15551","parentNodeId":"ns=1;i=15046","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15046"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheBladePassFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft multiplied with the number of blades mounted at the shaft, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheBladePassFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15048","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15552"},{"referenceType":"HasProperty","target":"ns=1;i=15553"},{"referenceType":"HasProperty","target":"ns=1;i=15554"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15552","parentNodeId":"ns=1;i=15048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15553","parentNodeId":"ns=1;i=15048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15554","parentNodeId":"ns=1;i=15048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X","dataType":"Double","description":[{"value":"Oscillation amplitude at the double rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheFirstHarmonicOfTheRotationFrequency2X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15050","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15555"},{"referenceType":"HasProperty","target":"ns=1;i=15556"},{"referenceType":"HasProperty","target":"ns=1;i=15557"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15555","parentNodeId":"ns=1;i=15050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15556","parentNodeId":"ns=1;i=15050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15557","parentNodeId":"ns=1;i=15050","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15050"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15052","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15558"},{"referenceType":"HasProperty","target":"ns=1;i=15559"},{"referenceType":"HasProperty","target":"ns=1;i=15560"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15558","parentNodeId":"ns=1;i=15052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15559","parentNodeId":"ns=1;i=15052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15560","parentNodeId":"ns=1;i=15052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the rotation frequency of the shaft, multiplied with the number of teeth of the gear mounted at the shaft, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15054","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15561"},{"referenceType":"HasProperty","target":"ns=1;i=15562"},{"referenceType":"HasProperty","target":"ns=1;i=15563"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15561","parentNodeId":"ns=1;i=15054","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15054"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15562","parentNodeId":"ns=1;i=15054","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15054"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15563","parentNodeId":"ns=1;i=15054","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15054"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx","dataType":"Double","description":[{"value":"Performance indicator of vibration calculated from the oscillation amplitude at the harmonics of the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheHarmonicsOfTheRotationFrequencyNx"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15056","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15564"},{"referenceType":"HasProperty","target":"ns=1;i=15565"},{"referenceType":"HasProperty","target":"ns=1;i=15566"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15564","parentNodeId":"ns=1;i=15056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15565","parentNodeId":"ns=1;i=15056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15566","parentNodeId":"ns=1;i=15056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheRotationFrequency1X","dataType":"Double","description":[{"value":"Oscillation amplitude at the rotation frequency of the object under consideration, expressed as velocity."}],"displayName":[{"value":"VibrationAmplitudeAtTheRotationFrequency1X"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15058","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15567"},{"referenceType":"HasProperty","target":"ns=1;i=15568"},{"referenceType":"HasProperty","target":"ns=1;i=15569"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15567","parentNodeId":"ns=1;i=15058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15568","parentNodeId":"ns=1;i=15058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4403510\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Emm/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emillimetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15569","parentNodeId":"ns=1;i=15058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequency"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15060","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15570"},{"referenceType":"HasProperty","target":"ns=1;i=15571"},{"referenceType":"HasProperty","target":"ns=1;i=15572"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15570","parentNodeId":"ns=1;i=15060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15571","parentNodeId":"ns=1;i=15060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067595\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second squared\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15572","parentNodeId":"ns=1;i=15060","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15060"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":5,"browseName":"1:VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG","dataType":"Double","description":[{"value":"Root mean square of the oscillation signal within defined frequency ranges, which include the side bands of the mesh frequency above and below the mesh frequency, expressed as acceleration in units of the acceleration of gravity g."}],"displayName":[{"value":"VibrationAmplitudeAtTheSidebandsOfTheGearMeshingFrequencyPerG"}],"historizing":true,"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15062","parentNodeId":"ns=1;i=5229","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=15573"},{"referenceType":"HasProperty","target":"ns=1;i=15574"},{"referenceType":"HasProperty","target":"ns=1;i=15575"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5229"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15573","parentNodeId":"ns=1;i=15062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15574","parentNodeId":"ns=1;i=15062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15575","parentNodeId":"ns=1;i=15062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:AmbientHumidity","dataType":"Double","description":[{"value":"Measured ambient humidity"}],"displayName":[{"value":"AmbientHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15099","parentNodeId":"ns=1;i=5196","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12924"},{"referenceType":"HasProperty","target":"ns=1;i=14722"},{"referenceType":"HasProperty","target":"ns=1;i=15199"},{"referenceType":"HasProperty","target":"ns=1;i=9434"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12924","parentNodeId":"ns=1;i=15099","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15099"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14722","parentNodeId":"ns=1;i=15099","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15099"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15199","parentNodeId":"ns=1;i=15099","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15099"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of partial pressure of water vapor and partial pressure at its saturation"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9434","parentNodeId":"ns=1;i=15099","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15099"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erelative humidity\u003C/uax:String\u003E"},{"browseName":"1:AmbientTemperature","dataType":"Double","description":[{"value":"Measured ambient temperature"}],"displayName":[{"value":"AmbientTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15101","parentNodeId":"ns=1;i=5196","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9450"},{"referenceType":"HasProperty","target":"ns=1;i=9452"},{"referenceType":"HasProperty","target":"ns=1;i=9454"},{"referenceType":"HasProperty","target":"ns=1;i=9458"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9450","parentNodeId":"ns=1;i=15101","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15101"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9452","parentNodeId":"ns=1;i=15101","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15101"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9454","parentNodeId":"ns=1;i=15101","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15101"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9458","parentNodeId":"ns=1;i=15101","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15101"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:AxialLoadOfPumpRotor","dataType":"Double","description":[{"value":"Measured residual thrust acting through the shaft derived from hydraulic or mechanical forces"}],"displayName":[{"value":"AxialLoadOfPumpRotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15103","parentNodeId":"ns=1;i=5196","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=9563"},{"referenceType":"HasProperty","target":"ns=1;i=9565"},{"referenceType":"HasProperty","target":"ns=1;i=9567"},{"referenceType":"HasProperty","target":"ns=1;i=9575"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9563","parentNodeId":"ns=1;i=15103","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15103"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9565","parentNodeId":"ns=1;i=15103","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15103"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9567","parentNodeId":"ns=1;i=15103","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15103"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity describing interaction between bodies or particles"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9575","parentNodeId":"ns=1;i=15103","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15103"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eforce\u003C/uax:String\u003E"},{"browseName":"1:AxialRotorPosition","dataType":"Double","description":[{"value":"Measured position of the axial rotor in bearing."}],"displayName":[{"value":"AxialRotorPosition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15105","parentNodeId":"ns=1;i=5196","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=10977"},{"referenceType":"HasProperty","target":"ns=1;i=10979"},{"referenceType":"HasProperty","target":"ns=1;i=10981"},{"referenceType":"HasProperty","target":"ns=1;i=10989"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10977","parentNodeId":"ns=1;i=15105","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15105"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10979","parentNodeId":"ns=1;i=15105","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15105"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10981","parentNodeId":"ns=1;i=15105","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15105"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10989","parentNodeId":"ns=1;i=15105","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15105"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:BackPressure","dataType":"Double","description":[{"value":"Measured back pressure of the pump"}],"displayName":[{"value":"BackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15107","parentNodeId":"ns=1;i=5196","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11128"},{"referenceType":"HasProperty","target":"ns=1;i=11266"},{"referenceType":"HasProperty","target":"ns=1;i=11276"},{"referenceType":"HasProperty","target":"ns=1;i=11284"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11128","parentNodeId":"ns=1;i=15107","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15107"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11266","parentNodeId":"ns=1;i=15107","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15107"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11276","parentNodeId":"ns=1;i=15107","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15107"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11284","parentNodeId":"ns=1;i=15107","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15107"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:BearingTemperature","dataType":"Double","description":[{"value":"Measured temperature of the bearing"}],"displayName":[{"value":"BearingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15109","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=11885"},{"referenceType":"HasProperty","target":"ns=1;i=11890"},{"referenceType":"HasProperty","target":"ns=1;i=11895"},{"referenceType":"HasProperty","target":"ns=1;i=11915"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11885","parentNodeId":"ns=1;i=15109","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15109"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11890","parentNodeId":"ns=1;i=15109","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15109"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11895","parentNodeId":"ns=1;i=15109","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15109"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11915","parentNodeId":"ns=1;i=15109","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15109"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:ClearanceFlow","dataType":"Double","description":[{"value":"Measured clearance flow between the housing and the impeller"}],"displayName":[{"value":"ClearanceFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15111","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=12070"},{"referenceType":"HasProperty","target":"ns=1;i=12075"},{"referenceType":"HasProperty","target":"ns=1;i=12449"},{"referenceType":"HasProperty","target":"ns=1;i=9538"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12070","parentNodeId":"ns=1;i=15111","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15111"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12075","parentNodeId":"ns=1;i=15111","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15111"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12449","parentNodeId":"ns=1;i=15111","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15111"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=9538","parentNodeId":"ns=1;i=15111","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15111"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:CoolantTemperature","dataType":"Double","description":[{"value":"Measured temperature of the coolant."}],"displayName":[{"value":"CoolantTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15113","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=11102"},{"referenceType":"HasProperty","target":"ns=1;i=11278"},{"referenceType":"HasProperty","target":"ns=1;i=11330"},{"referenceType":"HasProperty","target":"ns=1;i=14753"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11102","parentNodeId":"ns=1;i=15113","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15113"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11278","parentNodeId":"ns=1;i=15113","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15113"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11330","parentNodeId":"ns=1;i=15113","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15113"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14753","parentNodeId":"ns=1;i=15113","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15113"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:Density","dataType":"Double","description":[{"value":"Measured density of the fluid"}],"displayName":[{"value":"Density"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15115","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12458"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=12461"},{"referenceType":"HasProperty","target":"ns=1;i=12464"},{"referenceType":"HasProperty","target":"ns=1;i=14756"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12458","parentNodeId":"ns=1;i=15115","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15115"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12461","parentNodeId":"ns=1;i=15115","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15115"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4934993\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/m\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per cubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12464","parentNodeId":"ns=1;i=15115","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15115"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing the spatial distribution of mass of a continuous material"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14756","parentNodeId":"ns=1;i=15115","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15115"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Edensity\u003C/uax:String\u003E"},{"browseName":"1:DifferentialPressure","dataType":"Double","description":[{"value":"Determined (actual) gain in total pressure between the pump inlet and pump outlet"}],"displayName":[{"value":"DifferentialPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15117","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12648"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=12650"},{"referenceType":"HasProperty","target":"ns=1;i=12652"},{"referenceType":"HasProperty","target":"ns=1;i=14759"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12648","parentNodeId":"ns=1;i=15117","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15117"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12650","parentNodeId":"ns=1;i=15117","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15117"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12652","parentNodeId":"ns=1;i=15117","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15117"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14759","parentNodeId":"ns=1;i=15117","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15117"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:DynamicViscosity","dataType":"Double","description":[{"value":"Measured kinematic viscosity of the fluid"}],"displayName":[{"value":"DynamicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15119","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12666"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=12668"},{"referenceType":"HasProperty","target":"ns=1;i=12670"},{"referenceType":"HasProperty","target":"ns=1;i=14762"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12666","parentNodeId":"ns=1;i=15119","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15119"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12668","parentNodeId":"ns=1;i=15119","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15119"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12670","parentNodeId":"ns=1;i=15119","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15119"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"For laminar flows, proportionality constant between shear stress in a fluid moving with a velocity and gradient perpendicular to the plane of shear"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14762","parentNodeId":"ns=1;i=15119","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15119"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Edynamic viscosity\u003C/uax:String\u003E"},{"browseName":"1:ElectronicTemperature","dataType":"Double","description":[{"value":"Measured temperature of the electronic"}],"displayName":[{"value":"ElectronicTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15121","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12684"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=12686"},{"referenceType":"HasProperty","target":"ns=1;i=12688"},{"referenceType":"HasProperty","target":"ns=1;i=14765"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12684","parentNodeId":"ns=1;i=15121","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15121"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12686","parentNodeId":"ns=1;i=15121","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15121"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12688","parentNodeId":"ns=1;i=15121","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15121"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14765","parentNodeId":"ns=1;i=15121","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15121"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:FluidTemperature","dataType":"Double","description":[{"value":"Measured internal temperature of pump fluid."}],"displayName":[{"value":"FluidTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15123","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12702"},{"referenceType":"HasProperty","target":"ns=1;i=12704"},{"referenceType":"HasProperty","target":"ns=1;i=12706"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=14768"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12702","parentNodeId":"ns=1;i=15123","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15123"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12704","parentNodeId":"ns=1;i=15123","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15123"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12706","parentNodeId":"ns=1;i=15123","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15123"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14768","parentNodeId":"ns=1;i=15123","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15123"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:HousingTemperature","dataType":"Double","description":[{"value":"Measured temperature of the housing"}],"displayName":[{"value":"HousingTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15125","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12720"},{"referenceType":"HasProperty","target":"ns=1;i=12722"},{"referenceType":"HasProperty","target":"ns=1;i=12724"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=14771"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12720","parentNodeId":"ns=1;i=15125","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15125"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12722","parentNodeId":"ns=1;i=15125","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15125"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12724","parentNodeId":"ns=1;i=15125","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15125"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14771","parentNodeId":"ns=1;i=15125","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15125"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:HydraulicEfficiency","dataType":"Double","description":[{"value":"Determined proportion of pump available power input, Pa, which is delivered as pump power output, Pu, after satisfying the losses resulting from friction due to the relative motion of internal surfaces and internal leakage"}],"displayName":[{"value":"HydraulicEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15127","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12733"},{"referenceType":"HasProperty","target":"ns=1;i=12734"},{"referenceType":"HasProperty","target":"ns=1;i=12735"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=14774"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12733","parentNodeId":"ns=1;i=15127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15127"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12734","parentNodeId":"ns=1;i=15127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15127"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12735","parentNodeId":"ns=1;i=15127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15127"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14774","parentNodeId":"ns=1;i=15127","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15127"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:InletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Measured pressure at the inlet area of the installation."}],"displayName":[{"value":"InletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15129","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12742"},{"referenceType":"HasProperty","target":"ns=1;i=12743"},{"referenceType":"HasProperty","target":"ns=1;i=12744"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=14777"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12742","parentNodeId":"ns=1;i=15129","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15129"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12743","parentNodeId":"ns=1;i=15129","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15129"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12744","parentNodeId":"ns=1;i=15129","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15129"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14777","parentNodeId":"ns=1;i=15129","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15129"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:InstallationTotalHead","dataType":"Double","description":[{"value":"Determined difference between the total head at the outlet side of the installation and the total head at the inlet side of the installation"}],"displayName":[{"value":"InstallationTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15131","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12751"},{"referenceType":"HasProperty","target":"ns=1;i=12752"},{"referenceType":"HasProperty","target":"ns=1;i=12753"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasProperty","target":"ns=1;i=14780"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12751","parentNodeId":"ns=1;i=15131","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15131"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12752","parentNodeId":"ns=1;i=15131","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15131"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12753","parentNodeId":"ns=1;i=15131","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15131"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14780","parentNodeId":"ns=1;i=15131","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15131"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:KinematicViscosity","dataType":"Double","description":[{"value":"Measured dynamic viscosity of the fluid"}],"displayName":[{"value":"KinematicViscosity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15133","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12760"},{"referenceType":"HasProperty","target":"ns=1;i=12761"},{"referenceType":"HasProperty","target":"ns=1;i=12762"},{"referenceType":"HasProperty","target":"ns=1;i=14783"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12760","parentNodeId":"ns=1;i=15133","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15133"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12761","parentNodeId":"ns=1;i=15133","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15133"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E21300\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12762","parentNodeId":"ns=1;i=15133","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15133"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of dynamic viscosity and mass density of a fluid"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14783","parentNodeId":"ns=1;i=15133","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15133"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ekinematic viscosity\u003C/uax:String\u003E"},{"browseName":"1:LeakageRateOfFlow","dataType":"Double","description":[{"value":"Measured rate of flow leaking from shaft seals"}],"displayName":[{"value":"LeakageRateOfFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15135","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12769"},{"referenceType":"HasProperty","target":"ns=1;i=12770"},{"referenceType":"HasProperty","target":"ns=1;i=12771"},{"referenceType":"HasProperty","target":"ns=1;i=14786"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12769","parentNodeId":"ns=1;i=15135","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15135"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12770","parentNodeId":"ns=1;i=15135","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15135"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067091\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12771","parentNodeId":"ns=1;i=15135","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15135"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14786","parentNodeId":"ns=1;i=15135","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15135"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:Level","dataType":"Double","description":[{"value":"Measured level"}],"displayName":[{"value":"Level"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15137","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12778"},{"referenceType":"HasProperty","target":"ns=1;i=12779"},{"referenceType":"HasProperty","target":"ns=1;i=12780"},{"referenceType":"HasProperty","target":"ns=1;i=14789"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12778","parentNodeId":"ns=1;i=15137","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15137"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12779","parentNodeId":"ns=1;i=15137","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15137"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12780","parentNodeId":"ns=1;i=15137","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15137"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14789","parentNodeId":"ns=1;i=15137","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15137"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:LubricatingOilConsumption","dataType":"Double","description":[{"value":"Measured oil consumption of the lubricating system"}],"displayName":[{"value":"LubricatingOilConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15139","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12787"},{"referenceType":"HasProperty","target":"ns=1;i=12788"},{"referenceType":"HasProperty","target":"ns=1;i=12789"},{"referenceType":"HasProperty","target":"ns=1;i=14792"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12787","parentNodeId":"ns=1;i=15139","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15139"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12788","parentNodeId":"ns=1;i=15139","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15139"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067857\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B3\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ecubic metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12789","parentNodeId":"ns=1;i=15139","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15139"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Extent of a three dimensional geometrical shape"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14792","parentNodeId":"ns=1;i=15139","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15139"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume\u003C/uax:String\u003E"},{"browseName":"1:LubricatingOilPressure","dataType":"Double","description":[{"value":"Measured oil pressure of the lubrication system"}],"displayName":[{"value":"LubricatingOilPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15141","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12796"},{"referenceType":"HasProperty","target":"ns=1;i=12797"},{"referenceType":"HasProperty","target":"ns=1;i=12798"},{"referenceType":"HasProperty","target":"ns=1;i=14795"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12796","parentNodeId":"ns=1;i=15141","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15141"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12797","parentNodeId":"ns=1;i=15141","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15141"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12798","parentNodeId":"ns=1;i=15141","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15141"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14795","parentNodeId":"ns=1;i=15141","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15141"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:MassFlow","dataType":"Double","description":[{"value":"Measure mass flow from the outlet area of the pump"}],"displayName":[{"value":"MassFlow"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15143","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12805"},{"referenceType":"HasProperty","target":"ns=1;i=12806"},{"referenceType":"HasProperty","target":"ns=1;i=12807"},{"referenceType":"HasProperty","target":"ns=1;i=14798"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12805","parentNodeId":"ns=1;i=15143","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15143"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12806","parentNodeId":"ns=1;i=15143","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15143"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekilogram per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12807","parentNodeId":"ns=1;i=15143","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15143"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity characterizing a flowing fluid by the product of its local mass density and local velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14798","parentNodeId":"ns=1;i=15143","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15143"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emass flow\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtThroat","dataType":"Double","description":[{"value":"Measured rate of flow passing through the exit from the volute divided by the throat area"}],"displayName":[{"value":"MeanVelocityAtThroat"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15145","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12814"},{"referenceType":"HasProperty","target":"ns=1;i=12815"},{"referenceType":"HasProperty","target":"ns=1;i=12816"},{"referenceType":"HasProperty","target":"ns=1;i=14801"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12814","parentNodeId":"ns=1;i=15145","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15145"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12815","parentNodeId":"ns=1;i=15145","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15145"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12816","parentNodeId":"ns=1;i=15145","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15145"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14801","parentNodeId":"ns=1;i=15145","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15145"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:MechanicalEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the pump power input, P, available after satisfying the mechanical power losses, PJ, ab, at given operating conditions"}],"displayName":[{"value":"MechanicalEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15147","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12823"},{"referenceType":"HasProperty","target":"ns=1;i=12824"},{"referenceType":"HasProperty","target":"ns=1;i=12825"},{"referenceType":"HasProperty","target":"ns=1;i=14804"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12823","parentNodeId":"ns=1;i=15147","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15147"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12824","parentNodeId":"ns=1;i=15147","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15147"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12825","parentNodeId":"ns=1;i=15147","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15147"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14804","parentNodeId":"ns=1;i=15147","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15147"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:NetPositiveInletPressure","dataType":"Double","description":[{"value":"Total pressure (including velocity pressure) at the pump inlet connection less the liquid vapor pressure at the present temperature of the liquid"}],"displayName":[{"value":"NetPositiveInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15149","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12832"},{"referenceType":"HasProperty","target":"ns=1;i=12833"},{"referenceType":"HasProperty","target":"ns=1;i=12834"},{"referenceType":"HasProperty","target":"ns=1;i=14807"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12832","parentNodeId":"ns=1;i=15149","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15149"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12833","parentNodeId":"ns=1;i=15149","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15149"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12834","parentNodeId":"ns=1;i=15149","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15149"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14807","parentNodeId":"ns=1;i=15149","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15149"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:NetPositiveSuctionHead","dataType":"Double","description":[{"value":"Amount of the absolute value of the total head above the head, equivalent to the vapor pressure of the liquid at the particular temperature, with reference to the NPSH datum plane"}],"displayName":[{"value":"NetPositiveSuctionHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15151","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12841"},{"referenceType":"HasProperty","target":"ns=1;i=12842"},{"referenceType":"HasProperty","target":"ns=1;i=12843"},{"referenceType":"HasProperty","target":"ns=1;i=14810"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12841","parentNodeId":"ns=1;i=15151","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15151"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12842","parentNodeId":"ns=1;i=15151","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15151"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12843","parentNodeId":"ns=1;i=15151","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15151"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14810","parentNodeId":"ns=1;i=15151","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15151"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:NumberOfStarts","dataType":"UInt32","description":[{"value":"Total number of starts"}],"displayName":[{"value":"NumberOfStarts"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15153","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12850"},{"referenceType":"HasProperty","target":"ns=1;i=12851"},{"referenceType":"HasProperty","target":"ns=1;i=12852"},{"referenceType":"HasProperty","target":"ns=1;i=14813"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:UInt32 xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:UInt32\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12850","parentNodeId":"ns=1;i=15153","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15153"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12851","parentNodeId":"ns=1;i=15153","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15153"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12852","parentNodeId":"ns=1;i=15153","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15153"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14813","parentNodeId":"ns=1;i=15153","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15153"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:OutletPressureOfTheInstallation","dataType":"Double","description":[{"value":"Measured pressure at the outlet area of the installation."}],"displayName":[{"value":"OutletPressureOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15155","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12859"},{"referenceType":"HasProperty","target":"ns=1;i=12860"},{"referenceType":"HasProperty","target":"ns=1;i=12861"},{"referenceType":"HasProperty","target":"ns=1;i=14816"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12859","parentNodeId":"ns=1;i=15155","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15155"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12860","parentNodeId":"ns=1;i=15155","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15155"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12861","parentNodeId":"ns=1;i=15155","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15155"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14816","parentNodeId":"ns=1;i=15155","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15155"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:OverallEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the driver power input, Pmot, delivered as pump power output, Pu"}],"displayName":[{"value":"OverallEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15157","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12868"},{"referenceType":"HasProperty","target":"ns=1;i=12869"},{"referenceType":"HasProperty","target":"ns=1;i=12870"},{"referenceType":"HasProperty","target":"ns=1;i=14819"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12868","parentNodeId":"ns=1;i=15157","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15157"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12869","parentNodeId":"ns=1;i=15157","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15157"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12870","parentNodeId":"ns=1;i=15157","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15157"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14819","parentNodeId":"ns=1;i=15157","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15157"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:PowerLossDueToInternalLeakage","dataType":"Double","description":[{"value":"Determined power loss due clearance flows"}],"displayName":[{"value":"PowerLossDueToInternalLeakage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15159","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12877"},{"referenceType":"HasProperty","target":"ns=1;i=12878"},{"referenceType":"HasProperty","target":"ns=1;i=12879"},{"referenceType":"HasProperty","target":"ns=1;i=14822"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12877","parentNodeId":"ns=1;i=15159","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15159"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12878","parentNodeId":"ns=1;i=15159","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15159"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12879","parentNodeId":"ns=1;i=15159","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15159"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14822","parentNodeId":"ns=1;i=15159","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15159"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:ProcessPressure","dataType":"Double","description":[{"value":"Measured process pressure of the pump"}],"displayName":[{"value":"ProcessPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15161","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12886"},{"referenceType":"HasProperty","target":"ns=1;i=12887"},{"referenceType":"HasProperty","target":"ns=1;i=12888"},{"referenceType":"HasProperty","target":"ns=1;i=14825"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12886","parentNodeId":"ns=1;i=15161","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15161"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12887","parentNodeId":"ns=1;i=15161","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15161"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12888","parentNodeId":"ns=1;i=15161","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15161"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14825","parentNodeId":"ns=1;i=15161","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15161"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:PumpEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the pump power input, P, delivered as pump power output, Pu, at given operating conditions"}],"displayName":[{"value":"PumpEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15163","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12895"},{"referenceType":"HasProperty","target":"ns=1;i=12896"},{"referenceType":"HasProperty","target":"ns=1;i=12897"},{"referenceType":"HasProperty","target":"ns=1;i=14828"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12895","parentNodeId":"ns=1;i=15163","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15163"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12896","parentNodeId":"ns=1;i=15163","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15163"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12897","parentNodeId":"ns=1;i=15163","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15163"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14828","parentNodeId":"ns=1;i=15163","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15163"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:PumpHumidity","dataType":"Double","description":[{"value":"Measured humidity inside the pump"}],"displayName":[{"value":"PumpHumidity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15165","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12904"},{"referenceType":"HasProperty","target":"ns=1;i=12905"},{"referenceType":"HasProperty","target":"ns=1;i=12906"},{"referenceType":"HasProperty","target":"ns=1;i=14831"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12904","parentNodeId":"ns=1;i=15165","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15165"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12905","parentNodeId":"ns=1;i=15165","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15165"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12906","parentNodeId":"ns=1;i=15165","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15165"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of partial pressure of water vapor and partial pressure at its saturation"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14831","parentNodeId":"ns=1;i=15165","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15165"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erelative humidity\u003C/uax:String\u003E"},{"browseName":"1:PumpPowerInput","dataType":"Double","description":[{"value":"Measured power transmitted to the pump by its driver"}],"displayName":[{"value":"PumpPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15167","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12913"},{"referenceType":"HasProperty","target":"ns=1;i=12914"},{"referenceType":"HasProperty","target":"ns=1;i=12915"},{"referenceType":"HasProperty","target":"ns=1;i=14834"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12913","parentNodeId":"ns=1;i=15167","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15167"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12914","parentNodeId":"ns=1;i=15167","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15167"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12915","parentNodeId":"ns=1;i=15167","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15167"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar product of force acting to a body and its velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14834","parentNodeId":"ns=1;i=15167","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15167"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emechanical power\u003C/uax:String\u003E"},{"browseName":"1:PumpPowerOutput","dataType":"Double","description":[{"value":"Measured useful mechanical power transferred to the fluid during its passage through the pump"}],"displayName":[{"value":"PumpPowerOutput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15169","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12922"},{"referenceType":"HasProperty","target":"ns=1;i=12923"},{"referenceType":"HasProperty","target":"ns=1;i=12925"},{"referenceType":"HasProperty","target":"ns=1;i=14837"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12922","parentNodeId":"ns=1;i=15169","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15169"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12923","parentNodeId":"ns=1;i=15169","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15169"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12925","parentNodeId":"ns=1;i=15169","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15169"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar product of force acting to a body and its velocity"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14837","parentNodeId":"ns=1;i=15169","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15169"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emechanical power\u003C/uax:String\u003E"},{"browseName":"1:PumpTemperature","dataType":"Double","description":[{"value":"Measured temperature of the pump"}],"displayName":[{"value":"PumpTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15171","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13116"},{"referenceType":"HasProperty","target":"ns=1;i=13118"},{"referenceType":"HasProperty","target":"ns=1;i=13120"},{"referenceType":"HasProperty","target":"ns=1;i=14840"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13116","parentNodeId":"ns=1;i=15171","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15171"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13118","parentNodeId":"ns=1;i=15171","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15171"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13120","parentNodeId":"ns=1;i=15171","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15171"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14840","parentNodeId":"ns=1;i=15171","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15171"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:PumpTotalHead","dataType":"Double","description":[{"value":"Determined difference between the total head at the outlet side of the pump and the total head at the inlet side of the pump"}],"displayName":[{"value":"PumpTotalHead"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15173","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13134"},{"referenceType":"HasProperty","target":"ns=1;i=13136"},{"referenceType":"HasProperty","target":"ns=1;i=13138"},{"referenceType":"HasProperty","target":"ns=1;i=14843"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13134","parentNodeId":"ns=1;i=15173","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15173"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13136","parentNodeId":"ns=1;i=15173","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15173"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13138","parentNodeId":"ns=1;i=15173","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15173"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14843","parentNodeId":"ns=1;i=15173","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15173"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:RadialLoadOfPumpRotor","dataType":"Double","description":[{"value":"Measured residual force acting at right angles to the line of the shaft and derived from hydraulic forces"}],"displayName":[{"value":"RadialLoadOfPumpRotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15175","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13154"},{"referenceType":"HasProperty","target":"ns=1;i=13156"},{"referenceType":"HasProperty","target":"ns=1;i=13158"},{"referenceType":"HasProperty","target":"ns=1;i=14846"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13154","parentNodeId":"ns=1;i=15175","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15175"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13156","parentNodeId":"ns=1;i=15175","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15175"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13158","parentNodeId":"ns=1;i=15175","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15175"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity describing interaction between bodies or particles"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14846","parentNodeId":"ns=1;i=15175","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15175"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eforce\u003C/uax:String\u003E"},{"browseName":"1:SoundEnergy","dataType":"Double","description":[{"value":"Determined integral of the sound power, P, over a stated time interval of duration T (starting at t1 and ending at t2)"}],"displayName":[{"value":"SoundEnergy"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15177","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13856"},{"referenceType":"HasProperty","target":"ns=1;i=13858"},{"referenceType":"HasProperty","target":"ns=1;i=13860"},{"referenceType":"HasProperty","target":"ns=1;i=14849"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13856","parentNodeId":"ns=1;i=15177","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15177"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13858","parentNodeId":"ns=1;i=15177","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15177"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13860","parentNodeId":"ns=1;i=15177","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15177"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14849","parentNodeId":"ns=1;i=15177","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15177"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:SoundEnergyLevel","dataType":"Double","description":[{"value":"Determined ten times the logarithm to the base 10 of the ratio of the sound energy, J, to a reference value, J0, expressed in decibels"}],"displayName":[{"value":"SoundEnergyLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15179","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13874"},{"referenceType":"HasProperty","target":"ns=1;i=13876"},{"referenceType":"HasProperty","target":"ns=1;i=13878"},{"referenceType":"HasProperty","target":"ns=1;i=14852"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13874","parentNodeId":"ns=1;i=15179","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15179"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13876","parentNodeId":"ns=1;i=15179","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15179"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13878","parentNodeId":"ns=1;i=15179","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15179"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14852","parentNodeId":"ns=1;i=15179","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15179"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:SoundPower","dataType":"Double","description":[{"value":"Determined through a surface, product of the sound pressure, p, and the component of the particle velocity, un, at a point on the surface in the direction normal to the surface, integrated over that surface"}],"displayName":[{"value":"SoundPower"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15181","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13893"},{"referenceType":"HasProperty","target":"ns=1;i=13895"},{"referenceType":"HasProperty","target":"ns=1;i=13897"},{"referenceType":"HasProperty","target":"ns=1;i=14855"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13893","parentNodeId":"ns=1;i=15181","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15181"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13895","parentNodeId":"ns=1;i=15181","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15181"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13897","parentNodeId":"ns=1;i=15181","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15181"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14855","parentNodeId":"ns=1;i=15181","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15181"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:SoundPowerLevel","dataType":"Double","description":[{"value":"Determined ten times the logarithm to the base 10 of the ratio of the sound power of a source, P, to a reference value, P0, expressed in decibels"}],"displayName":[{"value":"SoundPowerLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15183","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=13911"},{"referenceType":"HasProperty","target":"ns=1;i=13913"},{"referenceType":"HasProperty","target":"ns=1;i=13915"},{"referenceType":"HasProperty","target":"ns=1;i=14858"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13911","parentNodeId":"ns=1;i=15183","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15183"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13913","parentNodeId":"ns=1;i=15183","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15183"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=13915","parentNodeId":"ns=1;i=15183","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15183"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14858","parentNodeId":"ns=1;i=15183","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15183"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:SoundPressure","dataType":"Double","description":[{"value":"Measured difference between instantaneous pressure and static pressure"}],"displayName":[{"value":"SoundPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15185","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14661"},{"referenceType":"HasProperty","target":"ns=1;i=14663"},{"referenceType":"HasProperty","target":"ns=1;i=14665"},{"referenceType":"HasProperty","target":"ns=1;i=14861"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14661","parentNodeId":"ns=1;i=15185","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15185"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14663","parentNodeId":"ns=1;i=15185","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15185"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14665","parentNodeId":"ns=1;i=15185","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15185"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of the component of a force normal to a surface and its area"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14861","parentNodeId":"ns=1;i=15185","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15185"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epressure\u003C/uax:String\u003E"},{"browseName":"1:SoundPressureLevel","dataType":"Double","description":[{"value":"Determined ten times logarithm to the base 10 of the ratio of the square of the sound pressure, p, to the square of a reference value, p0, expressed in decibels"}],"displayName":[{"value":"SoundPressureLevel"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15187","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14679"},{"referenceType":"HasProperty","target":"ns=1;i=14681"},{"referenceType":"HasProperty","target":"ns=1;i=14683"},{"referenceType":"HasProperty","target":"ns=1;i=14864"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14679","parentNodeId":"ns=1;i=15187","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15187"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14681","parentNodeId":"ns=1;i=15187","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15187"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E12878\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EdB\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Edecibel\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14683","parentNodeId":"ns=1;i=15187","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15187"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Logarithm of the ratio of a given sound pressure to the reference sound pressure of 20 \u03BCPa, the sound pressure being obtained with a standard frequency weighting and with a standard exponential time weighting. Sound level in decibels is twenty times the logarithm to the base ten of that ratio"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14864","parentNodeId":"ns=1;i=15187","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15187"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Esound level\u003C/uax:String\u003E"},{"browseName":"1:Speed","dataType":"Double","description":[{"value":"Measured number of rotations or movements made by the shaft, coupling or impeller in a given time"}],"displayName":[{"value":"Speed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15189","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14697"},{"referenceType":"HasProperty","target":"ns=1;i=14699"},{"referenceType":"HasProperty","target":"ns=1;i=14701"},{"referenceType":"HasProperty","target":"ns=1;i=14867"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14697","parentNodeId":"ns=1;i=15189","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15189"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14699","parentNodeId":"ns=1;i=15189","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15189"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14701","parentNodeId":"ns=1;i=15189","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15189"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14867","parentNodeId":"ns=1;i=15189","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15189"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:Throughput","dataType":"Double","description":[{"value":"Measured throughput of the vacuum pump"}],"displayName":[{"value":"Throughput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15191","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14715"},{"referenceType":"HasProperty","target":"ns=1;i=14717"},{"referenceType":"HasProperty","target":"ns=1;i=14719"},{"referenceType":"HasProperty","target":"ns=1;i=14870"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14715","parentNodeId":"ns=1;i=15191","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15191"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14717","parentNodeId":"ns=1;i=15191","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15191"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4665393\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u00B7m\u00B3/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal cubic metre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14719","parentNodeId":"ns=1;i=15191","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15191"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity characterizing the total flow through the two-dimensional domain A with the normal vector of a flowing fluid with velocity as an integral"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14870","parentNodeId":"ns=1;i=15191","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15191"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evolume flow rate\u003C/uax:String\u003E"},{"browseName":"1:TotalHeadAtInletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Determined total head at the inlet area of the installation, which corresponds to the sum of geodetic head, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15193","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14730"},{"referenceType":"HasProperty","target":"ns=1;i=14731"},{"referenceType":"HasProperty","target":"ns=1;i=14732"},{"referenceType":"HasProperty","target":"ns=1;i=14873"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14730","parentNodeId":"ns=1;i=15193","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15193"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14731","parentNodeId":"ns=1;i=15193","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15193"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14732","parentNodeId":"ns=1;i=15193","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15193"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14873","parentNodeId":"ns=1;i=15193","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15193"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:TotalHeadAtOutletAreaOfTheInstallation","dataType":"Double","description":[{"value":"Determined total head at the outlet area of the installation, which corresponds to the sum of geodetic head, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtOutletAreaOfTheInstallation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15195","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14739"},{"referenceType":"HasProperty","target":"ns=1;i=14740"},{"referenceType":"HasProperty","target":"ns=1;i=14741"},{"referenceType":"HasProperty","target":"ns=1;i=14876"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14739","parentNodeId":"ns=1;i=15195","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15195"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14740","parentNodeId":"ns=1;i=15195","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15195"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14741","parentNodeId":"ns=1;i=15195","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15195"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Linear extent in space between any two points"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14876","parentNodeId":"ns=1;i=15195","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15195"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Elength\u003C/uax:String\u003E"},{"browseName":"1:VolumetricEfficiency","dataType":"Double","description":[{"value":"Determined ratio of the actual delivered volume at maximum pressure to the geometric displacement volume"}],"displayName":[{"value":"VolumetricEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=15197","parentNodeId":"ns=1;i=5196","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14748"},{"referenceType":"HasProperty","target":"ns=1;i=14749"},{"referenceType":"HasProperty","target":"ns=1;i=14750"},{"referenceType":"HasProperty","target":"ns=1;i=14879"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5196"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14748","parentNodeId":"ns=1;i=15197","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15197"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14749","parentNodeId":"ns=1;i=15197","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15197"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14750","parentNodeId":"ns=1;i=15197","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15197"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind."}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14879","parentNodeId":"ns=1;i=15197","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=15197"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MultiPump","description":[{"value":"Properties for multi pump usage of a pump."}],"displayName":[{"value":"MultiPump"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5233","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasComponent","target":"ns=1;i=11348"},{"referenceType":"HasComponent","target":"ns=1;i=11349"},{"referenceType":"HasComponent","target":"ns=1;i=11350"},{"referenceType":"HasComponent","target":"ns=1;i=11351"},{"referenceType":"HasComponent","target":"ns=1;i=11352"},{"referenceType":"HasComponent","target":"ns=1;i=11354"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasComponent","target":"ns=1;i=11355"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1039"},{"referenceType":"HasComponent","target":"ns=1;i=11356"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11357"},{"referenceType":"HasComponent","target":"ns=1;i=11358"},{"referenceType":"HasComponent","target":"ns=1;i=11359"}],"typeDefinition":"ns=1;i=1039"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:DistributionPriority","dataType":"String","description":[{"value":"This property describes in ascending order the priority of pumps in addition operation mode."}],"displayName":[{"value":"DistributionPriority"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11348","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11297"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11297","parentNodeId":"ns=1;i=11348","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11348"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:DistributionType","dataType":"DistributionTypeEnum","description":[{"value":"This property describes the share of operation time of different pumps of the pump system in addition operation mode."}],"displayName":[{"value":"DistributionType"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11349","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11298"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11298","parentNodeId":"ns=1;i=11349","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11349"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeMode","dataType":"ExchangeModeEnum","description":[{"value":"This property specifies the exchange mode of the pump"}],"displayName":[{"value":"ExchangeMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11350","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11299"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11299","parentNodeId":"ns=1;i=11350","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11350"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeTime","dataType":"DateTime","description":[{"value":"This property specifies the determination of the absolute time for the next exchange of the pump, if operator specific Pump Exchange Mode is activated."}],"displayName":[{"value":"ExchangeTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11351","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11300"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11300","parentNodeId":"ns=1;i=11351","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11351"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExchangeTimeDifference","dataType":"Double","description":[{"value":"This property specifies the determination of the time for the next exchange of the pump relative to ExchangeTime, if operator specific Pump Exchange Mode is activated."}],"displayName":[{"value":"ExchangeTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11352","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=11331"},{"referenceType":"HasProperty","target":"ns=1;i=11353"},{"referenceType":"HasProperty","target":"ns=1;i=11332"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11331","parentNodeId":"ns=1;i=11352","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11352"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11353","parentNodeId":"ns=1;i=11352","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11352"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11332","parentNodeId":"ns=1;i=11352","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11352"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MaximumNumberOfPumpsInOperation","dataType":"UInt32","description":[{"value":"This property specifies the maximum number of pumps in operation. The difference between NumberOfPumps and MaximumNumberOfPumpsInOperation identifies the redundant pumps."}],"displayName":[{"value":"MaximumNumberOfPumpsInOperation"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11354","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11333"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11333","parentNodeId":"ns=1;i=11354","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11354"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MultiPumpOperationMode","dataType":"MultiPumpOperationModeEnum","description":[{"value":"This property specifies the actual multi pump operation mode. In redundant operation mode a pump fulfils the process function of another pump. Addition operation mode characterizes the supplementary fulfilling of the process function. The mixed mode characterizes both operation tasks."}],"displayName":[{"value":"MultiPumpOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11355","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11334"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11334","parentNodeId":"ns=1;i=11355","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11355"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NumberOfPumps","dataType":"UInt32","description":[{"value":"This property identifies the number of pumps in multi pump management"}],"displayName":[{"value":"NumberOfPumps"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11356","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11335"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11335","parentNodeId":"ns=1;i=11356","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11356"}],"typeDefinition":"i=68"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:PumpCollectiveIDs","dataType":"String","description":[{"value":"This element identifies the pumps within the pump system"}],"displayName":[{"value":"PumpCollectiveIDs"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11357","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11336"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11336","parentNodeId":"ns=1;i=11357","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11357"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpRole","dataType":"PumpRoleEnum","description":[{"value":"This property identifies the role rsp. task of the pump within the multi pump management."}],"displayName":[{"value":"PumpRole"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11358","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11337"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11337","parentNodeId":"ns=1;i=11358","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11358"}],"typeDefinition":"i=68"},{"accessLevel":3,"arrayDimensions":"0","browseName":"1:RedundantPumpIDs","dataType":"String","description":[{"value":"This property identifies the actual redundant pumps within the pump system"}],"displayName":[{"value":"RedundantPumpIDs"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11359","parentNodeId":"ns=1;i=5233","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11338"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5233"}],"typeDefinition":"i=2365","valueRank":1},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11338","parentNodeId":"ns=1;i=11359","references":[{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11359"}],"typeDefinition":"i=68"},{"browseName":"1:PumpActuation","description":[{"value":"Actuation parameters for a pump."}],"displayName":[{"value":"PumpActuation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5234","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasComponent","target":"ns=1;i=11360"},{"referenceType":"HasComponent","target":"ns=1;i=11361"},{"referenceType":"HasComponent","target":"ns=1;i=5237"},{"referenceType":"HasComponent","target":"ns=1;i=11365"},{"referenceType":"HasComponent","target":"ns=1;i=11368"},{"referenceType":"HasComponent","target":"ns=1;i=11371"},{"referenceType":"HasComponent","target":"ns=1;i=14109"},{"referenceType":"HasComponent","target":"ns=1;i=14113"},{"referenceType":"HasComponent","target":"ns=1;i=14117"},{"referenceType":"HasComponent","target":"ns=1;i=5240"},{"referenceType":"HasComponent","target":"ns=1;i=5241"},{"referenceType":"HasComponent","target":"ns=1;i=5242"},{"referenceType":"HasComponent","target":"ns=1;i=14181"},{"referenceType":"HasComponent","target":"ns=1;i=14185"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5243"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1028"},{"referenceType":"HasComponent","target":"ns=1;i=5244"},{"referenceType":"HasComponent","target":"ns=1;i=5245"},{"referenceType":"HasComponent","target":"ns=1;i=5246"},{"referenceType":"HasComponent","target":"ns=1;i=14277"},{"referenceType":"HasComponent","target":"ns=1;i=14281"},{"referenceType":"HasComponent","target":"ns=1;i=14285"},{"referenceType":"HasComponent","target":"ns=1;i=14287"},{"referenceType":"HasComponent","target":"ns=1;i=14289"},{"referenceType":"HasComponent","target":"ns=1;i=5247"}],"typeDefinition":"ns=1;i=1028"},{"browseName":"1:ActualControlMode","dataType":"ControlModeEnum","description":[{"value":"This property describes the actual control mode of the pump."}],"displayName":[{"value":"ActualControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11360","parentNodeId":"ns=1;i=5234","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11674"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11674","parentNodeId":"ns=1;i=11360","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11360"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ActualOperationMode","dataType":"OperationModeEnum","description":[{"value":"This property describes the actual operation mode of the pump."}],"displayName":[{"value":"ActualOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11361","parentNodeId":"ns=1;i=5234","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11673"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11673","parentNodeId":"ns=1;i=11361","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11361"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:CleanValveRequest","description":[{"value":"This element offers a request for the opening of the clean valve."}],"displayName":[{"value":"CleanValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5237","parentNodeId":"ns=1;i=5234","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=11362"},{"referenceType":"HasComponent","target":"ns=1;i=11657"},{"referenceType":"HasComponent","target":"ns=1;i=11661"},{"referenceType":"HasComponent","target":"ns=1;i=11665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11669"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11362","parentNodeId":"ns=1;i=5237","references":[{"referenceType":"HasProperty","target":"ns=1;i=11656"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5237"},{"referenceType":"HasProperty","target":"ns=1;i=11363"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=11364"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11656","parentNodeId":"ns=1;i=11362","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11362"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11363","parentNodeId":"ns=1;i=11362","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11362"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11364","parentNodeId":"ns=1;i=11362","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11362"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11657","parentNodeId":"ns=1;i=5237","references":[{"referenceType":"HasProperty","target":"ns=1;i=11658"},{"referenceType":"HasProperty","target":"ns=1;i=11659"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11660"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11658","parentNodeId":"ns=1;i=11657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11657"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11659","parentNodeId":"ns=1;i=11657","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11657"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11660","parentNodeId":"ns=1;i=11657","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11657"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11661","parentNodeId":"ns=1;i=5237","references":[{"referenceType":"HasProperty","target":"ns=1;i=11662"},{"referenceType":"HasProperty","target":"ns=1;i=11663"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11664"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11662","parentNodeId":"ns=1;i=11661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11661"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11663","parentNodeId":"ns=1;i=11661","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11661"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11664","parentNodeId":"ns=1;i=11661","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11661"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11665","parentNodeId":"ns=1;i=5237","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11666"},{"referenceType":"HasProperty","target":"ns=1;i=11667"},{"referenceType":"HasProperty","target":"ns=1;i=11668"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5237"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11666","parentNodeId":"ns=1;i=11665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11667","parentNodeId":"ns=1;i=11665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11668","parentNodeId":"ns=1;i=11665","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11665"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11669","parentNodeId":"ns=1;i=5237","references":[{"referenceType":"HasProperty","target":"ns=1;i=11670"},{"referenceType":"HasProperty","target":"ns=1;i=11671"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5237"},{"referenceType":"HasProperty","target":"ns=1;i=11672"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11670","parentNodeId":"ns=1;i=11669","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11669"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11671","parentNodeId":"ns=1;i=11669","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11669"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11672","parentNodeId":"ns=1;i=11669","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11669"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ControlInversion","dataType":"Boolean","description":[{"value":"This property offers the inversion of the selected control mode in operation mode AutoControl. A \u0022True\u0022 status means that the control mode inversion is activated and a \u0022False\u0022 status means that the control mode inversion is deactivated."}],"displayName":[{"value":"ControlInversion"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11365","parentNodeId":"ns=1;i=5234","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasProperty","target":"ns=1;i=11675"},{"referenceType":"HasProperty","target":"ns=1;i=11366"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11367"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11675","parentNodeId":"ns=1;i=11365","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11365"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11366","parentNodeId":"ns=1;i=11365","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11365"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11367","parentNodeId":"ns=1;i=11365","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11365"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Enable","dataType":"Boolean","description":[{"value":"This property activates of the control function."}],"displayName":[{"value":"Enable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11368","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasProperty","target":"ns=1;i=11677"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasProperty","target":"ns=1;i=11369"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11370"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11677","parentNodeId":"ns=1;i=11368","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11368"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11369","parentNodeId":"ns=1;i=11368","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11368"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11370","parentNodeId":"ns=1;i=11368","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11368"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ExternalSignal","dataType":"Boolean","description":[{"value":"This property offers the activation of an external electrical interface serving the setpoint of the control function by selecting the kind of electrical (analogue) signal."}],"displayName":[{"value":"ExternalSignal"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11371","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasProperty","target":"ns=1;i=11676"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasProperty","target":"ns=1;i=11372"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=11373"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11676","parentNodeId":"ns=1;i=11371","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11371"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11372","parentNodeId":"ns=1;i=11371","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11371"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=11373","parentNodeId":"ns=1;i=11371","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11371"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14109","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasProperty","target":"ns=1;i=14110"},{"referenceType":"HasProperty","target":"ns=1;i=14111"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14112"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14110","parentNodeId":"ns=1;i=14109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14109"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14111","parentNodeId":"ns=1;i=14109","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14109"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14112","parentNodeId":"ns=1;i=14109","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14109"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14113","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14114"},{"referenceType":"HasProperty","target":"ns=1;i=14115"},{"referenceType":"HasProperty","target":"ns=1;i=14116"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14114","parentNodeId":"ns=1;i=14113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14115","parentNodeId":"ns=1;i=14113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14116","parentNodeId":"ns=1;i=14113","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14113"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14117","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=14118"},{"referenceType":"HasProperty","target":"ns=1;i=14119"},{"referenceType":"HasProperty","target":"ns=1;i=14120"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14118","parentNodeId":"ns=1;i=14117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14119","parentNodeId":"ns=1;i=14117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14117"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14120","parentNodeId":"ns=1;i=14117","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14117"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FlushValveRequest","description":[{"value":"This element offers a request for the opening of the flush valve."}],"displayName":[{"value":"FlushValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5240","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14121"},{"referenceType":"HasComponent","target":"ns=1;i=14125"},{"referenceType":"HasComponent","target":"ns=1;i=14129"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14137"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14121","parentNodeId":"ns=1;i=5240","references":[{"referenceType":"HasProperty","target":"ns=1;i=14122"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5240"},{"referenceType":"HasProperty","target":"ns=1;i=14123"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14124"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14122","parentNodeId":"ns=1;i=14121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14121"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14123","parentNodeId":"ns=1;i=14121","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14121"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14124","parentNodeId":"ns=1;i=14121","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14121"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14125","parentNodeId":"ns=1;i=5240","references":[{"referenceType":"HasProperty","target":"ns=1;i=14126"},{"referenceType":"HasProperty","target":"ns=1;i=14127"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5240"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14128"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14126","parentNodeId":"ns=1;i=14125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14125"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14127","parentNodeId":"ns=1;i=14125","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14125"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14128","parentNodeId":"ns=1;i=14125","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14125"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14129","parentNodeId":"ns=1;i=5240","references":[{"referenceType":"HasProperty","target":"ns=1;i=14130"},{"referenceType":"HasProperty","target":"ns=1;i=14131"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5240"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14132"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14130","parentNodeId":"ns=1;i=14129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14129"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14131","parentNodeId":"ns=1;i=14129","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14129"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14132","parentNodeId":"ns=1;i=14129","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14129"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14133","parentNodeId":"ns=1;i=5240","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14134"},{"referenceType":"HasProperty","target":"ns=1;i=14135"},{"referenceType":"HasProperty","target":"ns=1;i=14136"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5240"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14134","parentNodeId":"ns=1;i=14133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14135","parentNodeId":"ns=1;i=14133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14136","parentNodeId":"ns=1;i=14133","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14133"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14137","parentNodeId":"ns=1;i=5240","references":[{"referenceType":"HasProperty","target":"ns=1;i=14138"},{"referenceType":"HasProperty","target":"ns=1;i=14139"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5240"},{"referenceType":"HasProperty","target":"ns=1;i=14140"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14138","parentNodeId":"ns=1;i=14137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14137"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14139","parentNodeId":"ns=1;i=14137","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14137"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14140","parentNodeId":"ns=1;i=14137","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14137"}],"typeDefinition":"i=68"},{"browseName":"1:GasDilValveRequest","description":[{"value":"This element offers a request for the opening of the gas dilution valve."}],"displayName":[{"value":"GasDilValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5241","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14141"},{"referenceType":"HasComponent","target":"ns=1;i=14145"},{"referenceType":"HasComponent","target":"ns=1;i=14149"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14157"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14141","parentNodeId":"ns=1;i=5241","references":[{"referenceType":"HasProperty","target":"ns=1;i=14142"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5241"},{"referenceType":"HasProperty","target":"ns=1;i=14143"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14144"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14142","parentNodeId":"ns=1;i=14141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14141"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14143","parentNodeId":"ns=1;i=14141","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14141"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14144","parentNodeId":"ns=1;i=14141","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14141"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14145","parentNodeId":"ns=1;i=5241","references":[{"referenceType":"HasProperty","target":"ns=1;i=14146"},{"referenceType":"HasProperty","target":"ns=1;i=14147"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14148"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14146","parentNodeId":"ns=1;i=14145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14145"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14147","parentNodeId":"ns=1;i=14145","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14145"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14148","parentNodeId":"ns=1;i=14145","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14145"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14149","parentNodeId":"ns=1;i=5241","references":[{"referenceType":"HasProperty","target":"ns=1;i=14150"},{"referenceType":"HasProperty","target":"ns=1;i=14151"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14152"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14150","parentNodeId":"ns=1;i=14149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14149"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14151","parentNodeId":"ns=1;i=14149","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14149"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14152","parentNodeId":"ns=1;i=14149","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14149"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14153","parentNodeId":"ns=1;i=5241","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14154"},{"referenceType":"HasProperty","target":"ns=1;i=14155"},{"referenceType":"HasProperty","target":"ns=1;i=14156"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5241"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14154","parentNodeId":"ns=1;i=14153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14155","parentNodeId":"ns=1;i=14153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14156","parentNodeId":"ns=1;i=14153","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14153"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14157","parentNodeId":"ns=1;i=5241","references":[{"referenceType":"HasProperty","target":"ns=1;i=14158"},{"referenceType":"HasProperty","target":"ns=1;i=14159"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5241"},{"referenceType":"HasProperty","target":"ns=1;i=14160"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14158","parentNodeId":"ns=1;i=14157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14157"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14159","parentNodeId":"ns=1;i=14157","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14157"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14160","parentNodeId":"ns=1;i=14157","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14157"}],"typeDefinition":"i=68"},{"browseName":"1:InletValveRequest","description":[{"value":"This element offers a request for the opening of the inlet valve."}],"displayName":[{"value":"InletValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5242","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14161"},{"referenceType":"HasComponent","target":"ns=1;i=14165"},{"referenceType":"HasComponent","target":"ns=1;i=14169"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14173"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14177"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14161","parentNodeId":"ns=1;i=5242","references":[{"referenceType":"HasProperty","target":"ns=1;i=14162"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5242"},{"referenceType":"HasProperty","target":"ns=1;i=14163"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14164"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14162","parentNodeId":"ns=1;i=14161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14161"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14163","parentNodeId":"ns=1;i=14161","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14161"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14164","parentNodeId":"ns=1;i=14161","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14161"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14165","parentNodeId":"ns=1;i=5242","references":[{"referenceType":"HasProperty","target":"ns=1;i=14166"},{"referenceType":"HasProperty","target":"ns=1;i=14167"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14168"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14166","parentNodeId":"ns=1;i=14165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14165"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14167","parentNodeId":"ns=1;i=14165","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14165"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14168","parentNodeId":"ns=1;i=14165","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14165"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14169","parentNodeId":"ns=1;i=5242","references":[{"referenceType":"HasProperty","target":"ns=1;i=14170"},{"referenceType":"HasProperty","target":"ns=1;i=14171"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5242"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14172"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14170","parentNodeId":"ns=1;i=14169","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14169"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14171","parentNodeId":"ns=1;i=14169","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14169"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14172","parentNodeId":"ns=1;i=14169","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14169"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14173","parentNodeId":"ns=1;i=5242","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14174"},{"referenceType":"HasProperty","target":"ns=1;i=14175"},{"referenceType":"HasProperty","target":"ns=1;i=14176"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5242"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14174","parentNodeId":"ns=1;i=14173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14173"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14175","parentNodeId":"ns=1;i=14173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14173"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14176","parentNodeId":"ns=1;i=14173","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14173"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14177","parentNodeId":"ns=1;i=5242","references":[{"referenceType":"HasProperty","target":"ns=1;i=14178"},{"referenceType":"HasProperty","target":"ns=1;i=14179"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5242"},{"referenceType":"HasProperty","target":"ns=1;i=14180"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14178","parentNodeId":"ns=1;i=14177","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14177"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14179","parentNodeId":"ns=1;i=14177","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14177"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14180","parentNodeId":"ns=1;i=14177","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14177"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14181","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14182"},{"referenceType":"HasProperty","target":"ns=1;i=14183"},{"referenceType":"HasProperty","target":"ns=1;i=14184"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14182","parentNodeId":"ns=1;i=14181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14181"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14183","parentNodeId":"ns=1;i=14181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14181"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14184","parentNodeId":"ns=1;i=14181","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14181"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14185","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasProperty","target":"ns=1;i=14186"},{"referenceType":"HasProperty","target":"ns=1;i=14187"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14188"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14186","parentNodeId":"ns=1;i=14185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14185"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14187","parentNodeId":"ns=1;i=14185","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14185"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14188","parentNodeId":"ns=1;i=14185","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14185"}],"typeDefinition":"i=68"},{"browseName":"1:OutletValveRequest","description":[{"value":"This element offers a request for the opening of the outlet valve."}],"displayName":[{"value":"OutletValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5243","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14189"},{"referenceType":"HasComponent","target":"ns=1;i=14193"},{"referenceType":"HasComponent","target":"ns=1;i=14197"},{"referenceType":"HasComponent","target":"ns=1;i=14201"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14205"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14189","parentNodeId":"ns=1;i=5243","references":[{"referenceType":"HasProperty","target":"ns=1;i=14190"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5243"},{"referenceType":"HasProperty","target":"ns=1;i=14191"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14192"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14190","parentNodeId":"ns=1;i=14189","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14189"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14191","parentNodeId":"ns=1;i=14189","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14189"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14192","parentNodeId":"ns=1;i=14189","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14189"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14193","parentNodeId":"ns=1;i=5243","references":[{"referenceType":"HasProperty","target":"ns=1;i=14194"},{"referenceType":"HasProperty","target":"ns=1;i=14195"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5243"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14196"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14194","parentNodeId":"ns=1;i=14193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14193"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14195","parentNodeId":"ns=1;i=14193","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14193"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14196","parentNodeId":"ns=1;i=14193","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14193"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14197","parentNodeId":"ns=1;i=5243","references":[{"referenceType":"HasProperty","target":"ns=1;i=14198"},{"referenceType":"HasProperty","target":"ns=1;i=14199"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5243"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14200"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14198","parentNodeId":"ns=1;i=14197","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14197"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14199","parentNodeId":"ns=1;i=14197","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14197"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14200","parentNodeId":"ns=1;i=14197","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14197"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14201","parentNodeId":"ns=1;i=5243","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14202"},{"referenceType":"HasProperty","target":"ns=1;i=14203"},{"referenceType":"HasProperty","target":"ns=1;i=14204"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5243"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14202","parentNodeId":"ns=1;i=14201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14203","parentNodeId":"ns=1;i=14201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14204","parentNodeId":"ns=1;i=14201","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14201"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14205","parentNodeId":"ns=1;i=5243","references":[{"referenceType":"HasProperty","target":"ns=1;i=14206"},{"referenceType":"HasProperty","target":"ns=1;i=14207"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5243"},{"referenceType":"HasProperty","target":"ns=1;i=14208"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14206","parentNodeId":"ns=1;i=14205","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14205"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14207","parentNodeId":"ns=1;i=14205","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14205"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14208","parentNodeId":"ns=1;i=14205","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14205"}],"typeDefinition":"i=68"},{"browseName":"1:PumpKick","description":[{"value":"This element describes a periodical operation of a pump, avoiding blockage at non operation time."}],"displayName":[{"value":"PumpKick"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5244","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasComponent","target":"ns=1;i=14209"},{"referenceType":"HasComponent","target":"ns=1;i=14213"},{"referenceType":"HasComponent","target":"ns=1;i=14217"},{"referenceType":"HasComponent","target":"ns=1;i=14221"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14225"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1032"},{"referenceType":"HasComponent","target":"ns=1;i=14227"},{"referenceType":"HasComponent","target":"ns=1;i=14229"},{"referenceType":"HasComponent","target":"ns=1;i=14233"}],"typeDefinition":"ns=1;i=1032"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14209","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasProperty","target":"ns=1;i=14210"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"},{"referenceType":"HasProperty","target":"ns=1;i=14211"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14212"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14210","parentNodeId":"ns=1;i=14209","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14209"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14211","parentNodeId":"ns=1;i=14209","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14209"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14212","parentNodeId":"ns=1;i=14209","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14209"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14213","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasProperty","target":"ns=1;i=14214"},{"referenceType":"HasProperty","target":"ns=1;i=14215"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14216"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14214","parentNodeId":"ns=1;i=14213","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14213"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14215","parentNodeId":"ns=1;i=14213","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14213"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14216","parentNodeId":"ns=1;i=14213","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14213"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14217","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasProperty","target":"ns=1;i=14218"},{"referenceType":"HasProperty","target":"ns=1;i=14219"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14220"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14218","parentNodeId":"ns=1;i=14217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14217"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14219","parentNodeId":"ns=1;i=14217","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14217"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14220","parentNodeId":"ns=1;i=14217","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14217"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14221","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14222"},{"referenceType":"HasProperty","target":"ns=1;i=14223"},{"referenceType":"HasProperty","target":"ns=1;i=14224"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14222","parentNodeId":"ns=1;i=14221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14223","parentNodeId":"ns=1;i=14221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14224","parentNodeId":"ns=1;i=14221","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14221"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickMode","dataType":"PumpKickModeEnum","description":[{"value":"This property describes the pump kick mode of the pump."}],"displayName":[{"value":"PumpKickMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14225","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=14226"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14226","parentNodeId":"ns=1;i=14225","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14225"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTime","dataType":"Double","description":[{"value":"This property determines the absolute time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTime"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14227","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=14228"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14228","parentNodeId":"ns=1;i=14227","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14227"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:PumpKickTimeDifference","dataType":"Double","description":[{"value":"This property determines the interval time of a pump kick, if Pump Kick Mode is operator specific. The time for the next pump kick results of the sum of Pump Kick Time and Pump Kick Time Difference"}],"displayName":[{"value":"PumpKickTimeDifference"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14229","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=14230"},{"referenceType":"HasProperty","target":"ns=1;i=14231"},{"referenceType":"HasProperty","target":"ns=1;i=14232"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"}],"typeDefinition":"i=17497","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14230","parentNodeId":"ns=1;i=14229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14229"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14231","parentNodeId":"ns=1;i=14229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14229"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740434\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eh\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14232","parentNodeId":"ns=1;i=14229","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14229"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14233","parentNodeId":"ns=1;i=5244","references":[{"referenceType":"HasProperty","target":"ns=1;i=14234"},{"referenceType":"HasProperty","target":"ns=1;i=14235"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5244"},{"referenceType":"HasProperty","target":"ns=1;i=14236"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14234","parentNodeId":"ns=1;i=14233","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14233"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14235","parentNodeId":"ns=1;i=14233","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14233"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14236","parentNodeId":"ns=1;i=14233","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14233"}],"typeDefinition":"i=68"},{"browseName":"1:PumpStandByRequest","description":[{"value":"This element offers a request for pump standby."}],"displayName":[{"value":"PumpStandByRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5245","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14237"},{"referenceType":"HasComponent","target":"ns=1;i=14241"},{"referenceType":"HasComponent","target":"ns=1;i=14245"},{"referenceType":"HasComponent","target":"ns=1;i=14249"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14253"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14237","parentNodeId":"ns=1;i=5245","references":[{"referenceType":"HasProperty","target":"ns=1;i=14238"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5245"},{"referenceType":"HasProperty","target":"ns=1;i=14239"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14240"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14238","parentNodeId":"ns=1;i=14237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14237"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14239","parentNodeId":"ns=1;i=14237","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14237"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14240","parentNodeId":"ns=1;i=14237","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14237"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14241","parentNodeId":"ns=1;i=5245","references":[{"referenceType":"HasProperty","target":"ns=1;i=14242"},{"referenceType":"HasProperty","target":"ns=1;i=14243"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14244"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14242","parentNodeId":"ns=1;i=14241","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14241"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14243","parentNodeId":"ns=1;i=14241","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14241"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14244","parentNodeId":"ns=1;i=14241","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14241"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14245","parentNodeId":"ns=1;i=5245","references":[{"referenceType":"HasProperty","target":"ns=1;i=14246"},{"referenceType":"HasProperty","target":"ns=1;i=14247"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14248"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14246","parentNodeId":"ns=1;i=14245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14245"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14247","parentNodeId":"ns=1;i=14245","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14245"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14248","parentNodeId":"ns=1;i=14245","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14245"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14249","parentNodeId":"ns=1;i=5245","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14250"},{"referenceType":"HasProperty","target":"ns=1;i=14251"},{"referenceType":"HasProperty","target":"ns=1;i=14252"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5245"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14250","parentNodeId":"ns=1;i=14249","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14249"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14251","parentNodeId":"ns=1;i=14249","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14249"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14252","parentNodeId":"ns=1;i=14249","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14249"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14253","parentNodeId":"ns=1;i=5245","references":[{"referenceType":"HasProperty","target":"ns=1;i=14254"},{"referenceType":"HasProperty","target":"ns=1;i=14255"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5245"},{"referenceType":"HasProperty","target":"ns=1;i=14256"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14254","parentNodeId":"ns=1;i=14253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14253"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14255","parentNodeId":"ns=1;i=14253","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14253"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14256","parentNodeId":"ns=1;i=14253","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14253"}],"typeDefinition":"i=68"},{"browseName":"1:PurgeValveRequest","description":[{"value":"This element offers a request for the opening of the purge valve."}],"displayName":[{"value":"PurgeValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5246","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14257"},{"referenceType":"HasComponent","target":"ns=1;i=14261"},{"referenceType":"HasComponent","target":"ns=1;i=14265"},{"referenceType":"HasComponent","target":"ns=1;i=14269"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasComponent","target":"ns=1;i=14273"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14257","parentNodeId":"ns=1;i=5246","references":[{"referenceType":"HasProperty","target":"ns=1;i=14258"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5246"},{"referenceType":"HasProperty","target":"ns=1;i=14259"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14260"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14258","parentNodeId":"ns=1;i=14257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14257"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14259","parentNodeId":"ns=1;i=14257","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14257"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14260","parentNodeId":"ns=1;i=14257","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14257"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14261","parentNodeId":"ns=1;i=5246","references":[{"referenceType":"HasProperty","target":"ns=1;i=14262"},{"referenceType":"HasProperty","target":"ns=1;i=14263"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5246"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14264"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14262","parentNodeId":"ns=1;i=14261","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14261"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14263","parentNodeId":"ns=1;i=14261","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14261"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14264","parentNodeId":"ns=1;i=14261","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14261"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14265","parentNodeId":"ns=1;i=5246","references":[{"referenceType":"HasProperty","target":"ns=1;i=14266"},{"referenceType":"HasProperty","target":"ns=1;i=14267"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5246"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14268"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14266","parentNodeId":"ns=1;i=14265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14265"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14267","parentNodeId":"ns=1;i=14265","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14265"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14268","parentNodeId":"ns=1;i=14265","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14265"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14269","parentNodeId":"ns=1;i=5246","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14270"},{"referenceType":"HasProperty","target":"ns=1;i=14271"},{"referenceType":"HasProperty","target":"ns=1;i=14272"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5246"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14270","parentNodeId":"ns=1;i=14269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14269"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14271","parentNodeId":"ns=1;i=14269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14269"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14272","parentNodeId":"ns=1;i=14269","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14269"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14273","parentNodeId":"ns=1;i=5246","references":[{"referenceType":"HasProperty","target":"ns=1;i=14274"},{"referenceType":"HasProperty","target":"ns=1;i=14275"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5246"},{"referenceType":"HasProperty","target":"ns=1;i=14276"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14274","parentNodeId":"ns=1;i=14273","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14273"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14275","parentNodeId":"ns=1;i=14273","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14273"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14276","parentNodeId":"ns=1;i=14273","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14273"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14277","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=14278"},{"referenceType":"HasProperty","target":"ns=1;i=14279"},{"referenceType":"HasProperty","target":"ns=1;i=14280"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14278","parentNodeId":"ns=1;i=14277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14279","parentNodeId":"ns=1;i=14277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14277"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14280","parentNodeId":"ns=1;i=14277","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14277"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReverseRotatingDirection","dataType":"Boolean","description":[{"value":"This property indicates the inversion of the standard rotating direction."}],"displayName":[{"value":"ReverseRotatingDirection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14281","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasProperty","target":"ns=1;i=14282"},{"referenceType":"HasProperty","target":"ns=1;i=14283"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasProperty","target":"ns=1;i=14284"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14282","parentNodeId":"ns=1;i=14281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14281"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14283","parentNodeId":"ns=1;i=14281","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14281"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14284","parentNodeId":"ns=1;i=14281","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14281"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SetControlMode","dataType":"ControlModeEnum","description":[{"value":"This property describes the desired control mode of the pump."}],"displayName":[{"value":"SetControlMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14285","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=14286"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14286","parentNodeId":"ns=1;i=14285","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14285"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:SetOperationMode","dataType":"OperationModeEnum","description":[{"value":"This property describes the desired operation mode of the pump."}],"displayName":[{"value":"SetOperationMode"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14287","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=14288"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14288","parentNodeId":"ns=1;i=14287","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14287"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14289","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasProperty","target":"ns=1;i=14290"},{"referenceType":"HasProperty","target":"ns=1;i=14291"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"},{"referenceType":"HasProperty","target":"ns=1;i=14292"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14290","parentNodeId":"ns=1;i=14289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14289"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14291","parentNodeId":"ns=1;i=14289","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14289"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14292","parentNodeId":"ns=1;i=14289","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14289"}],"typeDefinition":"i=68"},{"browseName":"1:VentValveRequest","description":[{"value":"This element offers a request for the opening of the vent valve."}],"displayName":[{"value":"VentValveRequest"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5247","parentNodeId":"ns=1;i=5234","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1031"},{"referenceType":"HasComponent","target":"ns=1;i=14293"},{"referenceType":"HasComponent","target":"ns=1;i=14297"},{"referenceType":"HasComponent","target":"ns=1;i=14301"},{"referenceType":"HasComponent","target":"ns=1;i=14305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14309"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5234"}],"typeDefinition":"ns=1;i=1031"},{"accessLevel":3,"browseName":"1:DiscreteOutputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete output unit."}],"displayName":[{"value":"DiscreteOutputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14293","parentNodeId":"ns=1;i=5247","references":[{"referenceType":"HasProperty","target":"ns=1;i=14294"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5247"},{"referenceType":"HasProperty","target":"ns=1;i=14295"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14296"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14294","parentNodeId":"ns=1;i=14293","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14293"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14295","parentNodeId":"ns=1;i=14293","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14293"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14296","parentNodeId":"ns=1;i=14293","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14293"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state."}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14297","parentNodeId":"ns=1;i=5247","references":[{"referenceType":"HasProperty","target":"ns=1;i=14298"},{"referenceType":"HasProperty","target":"ns=1;i=14299"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14300"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14298","parentNodeId":"ns=1;i=14297","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14297"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14299","parentNodeId":"ns=1;i=14297","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14297"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14300","parentNodeId":"ns=1;i=14297","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14297"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Boolean","description":[{"value":"This property specifies a user-defined value for use with Fault action property."}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14301","parentNodeId":"ns=1;i=5247","references":[{"referenceType":"HasProperty","target":"ns=1;i=14302"},{"referenceType":"HasProperty","target":"ns=1;i=14303"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5247"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14304"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14302","parentNodeId":"ns=1;i=14301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14301"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14303","parentNodeId":"ns=1;i=14301","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14301"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14304","parentNodeId":"ns=1;i=14301","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14301"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14305","parentNodeId":"ns=1;i=5247","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14306"},{"referenceType":"HasProperty","target":"ns=1;i=14307"},{"referenceType":"HasProperty","target":"ns=1;i=14308"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5247"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14306","parentNodeId":"ns=1;i=14305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14307","parentNodeId":"ns=1;i=14305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14308","parentNodeId":"ns=1;i=14305","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14305"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14309","parentNodeId":"ns=1;i=5247","references":[{"referenceType":"HasProperty","target":"ns=1;i=14310"},{"referenceType":"HasProperty","target":"ns=1;i=14311"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5247"},{"referenceType":"HasProperty","target":"ns=1;i=14312"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14310","parentNodeId":"ns=1;i=14309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14309"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14311","parentNodeId":"ns=1;i=14309","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14309"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14312","parentNodeId":"ns=1;i=14309","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14309"}],"typeDefinition":"i=68"},{"browseName":"1:Signals","description":[{"value":"Signals of a pump."}],"displayName":[{"value":"Signals"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5235","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasComponent","target":"ns=1;i=5248"},{"referenceType":"HasComponent","target":"ns=1;i=5249"},{"referenceType":"HasComponent","target":"ns=1;i=5250"},{"referenceType":"HasComponent","target":"ns=1;i=5251"},{"referenceType":"HasComponent","target":"ns=1;i=5252"},{"referenceType":"HasComponent","target":"ns=1;i=5253"},{"referenceType":"HasComponent","target":"ns=1;i=5254"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5255"},{"referenceType":"HasComponent","target":"ns=1;i=5256"},{"referenceType":"HasComponent","target":"ns=1;i=5257"},{"referenceType":"HasComponent","target":"ns=1;i=5258"},{"referenceType":"HasComponent","target":"ns=1;i=5259"},{"referenceType":"HasComponent","target":"ns=1;i=5260"},{"referenceType":"HasComponent","target":"ns=1;i=5261"},{"referenceType":"HasComponent","target":"ns=1;i=5262"},{"referenceType":"HasComponent","target":"ns=1;i=5263"},{"referenceType":"HasComponent","target":"ns=1;i=5264"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1033"},{"referenceType":"HasComponent","target":"ns=1;i=5265"},{"referenceType":"HasComponent","target":"ns=1;i=5266"},{"referenceType":"HasComponent","target":"ns=1;i=5267"},{"referenceType":"HasComponent","target":"ns=1;i=5268"}],"typeDefinition":"ns=1;i=1033"},{"browseName":"1:Acceleration","description":[{"value":"This element serves a feedback that the pump rotation accelerates."}],"displayName":[{"value":"Acceleration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5248","parentNodeId":"ns=1;i=5235","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14341"},{"referenceType":"HasComponent","target":"ns=1;i=14345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14349"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14341","parentNodeId":"ns=1;i=5248","references":[{"referenceType":"HasProperty","target":"ns=1;i=14342"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5248"},{"referenceType":"HasProperty","target":"ns=1;i=14343"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14344"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14342","parentNodeId":"ns=1;i=14341","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14341"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14343","parentNodeId":"ns=1;i=14341","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14341"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14344","parentNodeId":"ns=1;i=14341","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14341"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14345","parentNodeId":"ns=1;i=5248","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14346"},{"referenceType":"HasProperty","target":"ns=1;i=14347"},{"referenceType":"HasProperty","target":"ns=1;i=14348"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5248"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14346","parentNodeId":"ns=1;i=14345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14347","parentNodeId":"ns=1;i=14345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14348","parentNodeId":"ns=1;i=14345","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14345"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14349","parentNodeId":"ns=1;i=5248","references":[{"referenceType":"HasProperty","target":"ns=1;i=14350"},{"referenceType":"HasProperty","target":"ns=1;i=14351"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5248"},{"referenceType":"HasProperty","target":"ns=1;i=14352"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14350","parentNodeId":"ns=1;i=14349","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14349"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14351","parentNodeId":"ns=1;i=14349","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14349"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14352","parentNodeId":"ns=1;i=14349","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14349"}],"typeDefinition":"i=68"},{"browseName":"1:CleanValveOpen","description":[{"value":"This element serves a feedback about the open state of the cleaning valve."}],"displayName":[{"value":"CleanValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5249","parentNodeId":"ns=1;i=5235","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14353"},{"referenceType":"HasComponent","target":"ns=1;i=14357"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14361"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14353","parentNodeId":"ns=1;i=5249","references":[{"referenceType":"HasProperty","target":"ns=1;i=14354"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5249"},{"referenceType":"HasProperty","target":"ns=1;i=14355"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14356"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14354","parentNodeId":"ns=1;i=14353","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14353"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14355","parentNodeId":"ns=1;i=14353","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14353"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14356","parentNodeId":"ns=1;i=14353","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14353"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14357","parentNodeId":"ns=1;i=5249","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14358"},{"referenceType":"HasProperty","target":"ns=1;i=14359"},{"referenceType":"HasProperty","target":"ns=1;i=14360"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5249"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14358","parentNodeId":"ns=1;i=14357","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14357"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14359","parentNodeId":"ns=1;i=14357","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14357"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14360","parentNodeId":"ns=1;i=14357","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14357"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14361","parentNodeId":"ns=1;i=5249","references":[{"referenceType":"HasProperty","target":"ns=1;i=14362"},{"referenceType":"HasProperty","target":"ns=1;i=14363"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5249"},{"referenceType":"HasProperty","target":"ns=1;i=14364"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14362","parentNodeId":"ns=1;i=14361","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14361"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14363","parentNodeId":"ns=1;i=14361","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14361"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14364","parentNodeId":"ns=1;i=14361","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14361"}],"typeDefinition":"i=68"},{"browseName":"1:Deceleration","description":[{"value":"This element serves a feedback that the pump rotation decelerates."}],"displayName":[{"value":"Deceleration"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5250","parentNodeId":"ns=1;i=5235","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14365"},{"referenceType":"HasComponent","target":"ns=1;i=14369"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14373"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14365","parentNodeId":"ns=1;i=5250","references":[{"referenceType":"HasProperty","target":"ns=1;i=14366"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5250"},{"referenceType":"HasProperty","target":"ns=1;i=14367"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14368"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14366","parentNodeId":"ns=1;i=14365","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14365"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14367","parentNodeId":"ns=1;i=14365","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14365"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14368","parentNodeId":"ns=1;i=14365","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14365"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14369","parentNodeId":"ns=1;i=5250","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14370"},{"referenceType":"HasProperty","target":"ns=1;i=14371"},{"referenceType":"HasProperty","target":"ns=1;i=14372"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5250"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14370","parentNodeId":"ns=1;i=14369","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14369"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14371","parentNodeId":"ns=1;i=14369","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14369"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14372","parentNodeId":"ns=1;i=14369","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14369"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14373","parentNodeId":"ns=1;i=5250","references":[{"referenceType":"HasProperty","target":"ns=1;i=14374"},{"referenceType":"HasProperty","target":"ns=1;i=14375"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5250"},{"referenceType":"HasProperty","target":"ns=1;i=14376"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14374","parentNodeId":"ns=1;i=14373","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14373"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14375","parentNodeId":"ns=1;i=14373","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14373"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14376","parentNodeId":"ns=1;i=14373","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14373"}],"typeDefinition":"i=68"},{"browseName":"1:FlushValveOpen","description":[{"value":"This element serves a feedback about the open state of the flush valve."}],"displayName":[{"value":"FlushValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5251","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14377"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14385"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14377","parentNodeId":"ns=1;i=5251","references":[{"referenceType":"HasProperty","target":"ns=1;i=14378"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5251"},{"referenceType":"HasProperty","target":"ns=1;i=14379"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14380"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14378","parentNodeId":"ns=1;i=14377","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14377"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14379","parentNodeId":"ns=1;i=14377","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14377"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14380","parentNodeId":"ns=1;i=14377","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14377"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14381","parentNodeId":"ns=1;i=5251","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14382"},{"referenceType":"HasProperty","target":"ns=1;i=14383"},{"referenceType":"HasProperty","target":"ns=1;i=14384"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5251"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14382","parentNodeId":"ns=1;i=14381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14383","parentNodeId":"ns=1;i=14381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14384","parentNodeId":"ns=1;i=14381","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14381"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14385","parentNodeId":"ns=1;i=5251","references":[{"referenceType":"HasProperty","target":"ns=1;i=14386"},{"referenceType":"HasProperty","target":"ns=1;i=14387"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5251"},{"referenceType":"HasProperty","target":"ns=1;i=14388"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14386","parentNodeId":"ns=1;i=14385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14385"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14387","parentNodeId":"ns=1;i=14385","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14385"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14388","parentNodeId":"ns=1;i=14385","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14385"}],"typeDefinition":"i=68"},{"browseName":"1:GasDilValveOpen","description":[{"value":"This element serves a feedback about the open state of the gas dilution valve."}],"displayName":[{"value":"GasDilValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5252","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14389"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14397"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14389","parentNodeId":"ns=1;i=5252","references":[{"referenceType":"HasProperty","target":"ns=1;i=14390"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5252"},{"referenceType":"HasProperty","target":"ns=1;i=14391"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14392"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14390","parentNodeId":"ns=1;i=14389","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14389"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14391","parentNodeId":"ns=1;i=14389","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14389"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14392","parentNodeId":"ns=1;i=14389","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14389"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14393","parentNodeId":"ns=1;i=5252","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14394"},{"referenceType":"HasProperty","target":"ns=1;i=14395"},{"referenceType":"HasProperty","target":"ns=1;i=14396"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5252"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14394","parentNodeId":"ns=1;i=14393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14395","parentNodeId":"ns=1;i=14393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14396","parentNodeId":"ns=1;i=14393","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14393"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14397","parentNodeId":"ns=1;i=5252","references":[{"referenceType":"HasProperty","target":"ns=1;i=14398"},{"referenceType":"HasProperty","target":"ns=1;i=14399"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5252"},{"referenceType":"HasProperty","target":"ns=1;i=14400"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14398","parentNodeId":"ns=1;i=14397","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14397"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14399","parentNodeId":"ns=1;i=14397","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14397"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14400","parentNodeId":"ns=1;i=14397","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14397"}],"typeDefinition":"i=68"},{"browseName":"1:InletValveOpen","description":[{"value":"This element serves a feedback about the open state of the inlet valve."}],"displayName":[{"value":"InletValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5253","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14401"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14409"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14401","parentNodeId":"ns=1;i=5253","references":[{"referenceType":"HasProperty","target":"ns=1;i=14402"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5253"},{"referenceType":"HasProperty","target":"ns=1;i=14403"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14404"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14402","parentNodeId":"ns=1;i=14401","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14401"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14403","parentNodeId":"ns=1;i=14401","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14401"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14404","parentNodeId":"ns=1;i=14401","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14401"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14405","parentNodeId":"ns=1;i=5253","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14406"},{"referenceType":"HasProperty","target":"ns=1;i=14407"},{"referenceType":"HasProperty","target":"ns=1;i=14408"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5253"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14406","parentNodeId":"ns=1;i=14405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14407","parentNodeId":"ns=1;i=14405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14408","parentNodeId":"ns=1;i=14405","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14405"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14409","parentNodeId":"ns=1;i=5253","references":[{"referenceType":"HasProperty","target":"ns=1;i=14410"},{"referenceType":"HasProperty","target":"ns=1;i=14411"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5253"},{"referenceType":"HasProperty","target":"ns=1;i=14412"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14410","parentNodeId":"ns=1;i=14409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14409"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14411","parentNodeId":"ns=1;i=14409","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14409"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14412","parentNodeId":"ns=1;i=14409","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14409"}],"typeDefinition":"i=68"},{"browseName":"1:NoRotation","description":[{"value":"This element serves a feedback that the pump stands still."}],"displayName":[{"value":"NoRotation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5254","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14413"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14421"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14413","parentNodeId":"ns=1;i=5254","references":[{"referenceType":"HasProperty","target":"ns=1;i=14414"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5254"},{"referenceType":"HasProperty","target":"ns=1;i=14415"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14416"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14414","parentNodeId":"ns=1;i=14413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14413"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14415","parentNodeId":"ns=1;i=14413","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14413"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14416","parentNodeId":"ns=1;i=14413","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14413"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14417","parentNodeId":"ns=1;i=5254","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14418"},{"referenceType":"HasProperty","target":"ns=1;i=14419"},{"referenceType":"HasProperty","target":"ns=1;i=14420"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5254"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14418","parentNodeId":"ns=1;i=14417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14419","parentNodeId":"ns=1;i=14417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14420","parentNodeId":"ns=1;i=14417","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14417"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14421","parentNodeId":"ns=1;i=5254","references":[{"referenceType":"HasProperty","target":"ns=1;i=14422"},{"referenceType":"HasProperty","target":"ns=1;i=14423"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5254"},{"referenceType":"HasProperty","target":"ns=1;i=14424"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14422","parentNodeId":"ns=1;i=14421","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14421"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14423","parentNodeId":"ns=1;i=14421","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14421"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14424","parentNodeId":"ns=1;i=14421","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14421"}],"typeDefinition":"i=68"},{"browseName":"1:OutletValveOpen","description":[{"value":"This element serves a feedback about the open state of the outlet valve."}],"displayName":[{"value":"OutletValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5255","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14425"},{"referenceType":"HasComponent","target":"ns=1;i=14429"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14433"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14425","parentNodeId":"ns=1;i=5255","references":[{"referenceType":"HasProperty","target":"ns=1;i=14426"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5255"},{"referenceType":"HasProperty","target":"ns=1;i=14427"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14428"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14426","parentNodeId":"ns=1;i=14425","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14425"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14427","parentNodeId":"ns=1;i=14425","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14425"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14428","parentNodeId":"ns=1;i=14425","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14425"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14429","parentNodeId":"ns=1;i=5255","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14430"},{"referenceType":"HasProperty","target":"ns=1;i=14431"},{"referenceType":"HasProperty","target":"ns=1;i=14432"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5255"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14430","parentNodeId":"ns=1;i=14429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14431","parentNodeId":"ns=1;i=14429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14432","parentNodeId":"ns=1;i=14429","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14429"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14433","parentNodeId":"ns=1;i=5255","references":[{"referenceType":"HasProperty","target":"ns=1;i=14434"},{"referenceType":"HasProperty","target":"ns=1;i=14435"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5255"},{"referenceType":"HasProperty","target":"ns=1;i=14436"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14434","parentNodeId":"ns=1;i=14433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14433"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14435","parentNodeId":"ns=1;i=14433","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14433"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14436","parentNodeId":"ns=1;i=14433","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14433"}],"typeDefinition":"i=68"},{"browseName":"1:ProcessIsActive","description":[{"value":"This element serves a feedback that the process is active."}],"displayName":[{"value":"ProcessIsActive"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5256","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14437"},{"referenceType":"HasComponent","target":"ns=1;i=14441"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14445"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14437","parentNodeId":"ns=1;i=5256","references":[{"referenceType":"HasProperty","target":"ns=1;i=14438"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5256"},{"referenceType":"HasProperty","target":"ns=1;i=14439"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14440"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14438","parentNodeId":"ns=1;i=14437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14437"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14439","parentNodeId":"ns=1;i=14437","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14437"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14440","parentNodeId":"ns=1;i=14437","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14437"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14441","parentNodeId":"ns=1;i=5256","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14442"},{"referenceType":"HasProperty","target":"ns=1;i=14443"},{"referenceType":"HasProperty","target":"ns=1;i=14444"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5256"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14442","parentNodeId":"ns=1;i=14441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14441"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14443","parentNodeId":"ns=1;i=14441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14441"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14444","parentNodeId":"ns=1;i=14441","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14441"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14445","parentNodeId":"ns=1;i=5256","references":[{"referenceType":"HasProperty","target":"ns=1;i=14446"},{"referenceType":"HasProperty","target":"ns=1;i=14447"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5256"},{"referenceType":"HasProperty","target":"ns=1;i=14448"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14446","parentNodeId":"ns=1;i=14445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14445"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14447","parentNodeId":"ns=1;i=14445","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14445"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14448","parentNodeId":"ns=1;i=14445","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14445"}],"typeDefinition":"i=68"},{"browseName":"1:PumpActivation","description":[{"value":"This element serves a feedback about the activation state of the pump. The activation state takes into account that control mechanisms are active. Never the less the pump is not necessarily running"}],"displayName":[{"value":"PumpActivation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5257","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14449"},{"referenceType":"HasComponent","target":"ns=1;i=14453"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14457"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14449","parentNodeId":"ns=1;i=5257","references":[{"referenceType":"HasProperty","target":"ns=1;i=14450"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5257"},{"referenceType":"HasProperty","target":"ns=1;i=14451"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14452"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14450","parentNodeId":"ns=1;i=14449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14449"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14451","parentNodeId":"ns=1;i=14449","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14449"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14452","parentNodeId":"ns=1;i=14449","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14449"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14453","parentNodeId":"ns=1;i=5257","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14454"},{"referenceType":"HasProperty","target":"ns=1;i=14455"},{"referenceType":"HasProperty","target":"ns=1;i=14456"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5257"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14454","parentNodeId":"ns=1;i=14453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14455","parentNodeId":"ns=1;i=14453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14456","parentNodeId":"ns=1;i=14453","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14453"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14457","parentNodeId":"ns=1;i=5257","references":[{"referenceType":"HasProperty","target":"ns=1;i=14458"},{"referenceType":"HasProperty","target":"ns=1;i=14459"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5257"},{"referenceType":"HasProperty","target":"ns=1;i=14460"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14458","parentNodeId":"ns=1;i=14457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14457"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14459","parentNodeId":"ns=1;i=14457","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14457"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14460","parentNodeId":"ns=1;i=14457","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14457"}],"typeDefinition":"i=68"},{"browseName":"1:PumpDirection","description":[{"value":"This element serves a feedback of the pumps direction of rotation."}],"displayName":[{"value":"PumpDirection"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5258","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14461"},{"referenceType":"HasComponent","target":"ns=1;i=14465"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14469"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14461","parentNodeId":"ns=1;i=5258","references":[{"referenceType":"HasProperty","target":"ns=1;i=14462"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5258"},{"referenceType":"HasProperty","target":"ns=1;i=14463"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14464"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14462","parentNodeId":"ns=1;i=14461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14461"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14463","parentNodeId":"ns=1;i=14461","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14461"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14464","parentNodeId":"ns=1;i=14461","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14461"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14465","parentNodeId":"ns=1;i=5258","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14466"},{"referenceType":"HasProperty","target":"ns=1;i=14467"},{"referenceType":"HasProperty","target":"ns=1;i=14468"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5258"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14466","parentNodeId":"ns=1;i=14465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14467","parentNodeId":"ns=1;i=14465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14468","parentNodeId":"ns=1;i=14465","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14465"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14469","parentNodeId":"ns=1;i=5258","references":[{"referenceType":"HasProperty","target":"ns=1;i=14470"},{"referenceType":"HasProperty","target":"ns=1;i=14471"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5258"},{"referenceType":"HasProperty","target":"ns=1;i=14472"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14470","parentNodeId":"ns=1;i=14469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14469"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14471","parentNodeId":"ns=1;i=14469","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14469"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14472","parentNodeId":"ns=1;i=14469","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14469"}],"typeDefinition":"i=68"},{"browseName":"1:PumpOperation","description":[{"value":"This element serves a feedback about the operation state of the pump. In the operation state the pump rotor is rotating."}],"displayName":[{"value":"PumpOperation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5259","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14473"},{"referenceType":"HasComponent","target":"ns=1;i=14477"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14481"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14473","parentNodeId":"ns=1;i=5259","references":[{"referenceType":"HasProperty","target":"ns=1;i=14474"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5259"},{"referenceType":"HasProperty","target":"ns=1;i=14475"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14476"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14474","parentNodeId":"ns=1;i=14473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14473"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14475","parentNodeId":"ns=1;i=14473","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14473"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14476","parentNodeId":"ns=1;i=14473","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14473"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14477","parentNodeId":"ns=1;i=5259","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14478"},{"referenceType":"HasProperty","target":"ns=1;i=14479"},{"referenceType":"HasProperty","target":"ns=1;i=14480"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5259"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14478","parentNodeId":"ns=1;i=14477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14479","parentNodeId":"ns=1;i=14477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14480","parentNodeId":"ns=1;i=14477","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14477"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14481","parentNodeId":"ns=1;i=5259","references":[{"referenceType":"HasProperty","target":"ns=1;i=14482"},{"referenceType":"HasProperty","target":"ns=1;i=14483"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5259"},{"referenceType":"HasProperty","target":"ns=1;i=14484"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14482","parentNodeId":"ns=1;i=14481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14481"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14483","parentNodeId":"ns=1;i=14481","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14481"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14484","parentNodeId":"ns=1;i=14481","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14481"}],"typeDefinition":"i=68"},{"browseName":"1:PumpPowerMax","description":[{"value":"This element serves a feedback of pump operating at maximum power."}],"displayName":[{"value":"PumpPowerMax"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5260","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14485"},{"referenceType":"HasComponent","target":"ns=1;i=14489"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14493"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14485","parentNodeId":"ns=1;i=5260","references":[{"referenceType":"HasProperty","target":"ns=1;i=14486"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5260"},{"referenceType":"HasProperty","target":"ns=1;i=14487"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14488"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14486","parentNodeId":"ns=1;i=14485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14485"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14487","parentNodeId":"ns=1;i=14485","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14485"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14488","parentNodeId":"ns=1;i=14485","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14485"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14489","parentNodeId":"ns=1;i=5260","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14490"},{"referenceType":"HasProperty","target":"ns=1;i=14491"},{"referenceType":"HasProperty","target":"ns=1;i=14492"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5260"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14490","parentNodeId":"ns=1;i=14489","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14489"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14491","parentNodeId":"ns=1;i=14489","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14489"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14492","parentNodeId":"ns=1;i=14489","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14489"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14493","parentNodeId":"ns=1;i=5260","references":[{"referenceType":"HasProperty","target":"ns=1;i=14494"},{"referenceType":"HasProperty","target":"ns=1;i=14495"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5260"},{"referenceType":"HasProperty","target":"ns=1;i=14496"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14494","parentNodeId":"ns=1;i=14493","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14493"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14495","parentNodeId":"ns=1;i=14493","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14493"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14496","parentNodeId":"ns=1;i=14493","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14493"}],"typeDefinition":"i=68"},{"browseName":"1:PumpSpeedMax","description":[{"value":"This element serves a feedback of pump operating at maximum speed."}],"displayName":[{"value":"PumpSpeedMax"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5261","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14497"},{"referenceType":"HasComponent","target":"ns=1;i=14501"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14505"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14497","parentNodeId":"ns=1;i=5261","references":[{"referenceType":"HasProperty","target":"ns=1;i=14498"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5261"},{"referenceType":"HasProperty","target":"ns=1;i=14499"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14500"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14498","parentNodeId":"ns=1;i=14497","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14497"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14499","parentNodeId":"ns=1;i=14497","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14497"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14500","parentNodeId":"ns=1;i=14497","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14497"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14501","parentNodeId":"ns=1;i=5261","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14502"},{"referenceType":"HasProperty","target":"ns=1;i=14503"},{"referenceType":"HasProperty","target":"ns=1;i=14504"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5261"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14502","parentNodeId":"ns=1;i=14501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14503","parentNodeId":"ns=1;i=14501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14504","parentNodeId":"ns=1;i=14501","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14501"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14505","parentNodeId":"ns=1;i=5261","references":[{"referenceType":"HasProperty","target":"ns=1;i=14506"},{"referenceType":"HasProperty","target":"ns=1;i=14507"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5261"},{"referenceType":"HasProperty","target":"ns=1;i=14508"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14506","parentNodeId":"ns=1;i=14505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14505"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14507","parentNodeId":"ns=1;i=14505","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14505"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14508","parentNodeId":"ns=1;i=14505","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14505"}],"typeDefinition":"i=68"},{"browseName":"1:PumpSpeedMin","description":[{"value":"This element serves a feedback that the pump operates at minimum speed."}],"displayName":[{"value":"PumpSpeedMin"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5262","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14509"},{"referenceType":"HasComponent","target":"ns=1;i=14513"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14517"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14509","parentNodeId":"ns=1;i=5262","references":[{"referenceType":"HasProperty","target":"ns=1;i=14510"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5262"},{"referenceType":"HasProperty","target":"ns=1;i=14511"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14512"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14510","parentNodeId":"ns=1;i=14509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14509"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14511","parentNodeId":"ns=1;i=14509","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14509"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14512","parentNodeId":"ns=1;i=14509","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14509"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14513","parentNodeId":"ns=1;i=5262","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14514"},{"referenceType":"HasProperty","target":"ns=1;i=14515"},{"referenceType":"HasProperty","target":"ns=1;i=14516"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5262"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14514","parentNodeId":"ns=1;i=14513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14515","parentNodeId":"ns=1;i=14513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14516","parentNodeId":"ns=1;i=14513","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14513"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14517","parentNodeId":"ns=1;i=5262","references":[{"referenceType":"HasProperty","target":"ns=1;i=14518"},{"referenceType":"HasProperty","target":"ns=1;i=14519"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5262"},{"referenceType":"HasProperty","target":"ns=1;i=14520"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14518","parentNodeId":"ns=1;i=14517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14517"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14519","parentNodeId":"ns=1;i=14517","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14517"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14520","parentNodeId":"ns=1;i=14517","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14517"}],"typeDefinition":"i=68"},{"browseName":"1:PurgeValveOpen","description":[{"value":"This element serves a feedback about the open state of the purge valve."}],"displayName":[{"value":"PurgeValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5263","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14521"},{"referenceType":"HasComponent","target":"ns=1;i=14525"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14529"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14521","parentNodeId":"ns=1;i=5263","references":[{"referenceType":"HasProperty","target":"ns=1;i=14522"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5263"},{"referenceType":"HasProperty","target":"ns=1;i=14523"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14524"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14522","parentNodeId":"ns=1;i=14521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14521"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14523","parentNodeId":"ns=1;i=14521","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14521"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14524","parentNodeId":"ns=1;i=14521","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14521"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14525","parentNodeId":"ns=1;i=5263","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14526"},{"referenceType":"HasProperty","target":"ns=1;i=14527"},{"referenceType":"HasProperty","target":"ns=1;i=14528"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5263"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14526","parentNodeId":"ns=1;i=14525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14527","parentNodeId":"ns=1;i=14525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14528","parentNodeId":"ns=1;i=14525","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14525"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14529","parentNodeId":"ns=1;i=5263","references":[{"referenceType":"HasProperty","target":"ns=1;i=14530"},{"referenceType":"HasProperty","target":"ns=1;i=14531"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5263"},{"referenceType":"HasProperty","target":"ns=1;i=14532"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14530","parentNodeId":"ns=1;i=14529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14529"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14531","parentNodeId":"ns=1;i=14529","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14529"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14532","parentNodeId":"ns=1;i=14529","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14529"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","description":[{"value":"This element serves a feedback that the pump rotation is at rated speed."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5264","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14533"},{"referenceType":"HasComponent","target":"ns=1;i=14537"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14541"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14533","parentNodeId":"ns=1;i=5264","references":[{"referenceType":"HasProperty","target":"ns=1;i=14534"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5264"},{"referenceType":"HasProperty","target":"ns=1;i=14535"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14536"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14534","parentNodeId":"ns=1;i=14533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14533"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14535","parentNodeId":"ns=1;i=14533","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14533"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14536","parentNodeId":"ns=1;i=14533","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14533"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14537","parentNodeId":"ns=1;i=5264","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14538"},{"referenceType":"HasProperty","target":"ns=1;i=14539"},{"referenceType":"HasProperty","target":"ns=1;i=14540"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5264"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14538","parentNodeId":"ns=1;i=14537","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14537"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14539","parentNodeId":"ns=1;i=14537","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14537"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14540","parentNodeId":"ns=1;i=14537","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14537"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14541","parentNodeId":"ns=1;i=5264","references":[{"referenceType":"HasProperty","target":"ns=1;i=14542"},{"referenceType":"HasProperty","target":"ns=1;i=14543"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5264"},{"referenceType":"HasProperty","target":"ns=1;i=14544"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14542","parentNodeId":"ns=1;i=14541","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14541"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14543","parentNodeId":"ns=1;i=14541","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14541"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14544","parentNodeId":"ns=1;i=14541","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14541"}],"typeDefinition":"i=68"},{"browseName":"1:StandBy","description":[{"value":"This element serves a feedback about the process standby of the pump. In the stand by state the pump is ready for operation."}],"displayName":[{"value":"StandBy"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5265","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14545"},{"referenceType":"HasComponent","target":"ns=1;i=14549"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14553"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14545","parentNodeId":"ns=1;i=5265","references":[{"referenceType":"HasProperty","target":"ns=1;i=14546"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5265"},{"referenceType":"HasProperty","target":"ns=1;i=14547"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14548"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14546","parentNodeId":"ns=1;i=14545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14545"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14547","parentNodeId":"ns=1;i=14545","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14545"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14548","parentNodeId":"ns=1;i=14545","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14545"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14549","parentNodeId":"ns=1;i=5265","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14550"},{"referenceType":"HasProperty","target":"ns=1;i=14551"},{"referenceType":"HasProperty","target":"ns=1;i=14552"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5265"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14550","parentNodeId":"ns=1;i=14549","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14549"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14551","parentNodeId":"ns=1;i=14549","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14549"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14552","parentNodeId":"ns=1;i=14549","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14549"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14553","parentNodeId":"ns=1;i=5265","references":[{"referenceType":"HasProperty","target":"ns=1;i=14554"},{"referenceType":"HasProperty","target":"ns=1;i=14555"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5265"},{"referenceType":"HasProperty","target":"ns=1;i=14556"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14554","parentNodeId":"ns=1;i=14553","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14553"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14555","parentNodeId":"ns=1;i=14553","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14553"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14556","parentNodeId":"ns=1;i=14553","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14553"}],"typeDefinition":"i=68"},{"browseName":"1:StandBySpeed","description":[{"value":"This element serves a feedback that the pump rotation is at standby speed."}],"displayName":[{"value":"StandBySpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5266","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14557"},{"referenceType":"HasComponent","target":"ns=1;i=14561"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"},{"referenceType":"HasComponent","target":"ns=1;i=14565"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14557","parentNodeId":"ns=1;i=5266","references":[{"referenceType":"HasProperty","target":"ns=1;i=14558"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5266"},{"referenceType":"HasProperty","target":"ns=1;i=14559"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14560"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14558","parentNodeId":"ns=1;i=14557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14557"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14559","parentNodeId":"ns=1;i=14557","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14557"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14560","parentNodeId":"ns=1;i=14557","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14557"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14561","parentNodeId":"ns=1;i=5266","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14562"},{"referenceType":"HasProperty","target":"ns=1;i=14563"},{"referenceType":"HasProperty","target":"ns=1;i=14564"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5266"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14562","parentNodeId":"ns=1;i=14561","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14561"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14563","parentNodeId":"ns=1;i=14561","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14561"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14564","parentNodeId":"ns=1;i=14561","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14561"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14565","parentNodeId":"ns=1;i=5266","references":[{"referenceType":"HasProperty","target":"ns=1;i=14566"},{"referenceType":"HasProperty","target":"ns=1;i=14567"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5266"},{"referenceType":"HasProperty","target":"ns=1;i=14568"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14566","parentNodeId":"ns=1;i=14565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14565"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14567","parentNodeId":"ns=1;i=14565","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14565"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14568","parentNodeId":"ns=1;i=14565","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14565"}],"typeDefinition":"i=68"},{"browseName":"1:TargetSpeed","description":[{"value":"This element serves a feedback that the pump is at target speed."}],"displayName":[{"value":"TargetSpeed"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5267","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14569"},{"referenceType":"HasComponent","target":"ns=1;i=14573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14577"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14569","parentNodeId":"ns=1;i=5267","references":[{"referenceType":"HasProperty","target":"ns=1;i=14570"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5267"},{"referenceType":"HasProperty","target":"ns=1;i=14571"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14572"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14570","parentNodeId":"ns=1;i=14569","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14569"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14571","parentNodeId":"ns=1;i=14569","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14569"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14572","parentNodeId":"ns=1;i=14569","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14569"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14573","parentNodeId":"ns=1;i=5267","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14574"},{"referenceType":"HasProperty","target":"ns=1;i=14575"},{"referenceType":"HasProperty","target":"ns=1;i=14576"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5267"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14574","parentNodeId":"ns=1;i=14573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14575","parentNodeId":"ns=1;i=14573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14576","parentNodeId":"ns=1;i=14573","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14573"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14577","parentNodeId":"ns=1;i=5267","references":[{"referenceType":"HasProperty","target":"ns=1;i=14578"},{"referenceType":"HasProperty","target":"ns=1;i=14579"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5267"},{"referenceType":"HasProperty","target":"ns=1;i=14580"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14578","parentNodeId":"ns=1;i=14577","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14577"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14579","parentNodeId":"ns=1;i=14577","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14577"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14580","parentNodeId":"ns=1;i=14577","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14577"}],"typeDefinition":"i=68"},{"browseName":"1:VentValveOpen","description":[{"value":"This element serves a feedback about the open state of the vent valve."}],"displayName":[{"value":"VentValveOpen"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5268","parentNodeId":"ns=1;i=5235","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1030"},{"referenceType":"HasComponent","target":"ns=1;i=14581"},{"referenceType":"HasComponent","target":"ns=1;i=14585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14589"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5235"}],"typeDefinition":"ns=1;i=1030"},{"browseName":"1:DiscreteInputValue","dataType":"Boolean","description":[{"value":"This property contains the actual value of the discrete input unit."}],"displayName":[{"value":"DiscreteInputValue"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14581","parentNodeId":"ns=1;i=5268","references":[{"referenceType":"HasProperty","target":"ns=1;i=14582"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5268"},{"referenceType":"HasProperty","target":"ns=1;i=14583"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasProperty","target":"ns=1;i=14584"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14582","parentNodeId":"ns=1;i=14581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14581"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14583","parentNodeId":"ns=1;i=14581","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14581"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14584","parentNodeId":"ns=1;i=14581","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14581"}],"typeDefinition":"i=68"},{"browseName":"1:OnOffCycle","dataType":"UInt32","description":[{"value":"This property contains the total number of transitions of the value from the Off to the On state."}],"displayName":[{"value":"OnOffCycle"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14585","parentNodeId":"ns=1;i=5268","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14586"},{"referenceType":"HasProperty","target":"ns=1;i=14587"},{"referenceType":"HasProperty","target":"ns=1;i=14588"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5268"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14586","parentNodeId":"ns=1;i=14585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14587","parentNodeId":"ns=1;i=14585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14588","parentNodeId":"ns=1;i=14585","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14585"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element."}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14589","parentNodeId":"ns=1;i=5268","references":[{"referenceType":"HasProperty","target":"ns=1;i=14590"},{"referenceType":"HasProperty","target":"ns=1;i=14591"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5268"},{"referenceType":"HasProperty","target":"ns=1;i=14592"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14590","parentNodeId":"ns=1;i=14589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14589"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14591","parentNodeId":"ns=1;i=14589","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14589"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14592","parentNodeId":"ns=1;i=14589","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14589"}],"typeDefinition":"i=68"},{"browseName":"1:ThrottleValveActuation","description":[{"value":"Actuation parameters for a throttle valve of a pump."}],"displayName":[{"value":"ThrottleValveActuation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5236","parentNodeId":"ns=1;i=5122","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1025"},{"referenceType":"HasComponent","target":"ns=1;i=14313"},{"referenceType":"HasComponent","target":"ns=1;i=14317"},{"referenceType":"HasComponent","target":"ns=1;i=14321"},{"referenceType":"HasComponent","target":"ns=1;i=14325"},{"referenceType":"HasComponent","target":"ns=1;i=14329"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=14333"},{"referenceType":"HasComponent","target":"ns=1;i=14337"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5122"}],"typeDefinition":"ns=1;i=1025"},{"accessLevel":3,"browseName":"1:FaultAction","dataType":"Boolean","description":[{"value":"This property determines the action taken on variables in fault state. If the value is TRUE, the value of the property Fault value is used, if it is FALSE, the last valid value is used"}],"displayName":[{"value":"FaultAction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14313","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasProperty","target":"ns=1;i=14314"},{"referenceType":"HasProperty","target":"ns=1;i=14315"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14316"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14314","parentNodeId":"ns=1;i=14313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14313"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14315","parentNodeId":"ns=1;i=14313","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14313"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14316","parentNodeId":"ns=1;i=14313","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14313"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:FaultValue","dataType":"Double","description":[{"value":"This property specifies a user-defined value for use with Fault action property"}],"displayName":[{"value":"FaultValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14317","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14318"},{"referenceType":"HasProperty","target":"ns=1;i=14319"},{"referenceType":"HasProperty","target":"ns=1;i=14320"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14318","parentNodeId":"ns=1;i=14317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14317"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14319","parentNodeId":"ns=1;i=14317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14317"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14320","parentNodeId":"ns=1;i=14317","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14317"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:FeedbackVariable","dataType":"Double","description":[{"value":"Variable quantity, which represents the controlled variable and is returned to the comparing element"}],"displayName":[{"value":"FeedbackVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14321","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=14322"},{"referenceType":"HasProperty","target":"ns=1;i=14323"},{"referenceType":"HasProperty","target":"ns=1;i=14324"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14322","parentNodeId":"ns=1;i=14321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14321"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14323","parentNodeId":"ns=1;i=14321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14321"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14324","parentNodeId":"ns=1;i=14321","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14321"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:ManipulatedValue","dataType":"Double","description":[{"value":"Output variable of the controlling system, which is also an input variable of the controlled system"}],"displayName":[{"value":"ManipulatedValue"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14325","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=14326"},{"referenceType":"HasProperty","target":"ns=1;i=14327"},{"referenceType":"HasProperty","target":"ns=1;i=14328"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14326","parentNodeId":"ns=1;i=14325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14327","parentNodeId":"ns=1;i=14325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14328","parentNodeId":"ns=1;i=14325","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14325"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:OnOff","dataType":"Boolean","description":[{"value":"This property enables the operation."}],"displayName":[{"value":"OnOff"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14329","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasProperty","target":"ns=1;i=14330"},{"referenceType":"HasProperty","target":"ns=1;i=14331"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasProperty","target":"ns=1;i=14332"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14330","parentNodeId":"ns=1;i=14329","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14329"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14331","parentNodeId":"ns=1;i=14329","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14329"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14332","parentNodeId":"ns=1;i=14329","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14329"}],"typeDefinition":"i=68"},{"browseName":"1:ReferenceVariable","dataType":"Double","description":[{"value":"Input variable to a comparing element in a controlling system, which sets the desired value of the controlled variable and is deducted from the command variable"}],"displayName":[{"value":"ReferenceVariable"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14333","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasTypeDefinition","target":"i=17497"},{"referenceType":"HasProperty","target":"ns=1;i=14334"},{"referenceType":"HasProperty","target":"ns=1;i=14335"},{"referenceType":"HasProperty","target":"ns=1;i=14336"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"}],"typeDefinition":"i=17497"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14334","parentNodeId":"ns=1;i=14333","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14333"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14335","parentNodeId":"ns=1;i=14333","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14333"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14336","parentNodeId":"ns=1;i=14333","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14333"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Status","dataType":"Boolean","description":[{"value":"This property contains the actual status of the element"}],"displayName":[{"value":"Status"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14337","parentNodeId":"ns=1;i=5236","references":[{"referenceType":"HasProperty","target":"ns=1;i=14338"},{"referenceType":"HasProperty","target":"ns=1;i=14339"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5236"},{"referenceType":"HasProperty","target":"ns=1;i=14340"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14338","parentNodeId":"ns=1;i=14337","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14337"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"FalseState","dataType":"LocalizedText","displayName":[{"value":"FalseState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14339","parentNodeId":"ns=1;i=14337","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14337"},{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"TrueState","dataType":"LocalizedText","displayName":[{"value":"TrueState"}],"modellingRule":"Mandatory","nodeClass":"Variable","nodeId":"ns=1;i=14340","parentNodeId":"ns=1;i=14337","references":[{"referenceType":"HasModellingRule","target":"i=78"},{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=14337"}],"typeDefinition":"i=68"},{"browseName":"1:Ports","description":[{"value":"Connection points of the pump."}],"displayName":[{"value":"Ports"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5123","parentNodeId":"ns=1;i=1052","references":[{"referenceType":"HasComponent","target":"ns=1;i=5168"},{"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=1052"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1034"}],"typeDefinition":"ns=1;i=1034"},{"browseName":"1:\u003CDrive\u003E","description":[{"value":"Port for the connection of the drive."}],"displayName":[{"value":"\u003CDrive\u003E"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5168","parentNodeId":"ns=1;i=5123","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5123"},{"referenceType":"HasComponent","target":"ns=1;i=10959"},{"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasComponent","target":"ns=1;i=10960"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1038"},{"referenceType":"HasComponent","target":"ns=1;i=10961"},{"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasModellingRule","target":"i=80"}],"symbolicName":"Drive","typeDefinition":"ns=1;i=1038"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10959","parentNodeId":"ns=1;i=5168","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5168"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11947"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11947","parentNodeId":"ns=1;i=10959","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10959"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the drive."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5171","parentNodeId":"ns=1;i=5168","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5168"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1043"},{"referenceType":"HasComponent","target":"ns=1;i=11837"},{"referenceType":"HasComponent","target":"ns=1;i=11839"},{"referenceType":"HasComponent","target":"ns=1;i=11843"},{"referenceType":"HasComponent","target":"ns=1;i=11847"},{"referenceType":"HasComponent","target":"ns=1;i=11851"},{"referenceType":"HasComponent","target":"ns=1;i=11855"},{"referenceType":"HasComponent","target":"ns=1;i=11861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11865"},{"referenceType":"HasComponent","target":"ns=1;i=11835"},{"referenceType":"HasComponent","target":"ns=1;i=11869"},{"referenceType":"HasComponent","target":"ns=1;i=11873"},{"referenceType":"HasComponent","target":"ns=1;i=11877"}],"typeDefinition":"ns=1;i=1043"},{"browseName":"1:EnergyEfficiencyClassOfMotor","dataType":"String","description":[{"value":"Characterization of the energy efficiency of electric motors according to international standards."}],"displayName":[{"value":"EnergyEfficiencyClassOfMotor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11837","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11838"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11838","parentNodeId":"ns=1;i=11837","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11837"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaxNominalFrequency","dataType":"Double","description":[{"value":"A suitable, maximum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MaxNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11839","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11840"},{"referenceType":"HasProperty","target":"ns=1;i=11841"},{"referenceType":"HasProperty","target":"ns=1;i=11842"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11840","parentNodeId":"ns=1;i=11839","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11839"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11841","parentNodeId":"ns=1;i=11839","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11839"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11842","parentNodeId":"ns=1;i=11839","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11839"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinNominalFrequency","dataType":"Double","description":[{"value":"A suitable minimum (usually rounded) value of a frequency to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"MinNominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11843","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11844"},{"referenceType":"HasProperty","target":"ns=1;i=11845"},{"referenceType":"HasProperty","target":"ns=1;i=11846"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11844","parentNodeId":"ns=1;i=11843","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11843"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11845","parentNodeId":"ns=1;i=11843","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11843"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11846","parentNodeId":"ns=1;i=11843","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11843"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Proportion of the motor power input P_mot delivered as pump power input P_mot, u."}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11847","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11848"},{"referenceType":"HasProperty","target":"ns=1;i=11849"},{"referenceType":"HasProperty","target":"ns=1;i=11850"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11848","parentNodeId":"ns=1;i=11847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11849","parentNodeId":"ns=1;i=11847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11850","parentNodeId":"ns=1;i=11847","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11847"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalFrequency","dataType":"Double","description":[{"value":"Design of the object at a certain frequency, which is repeated regularly."}],"displayName":[{"value":"NominalFrequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11851","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11852"},{"referenceType":"HasProperty","target":"ns=1;i=11853"},{"referenceType":"HasProperty","target":"ns=1;i=11854"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11852","parentNodeId":"ns=1;i=11851","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11851"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11853","parentNodeId":"ns=1;i=11851","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11851"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11854","parentNodeId":"ns=1;i=11851","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11851"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPowerConsumption","dataType":"Double","description":[{"value":"Indication of the rated power consumption in watts."}],"displayName":[{"value":"NominalPowerConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11855","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11856"},{"referenceType":"HasProperty","target":"ns=1;i=11857"},{"referenceType":"HasProperty","target":"ns=1;i=11858"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11856","parentNodeId":"ns=1;i=11855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11857","parentNodeId":"ns=1;i=11855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11858","parentNodeId":"ns=1;i=11855","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11855"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalVoltage","dataType":"Double","description":[{"value":"Rated voltage is the value of the electrical voltage in normal operation specified by the manufacturer or supplier."}],"displayName":[{"value":"NominalVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11861","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11862"},{"referenceType":"HasProperty","target":"ns=1;i=11863"},{"referenceType":"HasProperty","target":"ns=1;i=11864"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11862","parentNodeId":"ns=1;i=11861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11863","parentNodeId":"ns=1;i=11861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11864","parentNodeId":"ns=1;i=11861","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11861"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Ratio of the amount of active power to apparent power."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11865","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11866"},{"referenceType":"HasProperty","target":"ns=1;i=11867"},{"referenceType":"HasProperty","target":"ns=1;i=11868"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11866","parentNodeId":"ns=1;i=11865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11865"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11867","parentNodeId":"ns=1;i=11865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11865"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11868","parentNodeId":"ns=1;i=11865","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11865"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ProtectionClass","dataType":"String","description":[{"value":"Protection class of an enclosure, expressed as NEMA or IP rating."}],"displayName":[{"value":"ProtectionClass"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11835","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11836"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11836","parentNodeId":"ns=1;i=11835","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11835"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedCurrent","dataType":"Double","description":[{"value":"Appropriate (usually rounded) value of a current to describe, designate or identify a component, device, resource, facility or equipment."}],"displayName":[{"value":"RatedCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11869","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11870"},{"referenceType":"HasProperty","target":"ns=1;i=11871"},{"referenceType":"HasProperty","target":"ns=1;i=11872"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11870","parentNodeId":"ns=1;i=11869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11871","parentNodeId":"ns=1;i=11869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11872","parentNodeId":"ns=1;i=11869","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11869"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:RatedSpeed","dataType":"Double","description":[{"value":"Speed corresponding to the rated data of the motor used."}],"displayName":[{"value":"RatedSpeed"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11873","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11874"},{"referenceType":"HasProperty","target":"ns=1;i=11875"},{"referenceType":"HasProperty","target":"ns=1;i=11876"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11874","parentNodeId":"ns=1;i=11873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11875","parentNodeId":"ns=1;i=11873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4405559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Es\u207B\u00B9\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ereciprocal second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11876","parentNodeId":"ns=1;i=11873","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11873"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:TorqueAtNominalSpeedOfDrive","dataType":"Double","description":[{"value":"The torque transmittable by the equipment."}],"displayName":[{"value":"TorqueAtNominalSpeedOfDrive"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11877","parentNodeId":"ns=1;i=5171","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11878"},{"referenceType":"HasProperty","target":"ns=1;i=11879"},{"referenceType":"HasProperty","target":"ns=1;i=11880"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5171"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11878","parentNodeId":"ns=1;i=11877","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11879","parentNodeId":"ns=1;i=11877","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5129559\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11880","parentNodeId":"ns=1;i=11877","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11877"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10960","parentNodeId":"ns=1;i=5168","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11946"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5168"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11946","parentNodeId":"ns=1;i=10960","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10960"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10961","parentNodeId":"ns=1;i=5168","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11948"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5168"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11948","parentNodeId":"ns=1;i=10961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All operation measurements that describe the drive."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5177","parentNodeId":"ns=1;i=5168","references":[{"referenceType":"HasComponent","target":"ns=1;i=11881"},{"referenceType":"HasComponent","target":"ns=1;i=11886"},{"referenceType":"HasComponent","target":"ns=1;i=11891"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1051"},{"referenceType":"HasComponent","target":"ns=1;i=11896"},{"referenceType":"HasComponent","target":"ns=1;i=11901"},{"referenceType":"HasComponent","target":"ns=1;i=11906"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5168"},{"referenceType":"HasComponent","target":"ns=1;i=11911"},{"referenceType":"HasComponent","target":"ns=1;i=11916"},{"referenceType":"HasComponent","target":"ns=1;i=11921"},{"referenceType":"HasComponent","target":"ns=1;i=11926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11931"},{"referenceType":"HasComponent","target":"ns=1;i=11936"},{"referenceType":"HasComponent","target":"ns=1;i=11941"}],"typeDefinition":"ns=1;i=1051"},{"browseName":"1:Current","dataType":"Double","description":[{"value":"Measured consumed mains current of the whole unit of the motor."}],"displayName":[{"value":"Current"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11881","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasProperty","target":"ns=1;i=11882"},{"referenceType":"HasProperty","target":"ns=1;i=11883"},{"referenceType":"HasProperty","target":"ns=1;i=11884"},{"referenceType":"HasProperty","target":"ns=1;i=14883"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11882","parentNodeId":"ns=1;i=11881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11883","parentNodeId":"ns=1;i=11881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11884","parentNodeId":"ns=1;i=11881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14883","parentNodeId":"ns=1;i=11881","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11881"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkCurrent","dataType":"Double","description":[{"value":"Measured actual electrical dc current of the converter."}],"displayName":[{"value":"DCLinkCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11886","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasProperty","target":"ns=1;i=11887"},{"referenceType":"HasProperty","target":"ns=1;i=11888"},{"referenceType":"HasProperty","target":"ns=1;i=11889"},{"referenceType":"HasProperty","target":"ns=1;i=14887"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11887","parentNodeId":"ns=1;i=11886","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11886"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11888","parentNodeId":"ns=1;i=11886","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11886"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11889","parentNodeId":"ns=1;i=11886","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11886"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14887","parentNodeId":"ns=1;i=11886","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11886"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:DCLinkVoltage","dataType":"Double","description":[{"value":"Measured actual electrical dc voltage of the converter."}],"displayName":[{"value":"DCLinkVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11891","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasProperty","target":"ns=1;i=11892"},{"referenceType":"HasProperty","target":"ns=1;i=11893"},{"referenceType":"HasProperty","target":"ns=1;i=11894"},{"referenceType":"HasProperty","target":"ns=1;i=14891"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11892","parentNodeId":"ns=1;i=11891","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11891"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11893","parentNodeId":"ns=1;i=11891","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11891"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11894","parentNodeId":"ns=1;i=11891","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11891"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14891","parentNodeId":"ns=1;i=11891","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11891"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:DriverPowerInput","dataType":"Double","description":[{"value":"Measured power absorbed by the motor."}],"displayName":[{"value":"DriverPowerInput"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11896","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11897"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasProperty","target":"ns=1;i=11898"},{"referenceType":"HasProperty","target":"ns=1;i=11899"},{"referenceType":"HasProperty","target":"ns=1;i=14895"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11897","parentNodeId":"ns=1;i=11896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11898","parentNodeId":"ns=1;i=11896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EW\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ewatt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11899","parentNodeId":"ns=1;i=11896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Derivative with respect to time t of energy E being transferred or transformed"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14895","parentNodeId":"ns=1;i=11896","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11896"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Epower\u003C/uax:String\u003E"},{"browseName":"1:EnergyConsumption","dataType":"Double","description":[{"value":"Measured energy consumption of the unit of the motor."}],"displayName":[{"value":"EnergyConsumption"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11901","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11902"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasProperty","target":"ns=1;i=11903"},{"referenceType":"HasProperty","target":"ns=1;i=11904"},{"referenceType":"HasProperty","target":"ns=1;i=14899"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11902","parentNodeId":"ns=1;i=11901","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11901"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11903","parentNodeId":"ns=1;i=11901","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11901"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4869973\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EJ\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ejoule\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11904","parentNodeId":"ns=1;i=11901","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11901"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Ability of a system to do work"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14899","parentNodeId":"ns=1;i=11901","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11901"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eenergy\u003C/uax:String\u003E"},{"browseName":"1:Frequency","dataType":"Double","description":[{"value":"Measured output frequency of the frequency converter."}],"displayName":[{"value":"Frequency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11906","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11907"},{"referenceType":"HasProperty","target":"ns=1;i=11908"},{"referenceType":"HasProperty","target":"ns=1;i=11909"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasProperty","target":"ns=1;i=14903"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11907","parentNodeId":"ns=1;i=11906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11908","parentNodeId":"ns=1;i=11906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4740186\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EHz\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ehertz\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11909","parentNodeId":"ns=1;i=11906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Inverse of one cycle of a periodic event"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14903","parentNodeId":"ns=1;i=11906","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11906"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efrequency\u003C/uax:String\u003E"},{"browseName":"1:MotorCurrent","dataType":"Double","description":[{"value":"Measured actual motor current."}],"displayName":[{"value":"MotorCurrent"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11911","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11912"},{"referenceType":"HasProperty","target":"ns=1;i=11913"},{"referenceType":"HasProperty","target":"ns=1;i=11914"},{"referenceType":"HasProperty","target":"ns=1;i=14907"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11912","parentNodeId":"ns=1;i=11911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11913","parentNodeId":"ns=1;i=11911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4279632\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EA\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Eampere\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11914","parentNodeId":"ns=1;i=11911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the flux of the electric current density J through a given directed surface S"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14907","parentNodeId":"ns=1;i=11911","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11911"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eelectric current\u003C/uax:String\u003E"},{"browseName":"1:MotorEfficiency","dataType":"Double","description":[{"value":"Determined proportion of the motor power input P_mot delivered as pump power input P_mot, u"}],"displayName":[{"value":"MotorEfficiency"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11916","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11917"},{"referenceType":"HasProperty","target":"ns=1;i=11918"},{"referenceType":"HasProperty","target":"ns=1;i=11919"},{"referenceType":"HasProperty","target":"ns=1;i=14911"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11917","parentNodeId":"ns=1;i=11916","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11916"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11918","parentNodeId":"ns=1;i=11916","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11916"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003E%\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epercent\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11919","parentNodeId":"ns=1;i=11916","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11916"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quotient of two numbers or two quantities of the same kind"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14911","parentNodeId":"ns=1;i=11916","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11916"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eratio\u003C/uax:String\u003E"},{"browseName":"1:MotorTemperature","dataType":"Double","description":[{"value":"Measured temperature of the motor."}],"displayName":[{"value":"MotorTemperature"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11921","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11922"},{"referenceType":"HasProperty","target":"ns=1;i=11923"},{"referenceType":"HasProperty","target":"ns=1;i=11924"},{"referenceType":"HasProperty","target":"ns=1;i=14915"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11922","parentNodeId":"ns=1;i=11921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11923","parentNodeId":"ns=1;i=11921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11924","parentNodeId":"ns=1;i=11921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14915","parentNodeId":"ns=1;i=11921","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11921"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MotorVoltage","dataType":"Double","description":[{"value":"Measured actual motor voltage."}],"displayName":[{"value":"MotorVoltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11926","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11927"},{"referenceType":"HasProperty","target":"ns=1;i=11928"},{"referenceType":"HasProperty","target":"ns=1;i=11929"},{"referenceType":"HasProperty","target":"ns=1;i=14919"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11927","parentNodeId":"ns=1;i=11926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11928","parentNodeId":"ns=1;i=11926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11929","parentNodeId":"ns=1;i=11926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14919","parentNodeId":"ns=1;i=11926","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11926"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:PowerFactor","dataType":"Double","description":[{"value":"Determined power factor of the motor."}],"displayName":[{"value":"PowerFactor"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11931","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11932"},{"referenceType":"HasProperty","target":"ns=1;i=11933"},{"referenceType":"HasProperty","target":"ns=1;i=11934"},{"referenceType":"HasProperty","target":"ns=1;i=14925"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11932","parentNodeId":"ns=1;i=11931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11933","parentNodeId":"ns=1;i=11931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11934","parentNodeId":"ns=1;i=11931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Element of a set of mathematical entities that includes all integers and other entities, each defined as the quotient of two integers, such that the division is defined for any two entities, except zero as a divisor"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14925","parentNodeId":"ns=1;i=11931","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11931"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Erational number\u003C/uax:String\u003E"},{"browseName":"1:Torque","dataType":"Double","description":[{"value":"Measured torque of the motor."}],"displayName":[{"value":"Torque"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11936","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11937"},{"referenceType":"HasProperty","target":"ns=1;i=11938"},{"referenceType":"HasProperty","target":"ns=1;i=11939"},{"referenceType":"HasProperty","target":"ns=1;i=14933"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11937","parentNodeId":"ns=1;i=11936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11938","parentNodeId":"ns=1;i=11936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20053\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EN\u00B7m\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Enewton metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11939","parentNodeId":"ns=1;i=11936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity described by the vector product M=r * F where r is position vector with respect to the axis of rotation and F is force"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14933","parentNodeId":"ns=1;i=11936","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11936"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Emoment of force\u003C/uax:String\u003E"},{"browseName":"1:Voltage","dataType":"Double","description":[{"value":"Measured actual mains voltage of the motor."}],"displayName":[{"value":"Voltage"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11941","parentNodeId":"ns=1;i=5177","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11942"},{"referenceType":"HasProperty","target":"ns=1;i=11943"},{"referenceType":"HasProperty","target":"ns=1;i=11944"},{"referenceType":"HasProperty","target":"ns=1;i=14941"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5177"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11942","parentNodeId":"ns=1;i=11941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11943","parentNodeId":"ns=1;i=11941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5655636\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EV\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Evolt\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11944","parentNodeId":"ns=1;i=11941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Scalar quantity equal to the line integral of the electric field strength E along a specific path linking two points a and b"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14941","parentNodeId":"ns=1;i=11941","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11941"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evoltage\u003C/uax:String\u003E"},{"browseName":"1:\u003CInletConnection\u003E","description":[{"value":"Port for the inlet connection."}],"displayName":[{"value":"\u003CInletConnection\u003E"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5169","parentNodeId":"ns=1;i=5123","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5123"},{"referenceType":"HasComponent","target":"ns=1;i=10962"},{"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasComponent","target":"ns=1;i=10963"},{"referenceType":"HasComponent","target":"ns=1;i=10964"},{"referenceType":"HasComponent","target":"ns=1;i=5179"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1036"},{"referenceType":"HasComponent","target":"ns=1;i=5180"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=5185"}],"symbolicName":"InletConnection","typeDefinition":"ns=1;i=1036"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10962","parentNodeId":"ns=1;i=5169","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12016"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12016","parentNodeId":"ns=1;i=10962","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10962"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the inlet connection."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5178","parentNodeId":"ns=1;i=5169","references":[{"referenceType":"HasComponent","target":"ns=1;i=11949"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasComponent","target":"ns=1;i=11953"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1041"},{"referenceType":"HasComponent","target":"ns=1;i=11957"},{"referenceType":"HasComponent","target":"ns=1;i=11961"},{"referenceType":"HasComponent","target":"ns=1;i=11965"},{"referenceType":"HasComponent","target":"ns=1;i=11969"},{"referenceType":"HasComponent","target":"ns=1;i=11973"},{"referenceType":"HasComponent","target":"ns=1;i=11977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11979"}],"typeDefinition":"ns=1;i=1041"},{"browseName":"1:CriticalBackingPressure","dataType":"Double","description":[{"value":"Maximum backing pressure for which the conditions are defined in the instruction manual or in a specific standard for the particular vacuum pump."}],"displayName":[{"value":"CriticalBackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11949","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasProperty","target":"ns=1;i=11950"},{"referenceType":"HasProperty","target":"ns=1;i=11951"},{"referenceType":"HasProperty","target":"ns=1;i=11952"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11950","parentNodeId":"ns=1;i=11949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11951","parentNodeId":"ns=1;i=11949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11952","parentNodeId":"ns=1;i=11949","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11949"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:InletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the entry opening in the inlet connection of the pump."}],"displayName":[{"value":"InletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11953","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11954"},{"referenceType":"HasProperty","target":"ns=1;i=11955"},{"referenceType":"HasProperty","target":"ns=1;i=11956"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11954","parentNodeId":"ns=1;i=11953","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11953"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11955","parentNodeId":"ns=1;i=11953","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11953"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11956","parentNodeId":"ns=1;i=11953","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11953"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumAllowableInletPressure","dataType":"Double","description":[{"value":"Highest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11957","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11958"},{"referenceType":"HasProperty","target":"ns=1;i=11959"},{"referenceType":"HasProperty","target":"ns=1;i=11960"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11958","parentNodeId":"ns=1;i=11957","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11957"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11959","parentNodeId":"ns=1;i=11957","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11957"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11960","parentNodeId":"ns=1;i=11957","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11957"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumTolerableWaterVaporInletPressure","dataType":"Double","description":[{"value":"The highest water vapor inlet pressure at which a gas ballast pump, under normal ambient conditions, can pump and exhaust pure water vapor in continuous Operation."}],"displayName":[{"value":"MaximumTolerableWaterVaporInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11961","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11962"},{"referenceType":"HasProperty","target":"ns=1;i=11963"},{"referenceType":"HasProperty","target":"ns=1;i=11964"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11962","parentNodeId":"ns=1;i=11961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11963","parentNodeId":"ns=1;i=11961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11964","parentNodeId":"ns=1;i=11961","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11961"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MaximumWorkingPressure","dataType":"Double","description":[{"value":"instantaneous inlet pressure with adequate margin above the minimum liquid vapor pressure expected."}],"displayName":[{"value":"MaximumWorkingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11965","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11966"},{"referenceType":"HasProperty","target":"ns=1;i=11967"},{"referenceType":"HasProperty","target":"ns=1;i=11968"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11966","parentNodeId":"ns=1;i=11965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11967","parentNodeId":"ns=1;i=11965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11968","parentNodeId":"ns=1;i=11965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableInletPressure","dataType":"Double","description":[{"value":"Lowest value of inlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11969","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11970"},{"referenceType":"HasProperty","target":"ns=1;i=11971"},{"referenceType":"HasProperty","target":"ns=1;i=11972"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11970","parentNodeId":"ns=1;i=11969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11971","parentNodeId":"ns=1;i=11969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11972","parentNodeId":"ns=1;i=11969","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11969"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NetPositiveInletPressureRequired","dataType":"Double","description":[{"value":"Total inlet pressure required to ensure there is enough margin to maintain the minimum."}],"displayName":[{"value":"NetPositiveInletPressureRequired"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11973","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11974"},{"referenceType":"HasProperty","target":"ns=1;i=11975"},{"referenceType":"HasProperty","target":"ns=1;i=11976"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11974","parentNodeId":"ns=1;i=11973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11975","parentNodeId":"ns=1;i=11973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11976","parentNodeId":"ns=1;i=11973","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11973"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11977","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11978"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11978","parentNodeId":"ns=1;i=11977","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11977"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:WaterVaporCapacity","dataType":"Double","description":[{"value":"Mass of water which can be conveyed by the pump without condensation per time."}],"displayName":[{"value":"WaterVaporCapacity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11979","parentNodeId":"ns=1;i=5178","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11980"},{"referenceType":"HasProperty","target":"ns=1;i=11981"},{"referenceType":"HasProperty","target":"ns=1;i=11982"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5178"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11980","parentNodeId":"ns=1;i=11979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11981","parentNodeId":"ns=1;i=11979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4600375\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Eg/h\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Egram per hour\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11982","parentNodeId":"ns=1;i=11979","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11979"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10963","parentNodeId":"ns=1;i=5169","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12015"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12015","parentNodeId":"ns=1;i=10963","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10963"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10964","parentNodeId":"ns=1;i=5169","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12017"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12017","parentNodeId":"ns=1;i=10964","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10964"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Implementation","description":[{"value":"Properties that describe the specific installation and operational situation of the inlet connection."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5179","parentNodeId":"ns=1;i=5169","references":[{"referenceType":"HasComponent","target":"ns=1;i=11983"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1047"},{"referenceType":"HasComponent","target":"ns=1;i=11987"},{"referenceType":"HasComponent","target":"ns=1;i=11991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=11993"},{"referenceType":"HasComponent","target":"ns=1;i=11997"}],"typeDefinition":"ns=1;i=1047"},{"accessLevel":3,"browseName":"1:HeightOfTheInletConnection","dataType":"Double","description":[{"value":"Height of the center of the inlet connection of the pump"}],"displayName":[{"value":"HeightOfTheInletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11983","parentNodeId":"ns=1;i=5179","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11984"},{"referenceType":"HasProperty","target":"ns=1;i=11985"},{"referenceType":"HasProperty","target":"ns=1;i=11986"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5179"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11984","parentNodeId":"ns=1;i=11983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11985","parentNodeId":"ns=1;i=11983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11986","parentNodeId":"ns=1;i=11983","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11983"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtInlet","dataType":"Double","description":[{"value":"Rated flow at pump inlet connection divided by the inlet area of the pump"}],"displayName":[{"value":"MeanRatedVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11987","parentNodeId":"ns=1;i=5179","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11988"},{"referenceType":"HasProperty","target":"ns=1;i=11989"},{"referenceType":"HasProperty","target":"ns=1;i=11990"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5179"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11988","parentNodeId":"ns=1;i=11987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11989","parentNodeId":"ns=1;i=11987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11990","parentNodeId":"ns=1;i=11987","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11987"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11991","parentNodeId":"ns=1;i=5179","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=11992"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5179"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11992","parentNodeId":"ns=1;i=11991","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11991"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedInletPressure","dataType":"Double","description":[{"value":"Inlet pressure of the operating conditions at the guarantee point"}],"displayName":[{"value":"RatedInletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11993","parentNodeId":"ns=1;i=5179","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11994"},{"referenceType":"HasProperty","target":"ns=1;i=11995"},{"referenceType":"HasProperty","target":"ns=1;i=11996"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5179"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11994","parentNodeId":"ns=1;i=11993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11995","parentNodeId":"ns=1;i=11993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11996","parentNodeId":"ns=1;i=11993","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11993"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtInletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at inlet area of the pump, corresponding to the sum of the height, pressure head and velocity head"}],"displayName":[{"value":"TotalHeadAtInletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11997","parentNodeId":"ns=1;i=5179","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=11998"},{"referenceType":"HasProperty","target":"ns=1;i=11999"},{"referenceType":"HasProperty","target":"ns=1;i=12000"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5179"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11998","parentNodeId":"ns=1;i=11997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=11999","parentNodeId":"ns=1;i=11997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12000","parentNodeId":"ns=1;i=11997","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=11997"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All measurements of the operation which describe the inlet connection."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5180","parentNodeId":"ns=1;i=5169","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1050"},{"referenceType":"HasComponent","target":"ns=1;i=12001"},{"referenceType":"HasComponent","target":"ns=1;i=12006"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"ns=1;i=1050"},{"browseName":"1:InletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the inlet area of the pump."}],"displayName":[{"value":"InletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12001","parentNodeId":"ns=1;i=5180","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12002"},{"referenceType":"HasProperty","target":"ns=1;i=12003"},{"referenceType":"HasProperty","target":"ns=1;i=12004"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5180"},{"referenceType":"HasProperty","target":"ns=1;i=14949"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12002","parentNodeId":"ns=1;i=12001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12003","parentNodeId":"ns=1;i=12001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12004","parentNodeId":"ns=1;i=12001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14949","parentNodeId":"ns=1;i=12001","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12001"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:MeanVelocityAtInlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump inlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtInlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12006","parentNodeId":"ns=1;i=5180","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12007"},{"referenceType":"HasProperty","target":"ns=1;i=12008"},{"referenceType":"HasProperty","target":"ns=1;i=12009"},{"referenceType":"HasProperty","target":"ns=1;i=14957"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5180"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12007","parentNodeId":"ns=1;i=12006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12008","parentNodeId":"ns=1;i=12006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12009","parentNodeId":"ns=1;i=12006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14957","parentNodeId":"ns=1;i=12006","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12006"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:SystemRequirements","description":[{"value":"Buyer\u0027s properties that describe the installation situation of the inlet port."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5185","parentNodeId":"ns=1;i=5169","references":[{"referenceType":"HasTypeDefinition","target":"ns=1;i=1045"},{"referenceType":"HasComponent","target":"ns=1;i=12011"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5169"}],"typeDefinition":"ns=1;i=1045"},{"accessLevel":3,"browseName":"1:InletPressure","dataType":"Double","description":[{"value":"Pressure at the inlet of the pump, measured at a defined location in the test dome."}],"displayName":[{"value":"InletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12011","parentNodeId":"ns=1;i=5185","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12012"},{"referenceType":"HasProperty","target":"ns=1;i=12013"},{"referenceType":"HasProperty","target":"ns=1;i=12014"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5185"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12012","parentNodeId":"ns=1;i=12011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12013","parentNodeId":"ns=1;i=12011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12014","parentNodeId":"ns=1;i=12011","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12011"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:\u003COutletConnection\u003E","description":[{"value":"Port for the outlet connection."}],"displayName":[{"value":"\u003COutletConnection\u003E"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5170","parentNodeId":"ns=1;i=5123","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5123"},{"referenceType":"HasComponent","target":"ns=1;i=10965"},{"referenceType":"HasComponent","target":"ns=1;i=5186"},{"referenceType":"HasComponent","target":"ns=1;i=10966"},{"referenceType":"HasComponent","target":"ns=1;i=10967"},{"referenceType":"HasComponent","target":"ns=1;i=5187"},{"referenceType":"HasComponent","target":"ns=1;i=5188"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1037"},{"referenceType":"HasComponent","target":"ns=1;i=5190"}],"symbolicName":"OutletConnection","typeDefinition":"ns=1;i=1037"},{"accessLevel":3,"browseName":"1:Category","dataType":"String","description":[{"value":"The category property describes the Port type. The value of this attribute is user-defined. Only ports with the same category value are allowed to be connected."}],"displayName":[{"value":"Category"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10965","parentNodeId":"ns=1;i=5170","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12081"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12081","parentNodeId":"ns=1;i=10965","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10965"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Design","description":[{"value":"Manufacturer\u0027s properties that describe the rudimentary data of the outlet connection."}],"displayName":[{"value":"Design"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5186","parentNodeId":"ns=1;i=5170","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasComponent","target":"ns=1;i=12018"},{"referenceType":"HasComponent","target":"ns=1;i=12022"},{"referenceType":"HasComponent","target":"ns=1;i=12026"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasComponent","target":"ns=1;i=12028"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1042"},{"referenceType":"HasComponent","target":"ns=1;i=12032"},{"referenceType":"HasComponent","target":"ns=1;i=12036"},{"referenceType":"HasComponent","target":"ns=1;i=12040"},{"referenceType":"HasComponent","target":"ns=1;i=12044"}],"typeDefinition":"ns=1;i=1042"},{"browseName":"1:MaximumAllowableOutletPressure","dataType":"Double","description":[{"value":"Highest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MaximumAllowableOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12018","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12019"},{"referenceType":"HasProperty","target":"ns=1;i=12020"},{"referenceType":"HasProperty","target":"ns=1;i=12021"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12019","parentNodeId":"ns=1;i=12018","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12020","parentNodeId":"ns=1;i=12018","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12021","parentNodeId":"ns=1;i=12018","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12018"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:MinimumAllowableOutetPressure","dataType":"Double","description":[{"value":"Lowest value of outlet pressure at which the pump or component is capable of functioning on the basis of the materials used."}],"displayName":[{"value":"MinimumAllowableOutetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12022","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12023"},{"referenceType":"HasProperty","target":"ns=1;i=12024"},{"referenceType":"HasProperty","target":"ns=1;i=12025"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12023","parentNodeId":"ns=1;i=12022","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12022"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12024","parentNodeId":"ns=1;i=12022","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12022"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12025","parentNodeId":"ns=1;i=12022","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12022"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:NominalPressure","dataType":"String","description":[{"value":"Alphanumeric parameter for reference purposes, referring to a combination of mechanical and dimensional properties of a component of a piping system. It comprises the letters PN followed by a dimensionless number."}],"displayName":[{"value":"NominalPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12026","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12027"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12027","parentNodeId":"ns=1;i=12026","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12026"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:OutletAreaOfThePump","dataType":"Double","description":[{"value":"Free cross-sectional area of the orifice in the outlet connection of the pump."}],"displayName":[{"value":"OutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12028","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12029"},{"referenceType":"HasProperty","target":"ns=1;i=12030"},{"referenceType":"HasProperty","target":"ns=1;i=12031"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12029","parentNodeId":"ns=1;i=12028","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12028"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12030","parentNodeId":"ns=1;i=12028","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12028"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067851\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u00B2\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Esquare metre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12031","parentNodeId":"ns=1;i=12028","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12028"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveAccumulationPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will pass the total pump flow."}],"displayName":[{"value":"ReliefValveAccumulationPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12032","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12033"},{"referenceType":"HasProperty","target":"ns=1;i=12034"},{"referenceType":"HasProperty","target":"ns=1;i=12035"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12033","parentNodeId":"ns=1;i=12032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12034","parentNodeId":"ns=1;i=12032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12035","parentNodeId":"ns=1;i=12032","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12032"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveBackPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of the relief valve when the valve is closed."}],"displayName":[{"value":"ReliefValveBackPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12036","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12037"},{"referenceType":"HasProperty","target":"ns=1;i=12038"},{"referenceType":"HasProperty","target":"ns=1;i=12039"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12037","parentNodeId":"ns=1;i=12036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12038","parentNodeId":"ns=1;i=12036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12039","parentNodeId":"ns=1;i=12036","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12036"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveReseatPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve will close after passing the total pump flow."}],"displayName":[{"value":"ReliefValveReseatPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12040","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12041"},{"referenceType":"HasProperty","target":"ns=1;i=12042"},{"referenceType":"HasProperty","target":"ns=1;i=12043"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12041","parentNodeId":"ns=1;i=12040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12042","parentNodeId":"ns=1;i=12040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12043","parentNodeId":"ns=1;i=12040","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12040"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:ReliefValveSetPressure","dataType":"Double","description":[{"value":"Outlet pressure at which the relief valve begins to open."}],"displayName":[{"value":"ReliefValveSetPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12044","parentNodeId":"ns=1;i=5186","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12045"},{"referenceType":"HasProperty","target":"ns=1;i=12046"},{"referenceType":"HasProperty","target":"ns=1;i=12047"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5186"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12045","parentNodeId":"ns=1;i=12044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12046","parentNodeId":"ns=1;i=12044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12047","parentNodeId":"ns=1;i=12044","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12044"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:Direction","dataType":"PortDirectionEnum","description":[{"value":"Ports with the direction \u201CIn\u201D can only be connected to ports with the direction \u201COut\u201D or \u201CInOut\u201D and ports with the direction \u201COut\u201D can only be connected with ports with the direction \u201CIn\u201D or \u201CInOut\u201D. Ports with the direction \u201CInOut\u201D can be connected to Ports of arbitrary direction."}],"displayName":[{"value":"Direction"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10966","parentNodeId":"ns=1;i=5170","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12080"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12080","parentNodeId":"ns=1;i=10966","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10966"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:IdCarrier","dataType":"String","description":[{"value":"This property contains the ID of the asset to which the port is assigned."}],"displayName":[{"value":"IdCarrier"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=10967","parentNodeId":"ns=1;i=5170","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12082"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12082","parentNodeId":"ns=1;i=10967","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=10967"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Implementation","description":[{"value":"Properties that describe the specific installation and operational situation of the outlet connection."}],"displayName":[{"value":"Implementation"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5187","parentNodeId":"ns=1;i=5170","references":[{"referenceType":"HasComponent","target":"ns=1;i=12048"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasComponent","target":"ns=1;i=12052"},{"referenceType":"HasComponent","target":"ns=1;i=12056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1048"},{"referenceType":"HasComponent","target":"ns=1;i=12058"},{"referenceType":"HasComponent","target":"ns=1;i=12062"}],"typeDefinition":"ns=1;i=1048"},{"accessLevel":3,"browseName":"1:HeightOfTheOutletConnection","dataType":"Double","description":[{"value":"Height of the center of the outlet connection of the pump."}],"displayName":[{"value":"HeightOfTheOutletConnection"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12048","parentNodeId":"ns=1;i=5187","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12049"},{"referenceType":"HasProperty","target":"ns=1;i=12050"},{"referenceType":"HasProperty","target":"ns=1;i=12051"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5187"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12049","parentNodeId":"ns=1;i=12048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12050","parentNodeId":"ns=1;i=12048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12051","parentNodeId":"ns=1;i=12048","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12048"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:MeanRatedVelocityAtOutlet","dataType":"Double","description":[{"value":"Rated flow at pump outlet connection divided by the inlet area of the pump."}],"displayName":[{"value":"MeanRatedVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12052","parentNodeId":"ns=1;i=5187","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12053"},{"referenceType":"HasProperty","target":"ns=1;i=12054"},{"referenceType":"HasProperty","target":"ns=1;i=12055"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5187"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12053","parentNodeId":"ns=1;i=12052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12054","parentNodeId":"ns=1;i=12052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12055","parentNodeId":"ns=1;i=12052","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12052"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:NominalSize","dataType":"String","description":[{"value":"An alphanumeric designation of size for components of a pipework system, which is used for reference purposes. It comprises the letters DN followed by a dimensionless whole number which is indirectly related to the physical size, in millimeters, of the bore or outside diameter of the end connections."}],"displayName":[{"value":"NominalSize"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12056","parentNodeId":"ns=1;i=5187","references":[{"referenceType":"HasTypeDefinition","target":"i=2365"},{"referenceType":"HasProperty","target":"ns=1;i=12057"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5187"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=2365"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12057","parentNodeId":"ns=1;i=12056","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12056"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:RatedOutletPressure","dataType":"Double","description":[{"value":"Outlet pressure of the pump at the guarantee point with rated flow and rated speed, as well as rated inlet pressure, for rotodynamic pumps only."}],"displayName":[{"value":"RatedOutletPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12058","parentNodeId":"ns=1;i=5187","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12059"},{"referenceType":"HasProperty","target":"ns=1;i=12060"},{"referenceType":"HasProperty","target":"ns=1;i=12061"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5187"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12059","parentNodeId":"ns=1;i=12058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12060","parentNodeId":"ns=1;i=12058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12061","parentNodeId":"ns=1;i=12058","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12058"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"accessLevel":3,"browseName":"1:TotalHeadAtOutletAreaOfThePump","dataType":"Double","description":[{"value":"Head observed at outlet area of the pump, corresponding to the sum of the height, pressure head and velocity head."}],"displayName":[{"value":"TotalHeadAtOutletAreaOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12062","parentNodeId":"ns=1;i=5187","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12063"},{"referenceType":"HasProperty","target":"ns=1;i=12064"},{"referenceType":"HasProperty","target":"ns=1;i=12065"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5187"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12063","parentNodeId":"ns=1;i=12062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12064","parentNodeId":"ns=1;i=12062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12065","parentNodeId":"ns=1;i=12062","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12062"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:Measurements","description":[{"value":"All measurements of the operation which describe the outlet connection."}],"displayName":[{"value":"Measurements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5188","parentNodeId":"ns=1;i=5170","references":[{"referenceType":"HasComponent","target":"ns=1;i=12066"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1049"},{"referenceType":"HasComponent","target":"ns=1;i=12071"}],"typeDefinition":"ns=1;i=1049"},{"browseName":"1:MeanVelocityAtOutlet","dataType":"Double","description":[{"value":"Measured rate of flow at pump outlet connection divided by the outlet area of the pump."}],"displayName":[{"value":"MeanVelocityAtOutlet"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12066","parentNodeId":"ns=1;i=5188","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12067"},{"referenceType":"HasProperty","target":"ns=1;i=12068"},{"referenceType":"HasProperty","target":"ns=1;i=12069"},{"referenceType":"HasProperty","target":"ns=1;i=14966"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5188"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12067","parentNodeId":"ns=1;i=12066","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12066"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12068","parentNodeId":"ns=1;i=12066","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12066"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067859\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003Em/s\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Emetre per second\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12069","parentNodeId":"ns=1;i=12066","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12066"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Vector quantity giving the rate of change of a position vector"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14966","parentNodeId":"ns=1;i=12066","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12066"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Evelocity\u003C/uax:String\u003E"},{"browseName":"1:OutletTemperatureOfThePump","dataType":"Double","description":[{"value":"Measured temperature acting at the outlet area of the pump."}],"displayName":[{"value":"OutletTemperatureOfThePump"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12071","parentNodeId":"ns=1;i=5188","references":[{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12072"},{"referenceType":"HasProperty","target":"ns=1;i=12073"},{"referenceType":"HasProperty","target":"ns=1;i=12074"},{"referenceType":"HasProperty","target":"ns=1;i=14974"},{"referenceType":"GeneratesEvent","target":"i=2955"},{"referenceType":"HasModellingRule","target":"i=80"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5188"}],"typeDefinition":"i=15318","valueXml":"\u003Cuax:Double xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E0\u003C/uax:Double\u003E"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12072","parentNodeId":"ns=1;i=12071","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12071"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12073","parentNodeId":"ns=1;i=12071","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12071"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EK\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Ekelvin\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12074","parentNodeId":"ns=1;i=12071","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12071"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:KindOfQuantity","dataType":"String","description":[{"value":"Quantity representing a temperature value"}],"displayName":[{"value":"KindOfQuantity"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=14974","parentNodeId":"ns=1;i=12071","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12071"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Etemperature\u003C/uax:String\u003E"},{"browseName":"1:SystemRequirements","description":[{"value":"Buyer\u0027s properties that describe the installation situation of the outlet port."}],"displayName":[{"value":"SystemRequirements"}],"modellingRule":"Optional","nodeClass":"Object","nodeId":"ns=1;i=5190","parentNodeId":"ns=1;i=5170","references":[{"referenceType":"HasComponent","target":"ns=1;i=12076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"ns=1;i=1044"},{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5170"}],"typeDefinition":"ns=1;i=1044"},{"accessLevel":3,"browseName":"1:BackingPressure","dataType":"Double","description":[{"value":"Pressure at the outlet of a vacuum pump."}],"displayName":[{"value":"BackingPressure"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12076","parentNodeId":"ns=1;i=5190","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;i=5190"},{"referenceType":"HasTypeDefinition","target":"i=15318"},{"referenceType":"HasProperty","target":"ns=1;i=12077"},{"referenceType":"HasProperty","target":"ns=1;i=12078"},{"referenceType":"HasProperty","target":"ns=1;i=12079"},{"referenceType":"HasModellingRule","target":"i=80"}],"typeDefinition":"i=15318"},{"browseName":"Definition","dataType":"String","displayName":[{"value":"Definition"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12077","parentNodeId":"ns=1;i=12076","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12078","parentNodeId":"ns=1;i=12076","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\n \u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\n \u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\n \u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\n \u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\n \u003Cuax:Text\u003Epascal\u003C/uax:Text\u003E\n \u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"modellingRule":"Optional","nodeClass":"Variable","nodeId":"ns=1;i=12079","parentNodeId":"ns=1;i=12076","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=12076"},{"referenceType":"HasModellingRule","target":"i=80"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68"},{"browseName":"1:http://opcfoundation.org/UA/Pumps/","displayName":[{"value":"http://opcfoundation.org/UA/Pumps/"}],"documentation":"https://reference.opcfoundation.org/v104/Pumps/v100/docs/10.1","nodeClass":"Object","nodeId":"ns=1;i=5239","references":[{"referenceType":"HasProperty","target":"ns=1;i=13220"},{"referenceType":"HasTypeDefinition","target":"i=11616"},{"isForward":false,"referenceType":"HasComponent","target":"i=11715"},{"referenceType":"HasProperty","target":"ns=1;i=13221"},{"referenceType":"HasProperty","target":"ns=1;i=13222"},{"referenceType":"HasProperty","target":"ns=1;i=13676"},{"referenceType":"HasProperty","target":"ns=1;i=13677"},{"referenceType":"HasProperty","target":"ns=1;i=13678"},{"referenceType":"HasProperty","target":"ns=1;i=13679"}],"symbolicName":"http___opcfoundation_org_UA_Pumps_","typeDefinition":"i=11616"},{"browseName":"IsNamespaceSubset","dataType":"Boolean","displayName":[{"value":"IsNamespaceSubset"}],"nodeClass":"Variable","nodeId":"ns=1;i=13220","parentNodeId":"ns=1;i=5239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"NamespacePublicationDate","dataType":"DateTime","displayName":[{"value":"NamespacePublicationDate"}],"nodeClass":"Variable","nodeId":"ns=1;i=13221","parentNodeId":"ns=1;i=5239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:DateTime xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E2021-04-19T00:00:00Z\u003C/uax:DateTime\u003E"},{"browseName":"NamespaceUri","dataType":"String","displayName":[{"value":"NamespaceUri"}],"nodeClass":"Variable","nodeId":"ns=1;i=13222","parentNodeId":"ns=1;i=5239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Ehttp://opcfoundation.org/UA/Pumps/\u003C/uax:String\u003E"},{"browseName":"NamespaceVersion","dataType":"String","displayName":[{"value":"NamespaceVersion"}],"nodeClass":"Variable","nodeId":"ns=1;i=13676","parentNodeId":"ns=1;i=5239","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E1.0.0\u003C/uax:String\u003E"},{"arrayDimensions":"0","browseName":"StaticNodeIdTypes","dataType":"IdType","displayName":[{"value":"StaticNodeIdTypes"}],"nodeClass":"Variable","nodeId":"ns=1;i=13677","parentNodeId":"ns=1;i=5239","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003Cuax:ListOfInt32 xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:Int32\u003E0\u003C/uax:Int32\u003E\n \u003C/uax:ListOfInt32\u003E"},{"arrayDimensions":"0","browseName":"StaticNumericNodeIdRange","dataType":"NumericRange","displayName":[{"value":"StaticNumericNodeIdRange"}],"nodeClass":"Variable","nodeId":"ns=1;i=13678","parentNodeId":"ns=1;i=5239","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"}],"typeDefinition":"i=68","valueRank":1,"valueXml":"\u003CListOfString xmlns=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003CString\u003E1:2147483647\u003C/String\u003E\n \u003C/ListOfString\u003E"},{"browseName":"StaticStringNodeIdPattern","dataType":"String","displayName":[{"value":"StaticStringNodeIdPattern"}],"nodeClass":"Variable","nodeId":"ns=1;i=13679","parentNodeId":"ns=1;i=5239","references":[{"referenceType":"HasTypeDefinition","target":"i=68"},{"isForward":false,"referenceType":"HasProperty","target":"ns=1;i=5239"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003C/uax:String\u003E"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=5001","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3015"},{"referenceType":"HasDescription","target":"ns=1;i=6018"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=5002","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3015"},{"referenceType":"HasDescription","target":"ns=1;i=6019"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=5003","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3015"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=5004","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3016"},{"referenceType":"HasDescription","target":"ns=1;i=6020"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=5005","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3016"},{"referenceType":"HasDescription","target":"ns=1;i=6021"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=5006","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3016"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=5007","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3017"},{"referenceType":"HasDescription","target":"ns=1;i=6022"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=5008","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3017"},{"referenceType":"HasDescription","target":"ns=1;i=6023"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=5009","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3017"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=5010","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3018"},{"referenceType":"HasDescription","target":"ns=1;i=6024"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=5011","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3018"},{"referenceType":"HasDescription","target":"ns=1;i=6025"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=5012","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3018"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=5013","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"referenceType":"HasDescription","target":"ns=1;i=6026"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3019"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=5014","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"referenceType":"HasDescription","target":"ns=1;i=6027"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3019"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=5015","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3019"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"},{"browseName":"Default Binary","displayName":[{"value":"Default Binary"}],"nodeClass":"Object","nodeId":"ns=1;i=5016","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3020"},{"referenceType":"HasDescription","target":"ns=1;i=6028"}],"symbolicName":"DefaultBinary","typeDefinition":"i=76"},{"browseName":"Default XML","displayName":[{"value":"Default XML"}],"nodeClass":"Object","nodeId":"ns=1;i=5017","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3020"},{"referenceType":"HasDescription","target":"ns=1;i=6029"}],"symbolicName":"DefaultXml","typeDefinition":"i=76"},{"browseName":"Default JSON","displayName":[{"value":"Default JSON"}],"nodeClass":"Object","nodeId":"ns=1;i=5018","references":[{"referenceType":"HasTypeDefinition","target":"i=76"},{"isForward":false,"referenceType":"HasEncoding","target":"ns=1;i=3020"}],"symbolicName":"DefaultJson","typeDefinition":"i=76"}],"profileVersion":"1.0"}} \ No newline at end of file diff --git a/samples/WotCon/AggregationClient/Documents/SamplePump.NodeSet2.xml b/samples/WotCon/AggregationClient/Documents/SamplePump.NodeSet2.xml new file mode 100644 index 0000000000..a9d4ab97f1 --- /dev/null +++ b/samples/WotCon/AggregationClient/Documents/SamplePump.NodeSet2.xml @@ -0,0 +1,478 @@ + + + + + urn:opcfoundation.org:UA:WotAggregation:PumpInstance + http://opcfoundation.org/UA/Pumps/ + http://opcfoundation.org/UA/Machinery/ + http://opcfoundation.org/UA/DI/ + + + + + + + + + + + i=1 + i=7 + i=11 + i=12 + i=21 + i=40 + i=46 + i=47 + i=884 + i=887 + + + Pump #1 + Sample-owned aggregate pump projected from two upstream OPC UA servers. + + ns=1;s=Pump1.Identification + ns=1;s=Pump1.Operational + ns=1;s=Pump1.Events + ns=1;s=Pump1.Maintenance + ns=2;i=1052 + + + + Identification + + ns=1;s=Pump1 + ns=1;s=Pump1.Identification.Manufacturer + ns=1;s=Pump1.Identification.SerialNumber + ns=1;s=Pump1.Identification.ProductInstanceUri + ns=4;i=1005 + + + + Manufacturer + + ns=1;s=Pump1.Identification + i=68 + + + SimPump Corp + + + + SerialNumber + + ns=1;s=Pump1.Identification + i=68 + + + SN-001 + + + + ProductInstanceUri + + ns=1;s=Pump1.Identification + i=68 + + + urn:simdevice:SimPump:PumpX-2000:SN-001 + + + + Operational + + ns=1;s=Pump1 + ns=1;s=Pump1.Operational.Measurements + ns=2;i=1053 + + + + Measurements + + ns=1;s=Pump1.Operational + ns=1;s=Pump1.Operational.Measurements.DifferentialPressure + ns=1;s=Pump1.Operational.Measurements.FluidTemperature + ns=1;s=Pump1.Operational.Measurements.BearingTemperature + ns=1;s=Pump1.Operational.Measurements.PumpPowerInput + ns=1;s=Pump1.Operational.Measurements.MassFlow + ns=1;s=Pump1.Operational.Measurements.PumpEfficiency + ns=1;s=Pump1.Operational.Measurements.Level + ns=1;s=Pump1.Operational.Measurements.NumberOfStarts + ns=2;i=1054 + + + + DifferentialPressure + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.DifferentialPressure.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.DifferentialPressure.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.DifferentialPressure + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 5259596 + Pa + Pascal + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.DifferentialPressure + i=68 + + + + i=886 + + 01000000 + + + + + + FluidTemperature + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.FluidTemperature.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.FluidTemperature.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.FluidTemperature + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 4932940 + K + Kelvin + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.FluidTemperature + i=68 + + + + i=886 + + 233.15473.15 + + + + + + BearingTemperature + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.BearingTemperature.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.BearingTemperature.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.BearingTemperature + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 4932940 + K + Kelvin + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.BearingTemperature + i=68 + + + + i=886 + + 233.15473.15 + + + + + + PumpPowerInput + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.PumpPowerInput.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.PumpPowerInput.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.PumpPowerInput + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 5723220 + W + Watt + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.PumpPowerInput + i=68 + + + + i=886 + + 050000 + + + + + + MassFlow + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.MassFlow.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.MassFlow.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.MassFlow + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 4933459 + kg/s + Kilograms per Second + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.MassFlow + i=68 + + + + i=886 + + 01 + + + + + + PumpEfficiency + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.PumpEfficiency.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.PumpEfficiency.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.PumpEfficiency + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 20529 + % + Percent + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.PumpEfficiency + i=68 + + + + i=886 + + 0100 + + + + + + Level + + ns=1;s=Pump1.Operational.Measurements + ns=1;s=Pump1.Operational.Measurements.Level.EngineeringUnits + ns=1;s=Pump1.Operational.Measurements.Level.EURange + i=15318 + + + + EngineeringUnits + + ns=1;s=Pump1.Operational.Measurements.Level + i=68 + + + + i=888 + + + http://www.opcfoundation.org/UA/units/un/cefact + 5067858 + m + Metre + + + + + + + EURange + + ns=1;s=Pump1.Operational.Measurements.Level + i=68 + + + + i=886 + + 010 + + + + + + NumberOfStarts + + ns=1;s=Pump1.Operational.Measurements + i=15318 + + + + Events + + ns=1;s=Pump1 + ns=1;s=Pump1.Events.SupervisionProcessFluid + ns=1;s=Pump1.Events.SupervisionPumpOperation + ns=2;i=1019 + + + + SupervisionProcessFluid + + ns=1;s=Pump1.Events + ns=1;s=Pump1.Events.SupervisionProcessFluid.Cavitation + ns=2;i=1015 + + + + Cavitation + + ns=1;s=Pump1.Events.SupervisionProcessFluid + i=2373 + + + false + + + + SupervisionPumpOperation + + ns=1;s=Pump1.Events + ns=1;s=Pump1.Events.SupervisionPumpOperation.MotorOverheat + ns=2;i=1016 + + + + MotorOverheat + + ns=1;s=Pump1.Events.SupervisionPumpOperation + i=2373 + + + false + + + + Maintenance + + ns=1;s=Pump1 + ns=2;i=1011 + + + diff --git a/samples/WotCon/AggregationClient/Documents/SamplePump.td.json b/samples/WotCon/AggregationClient/Documents/SamplePump.td.json new file mode 100644 index 0000000000..bde9858bca --- /dev/null +++ b/samples/WotCon/AggregationClient/Documents/SamplePump.td.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/2022/wot/td/v1.1",{"ns1":"urn:opcfoundation.org:UA:WotAggregation:PumpInstance","ns2":"http://opcfoundation.org/UA/Pumps/","ns3":"http://opcfoundation.org/UA/Machinery/","ns4":"http://opcfoundation.org/UA/DI/","ua":"http://opcfoundation.org/UA/","uav":"http://opcfoundation.org/UA/WoT-Binding/"}],"@type":"uav:object","description":"Sample-owned aggregate pump projected from two upstream OPC UA servers.","properties":{"BearingTemperature":{"@type":"uav:variable","forms":[{"href":"${SOURCE_B_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceB;s=Pump1.Operational.Measurements.BearingTemperature"}],"maximum":473.15,"minimum":233.15,"observable":true,"readOnly":true,"title":"BearingTemperature","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.BearingTemperature","unit":"K"},"Cavitation":{"@type":"uav:variable","forms":[{"href":"${SOURCE_A_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceA;s=Pump1.Events.SupervisionProcessFluid.Cavitation"}],"observable":true,"readOnly":true,"title":"Cavitation","type":"boolean","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Events.SupervisionProcessFluid.Cavitation"},"DifferentialPressure":{"@type":"uav:variable","forms":[{"href":"${SOURCE_A_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceA;s=Pump1.Operational.Measurements.DifferentialPressure"}],"maximum":1000000,"minimum":0,"observable":true,"readOnly":true,"title":"DifferentialPressure","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.DifferentialPressure","unit":"Pa"},"FluidTemperature":{"@type":"uav:variable","forms":[{"href":"${SOURCE_A_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceA;s=Pump1.Operational.Measurements.FluidTemperature"}],"maximum":473.15,"minimum":233.15,"observable":true,"readOnly":true,"title":"FluidTemperature","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.FluidTemperature","unit":"K"},"Level":{"@type":"uav:variable","forms":[{"href":"${SOURCE_A_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceA;s=Pump1.Operational.Measurements.Level"}],"maximum":10,"minimum":0,"observable":true,"readOnly":true,"title":"Level","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.Level","unit":"m"},"MassFlow":{"@type":"uav:variable","forms":[{"href":"${SOURCE_A_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceA;s=Pump1.Operational.Measurements.MassFlow"}],"maximum":1,"minimum":0,"observable":true,"readOnly":true,"title":"MassFlow","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.MassFlow","unit":"kg/s"},"MotorOverheat":{"@type":"uav:variable","forms":[{"href":"${SOURCE_B_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceB;s=Pump1.Events.SupervisionPumpOperation.MotorOverheat"}],"observable":true,"readOnly":true,"title":"MotorOverheat","type":"boolean","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Events.SupervisionPumpOperation.MotorOverheat"},"NumberOfStarts":{"@type":"uav:variable","forms":[{"href":"${SOURCE_B_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceB;s=Pump1.Operational.Measurements.NumberOfStarts"}],"maximum":4294967295,"minimum":0,"observable":true,"readOnly":true,"title":"NumberOfStarts","type":"integer","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.NumberOfStarts"},"PumpEfficiency":{"@type":"uav:variable","forms":[{"href":"${SOURCE_B_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceB;s=Pump1.Operational.Measurements.PumpEfficiency"}],"maximum":100,"minimum":0,"observable":true,"readOnly":true,"title":"PumpEfficiency","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.PumpEfficiency","unit":"%"},"PumpPowerInput":{"@type":"uav:variable","forms":[{"href":"${SOURCE_B_ENDPOINT}","op":["readproperty","observeproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceB;s=Pump1.Operational.Measurements.PumpPowerInput"}],"maximum":50000,"minimum":0,"observable":true,"readOnly":true,"title":"PumpPowerInput","type":"number","uav:mapToNodeId":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1.Operational.Measurements.PumpPowerInput","unit":"W"}},"title":"Sample Pump Aggregate","uav:browseName":"ns1:Pump #1","uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;s=Pump1","uav:nodes":{"@type":"uav:NodeModel","aliases":[{"alias":"Boolean","value":"i=1"},{"alias":"UInt32","value":"i=7"},{"alias":"Double","value":"i=11"},{"alias":"String","value":"i=12"},{"alias":"LocalizedText","value":"i=21"},{"alias":"HasTypeDefinition","value":"i=40"},{"alias":"HasProperty","value":"i=46"},{"alias":"HasComponent","value":"i=47"},{"alias":"Range","value":"i=884"},{"alias":"EUInformation","value":"i=887"}],"models":[{"modelUri":"urn:opcfoundation.org:UA:WotAggregation:PumpInstance","publicationDate":"2026-07-24T00:00:00Z","requiredModels":[{"modelUri":"http://opcfoundation.org/UA/","publicationDate":"2022-02-24T00:00:00Z","version":"1.05.01"},{"modelUri":"http://opcfoundation.org/UA/DI/","publicationDate":"2022-11-03T00:00:00Z","version":"1.04.0"},{"modelUri":"http://opcfoundation.org/UA/Machinery/","publicationDate":"2021-02-25T00:00:00Z","version":"1.01.0"},{"modelUri":"http://opcfoundation.org/UA/Pumps/","publicationDate":"2021-04-19T00:00:00Z","version":"1.0.0"}],"version":"1.0.0"}],"namespaceUris":["urn:opcfoundation.org:UA:WotAggregation:PumpInstance","http://opcfoundation.org/UA/Pumps/","http://opcfoundation.org/UA/Machinery/","http://opcfoundation.org/UA/DI/"],"nodes":[{"browseName":"1:Pump #1","description":[{"value":"Sample-owned aggregate pump projected from two upstream OPC UA servers."}],"displayName":[{"value":"Pump #1"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1","references":[{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Maintenance"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1052"}],"typeDefinition":"ns=2;i=1052"},{"browseName":"4:Identification","displayName":[{"value":"Identification"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Identification","parentNodeId":"ns=1;s=Pump1","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification.Manufacturer"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification.SerialNumber"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification.ProductInstanceUri"},{"referenceType":"HasTypeDefinition","target":"ns=4;i=1005"}],"typeDefinition":"ns=4;i=1005"},{"browseName":"4:Manufacturer","dataType":"LocalizedText","displayName":[{"value":"Manufacturer"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Identification.Manufacturer","parentNodeId":"ns=1;s=Pump1.Identification","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:LocalizedText xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\u003Cuax:Text\u003ESimPump Corp\u003C/uax:Text\u003E\u003C/uax:LocalizedText\u003E"},{"browseName":"4:SerialNumber","dataType":"String","displayName":[{"value":"SerialNumber"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Identification.SerialNumber","parentNodeId":"ns=1;s=Pump1.Identification","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003ESN-001\u003C/uax:String\u003E"},{"browseName":"4:ProductInstanceUri","dataType":"String","displayName":[{"value":"ProductInstanceUri"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Identification.ProductInstanceUri","parentNodeId":"ns=1;s=Pump1.Identification","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Identification"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:String xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Eurn:simdevice:SimPump:PumpX-2000:SN-001\u003C/uax:String\u003E"},{"browseName":"4:Operational","displayName":[{"value":"Operational"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Operational","parentNodeId":"ns=1;s=Pump1","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1053"}],"typeDefinition":"ns=2;i=1053"},{"browseName":"2:Measurements","displayName":[{"value":"Measurements"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Operational.Measurements","parentNodeId":"ns=1;s=Pump1.Operational","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.MassFlow"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.Level"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements.NumberOfStarts"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1054"}],"typeDefinition":"ns=2;i=1054"},{"browseName":"2:DifferentialPressure","dataType":"Double","displayName":[{"value":"DifferentialPressure"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5259596\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003EPa\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EPascal\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.DifferentialPressure"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E0\u003C/uax:Low\u003E\u003Cuax:High\u003E1000000\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:FluidTemperature","dataType":"Double","displayName":[{"value":"FluidTemperature"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003EK\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EKelvin\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.FluidTemperature"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E233.15\u003C/uax:Low\u003E\u003Cuax:High\u003E473.15\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:BearingTemperature","dataType":"Double","displayName":[{"value":"BearingTemperature"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4932940\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003EK\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EKelvin\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.BearingTemperature"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E233.15\u003C/uax:Low\u003E\u003Cuax:High\u003E473.15\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:PumpPowerInput","dataType":"Double","displayName":[{"value":"PumpPowerInput"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5723220\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003EW\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EWatt\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpPowerInput"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E0\u003C/uax:Low\u003E\u003Cuax:High\u003E50000\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:MassFlow","dataType":"Double","displayName":[{"value":"MassFlow"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.MassFlow","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.MassFlow.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.MassFlow.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.MassFlow.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.MassFlow","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.MassFlow"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E4933459\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003Ekg/s\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EKilograms per Second\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.MassFlow.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.MassFlow","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.MassFlow"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E0\u003C/uax:Low\u003E\u003Cuax:High\u003E1\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:PumpEfficiency","dataType":"Double","displayName":[{"value":"PumpEfficiency"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E20529\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003E%\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EPercent\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.PumpEfficiency"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E0\u003C/uax:Low\u003E\u003Cuax:High\u003E100\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:Level","dataType":"Double","displayName":[{"value":"Level"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.Level","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.Level.EngineeringUnits"},{"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.Level.EURange"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"EngineeringUnits","dataType":"EUInformation","displayName":[{"value":"EngineeringUnits"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.Level.EngineeringUnits","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.Level","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.Level"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=888\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:EUInformation\u003E\n \u003Cuax:NamespaceUri\u003Ehttp://www.opcfoundation.org/UA/units/un/cefact\u003C/uax:NamespaceUri\u003E\n \u003Cuax:UnitId\u003E5067858\u003C/uax:UnitId\u003E\n \u003Cuax:DisplayName\u003E\u003Cuax:Text\u003Em\u003C/uax:Text\u003E\u003C/uax:DisplayName\u003E\n \u003Cuax:Description\u003E\u003Cuax:Text\u003EMetre\u003C/uax:Text\u003E\u003C/uax:Description\u003E\n \u003C/uax:EUInformation\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"EURange","dataType":"Range","displayName":[{"value":"EURange"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.Level.EURange","parentNodeId":"ns=1;s=Pump1.Operational.Measurements.Level","references":[{"isForward":false,"referenceType":"HasProperty","target":"ns=1;s=Pump1.Operational.Measurements.Level"},{"referenceType":"HasTypeDefinition","target":"i=68"}],"typeDefinition":"i=68","valueXml":"\u003Cuax:ExtensionObject xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003E\n \u003Cuax:TypeId\u003E\u003Cuax:Identifier\u003Ei=886\u003C/uax:Identifier\u003E\u003C/uax:TypeId\u003E\n \u003Cuax:Body\u003E\n \u003Cuax:Range\u003E\u003Cuax:Low\u003E0\u003C/uax:Low\u003E\u003Cuax:High\u003E10\u003C/uax:High\u003E\u003C/uax:Range\u003E\n \u003C/uax:Body\u003E\n \u003C/uax:ExtensionObject\u003E"},{"browseName":"2:NumberOfStarts","dataType":"UInt32","displayName":[{"value":"NumberOfStarts"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Operational.Measurements.NumberOfStarts","parentNodeId":"ns=1;s=Pump1.Operational.Measurements","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Operational.Measurements"},{"referenceType":"HasTypeDefinition","target":"i=15318"}],"typeDefinition":"i=15318"},{"browseName":"2:Events","displayName":[{"value":"Events"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Events","parentNodeId":"ns=1;s=Pump1","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events.SupervisionProcessFluid"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events.SupervisionPumpOperation"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1019"}],"typeDefinition":"ns=2;i=1019"},{"browseName":"2:SupervisionProcessFluid","displayName":[{"value":"SupervisionProcessFluid"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Events.SupervisionProcessFluid","parentNodeId":"ns=1;s=Pump1.Events","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events.SupervisionProcessFluid.Cavitation"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1015"}],"typeDefinition":"ns=2;i=1015"},{"browseName":"2:Cavitation","dataType":"Boolean","displayName":[{"value":"Cavitation"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Events.SupervisionProcessFluid.Cavitation","parentNodeId":"ns=1;s=Pump1.Events.SupervisionProcessFluid","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events.SupervisionProcessFluid"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"2:SupervisionPumpOperation","displayName":[{"value":"SupervisionPumpOperation"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Events.SupervisionPumpOperation","parentNodeId":"ns=1;s=Pump1.Events","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events"},{"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events.SupervisionPumpOperation.MotorOverheat"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1016"}],"typeDefinition":"ns=2;i=1016"},{"browseName":"2:MotorOverheat","dataType":"Boolean","displayName":[{"value":"MotorOverheat"}],"nodeClass":"Variable","nodeId":"ns=1;s=Pump1.Events.SupervisionPumpOperation.MotorOverheat","parentNodeId":"ns=1;s=Pump1.Events.SupervisionPumpOperation","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1.Events.SupervisionPumpOperation"},{"referenceType":"HasTypeDefinition","target":"i=2373"}],"typeDefinition":"i=2373","valueXml":"\u003Cuax:Boolean xmlns:uax=\u0022http://opcfoundation.org/UA/2008/02/Types.xsd\u0022\u003Efalse\u003C/uax:Boolean\u003E"},{"browseName":"4:Maintenance","displayName":[{"value":"Maintenance"}],"nodeClass":"Object","nodeId":"ns=1;s=Pump1.Maintenance","parentNodeId":"ns=1;s=Pump1","references":[{"isForward":false,"referenceType":"HasComponent","target":"ns=1;s=Pump1"},{"referenceType":"HasTypeDefinition","target":"ns=2;i=1011"}],"typeDefinition":"ns=2;i=1011"}],"profileVersion":"1.0"}} \ No newline at end of file diff --git a/samples/WotCon/AggregationClient/Documents/documents.json b/samples/WotCon/AggregationClient/Documents/documents.json new file mode 100644 index 0000000000..b5d05eb14a --- /dev/null +++ b/samples/WotCon/AggregationClient/Documents/documents.json @@ -0,0 +1 @@ +[{"dependsOn":[],"documentKind":"ThingModel","groupId":"thingmodels","path":"Opc.Ua.Di.tm.json","resourceId":"opc-ua-di"},{"dependsOn":["opc-ua-di"],"documentKind":"ThingModel","groupId":"thingmodels","path":"Opc.Ua.Machinery.tm.json","resourceId":"opc-ua-machinery"},{"dependsOn":["opc-ua-di","opc-ua-machinery"],"documentKind":"ThingModel","groupId":"thingmodels","path":"Opc.Ua.Pumps.tm.json","resourceId":"opc-ua-pumps"},{"dependsOn":["opc-ua-di","opc-ua-machinery","opc-ua-pumps"],"documentKind":"ThingDescription","groupId":"thingdescriptions","path":"SamplePump.td.json","resourceId":"sample-pump"}] \ No newline at end of file diff --git a/samples/WotCon/AggregationClient/Program.cs b/samples/WotCon/AggregationClient/Program.cs new file mode 100644 index 0000000000..46a0f32399 --- /dev/null +++ b/samples/WotCon/AggregationClient/Program.cs @@ -0,0 +1,92 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Microsoft.Extensions.Hosting; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Client; +using AggregationClient; + +try +{ + HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); + var options = new AggregationClientOptions + { + AggregationEndpoint = builder.Configuration["aggregationEndpoint"] ?? + "opc.tcp://localhost:62550/AggregationServer", + SourceAEndpoint = builder.Configuration["sourceAEndpoint"] ?? + "opc.tcp://localhost:62551/SourceA", + SourceBEndpoint = builder.Configuration["sourceBEndpoint"] ?? + "opc.tcp://localhost:62552/SourceB", + DocumentsDirectory = builder.Configuration["documentsDirectory"] ?? + System.IO.Path.Combine(AppContext.BaseDirectory, "Documents") + }; + + AggregationClientResult result = await AggregationClientRunner + .RunAsync(options) + .ConfigureAwait(false); + + foreach (WotRegistryDocumentLoadOutcome upload in result.LoadResult.Uploaded) + { + Console.WriteLine( + $"Loaded {upload.Document.Kind} {upload.Document.ResourceId} " + + $"(version {upload.VersionId}, created: {upload.Created})."); + } + + WotRegistryRefreshResult refresh = result.LoadResult.Refresh ?? + throw new InvalidOperationException("The registry refresh did not run."); + Console.WriteLine( + $"Refresh generation {refresh.NewGeneration}: {refresh.Summary.Outcome}, " + + $"{refresh.Summary.Succeeded}/{refresh.Summary.Total} succeeded."); + foreach (WoTResourceLoadResultDataType resource in refresh.Results) + { + Console.WriteLine( + $" {resource.ResourceId}: {resource.Phase}/{resource.Outcome} " + + $"({resource.LoadState}) {resource.Message}"); + } + + Console.WriteLine("Materialized Pump browse:"); + foreach (WotPumpBrowseNode node in result.BrowsedNodes) + { + Console.WriteLine($" {node.NodeId}: {node.DisplayName} ({node.NodeClass})"); + } + + Console.WriteLine("Materialized Pump values:"); + foreach (WotPumpValueResult value in result.Values) + { + Console.WriteLine( + $" {value.Name}: {value.Value} [{value.StatusCode}]"); + } +} +catch (Exception ex) +{ + Console.Error.WriteLine(ex); + Console.Error.WriteLine(ex.StackTrace); + Environment.ExitCode = 1; +} diff --git a/samples/WotCon/AggregationClient/Properties/AssemblyInfo.cs b/samples/WotCon/AggregationClient/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..7798c9bd57 --- /dev/null +++ b/samples/WotCon/AggregationClient/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/samples/WotCon/AggregationClient/README.md b/samples/WotCon/AggregationClient/README.md new file mode 100644 index 0000000000..8cd48b38ac --- /dev/null +++ b/samples/WotCon/AggregationClient/README.md @@ -0,0 +1,5 @@ +# AggregationClient + +This one-shot client orders and uploads the checked-in WoT documents, substitutes the two source endpoints, calls registry `Refresh`, browses the materialized Pump, reads values from both sources, and prints the result. + +See the [WoT aggregation sample guide](../README.md) for complete commands and expected behavior. diff --git a/samples/WotCon/AggregationServer/AggregationServer.csproj b/samples/WotCon/AggregationServer/AggregationServer.csproj new file mode 100644 index 0000000000..0021850e81 --- /dev/null +++ b/samples/WotCon/AggregationServer/AggregationServer.csproj @@ -0,0 +1,28 @@ + + + net8.0;net9.0;net10.0 + $(CustomTestTarget) + $(CustomTestTarget) + Exe + false + AggregationServer + AggregationServer + OPC Foundation + Generic OPC UA WoT registry and materialization server sample. + Copyright © 2004-2026 OPC Foundation, Inc + enable + true + true + + + + + + + + + + + + + diff --git a/samples/WotCon/AggregationServer/AggregationServerHost.cs b/samples/WotCon/AggregationServer/AggregationServerHost.cs new file mode 100644 index 0000000000..cfe80f26c0 --- /dev/null +++ b/samples/WotCon/AggregationServer/AggregationServerHost.cs @@ -0,0 +1,227 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Opc.Ua; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.OpcUa; +using Opc.Ua.WotCon.Server; + +namespace AggregationServer +{ + /// + /// Builds and runs the reusable generic aggregation host. + /// + public static class AggregationServerHost + { + /// + /// Builds a host from explicit options. + /// + /// + public static IHost Build(AggregationServerOptions options) + { + if (options is null) + { + throw new ArgumentNullException(nameof(options)); + } + + HostApplicationBuilder builder = Host.CreateApplicationBuilder(); + Configure(builder, options); + return builder.Build(); + } + + /// + /// Builds and runs a host from explicit options. + /// + public static async Task RunAsync( + AggregationServerOptions options, + CancellationToken cancellationToken = default) + { + using IHost host = Build(options); + await host.RunAsync(cancellationToken).ConfigureAwait(false); + } + + /// + /// Builds and runs a host from command-line configuration. + /// + public static async Task RunAsync( + string[] args, + CancellationToken cancellationToken = default) + { + HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); + var options = new AggregationServerOptions + { + EndpointUrl = builder.Configuration["endpoint"], + Host = builder.Configuration["host"] ?? "localhost", + Port = ReadPort(builder.Configuration), + ApplicationName = + builder.Configuration["applicationName"] ?? "AggregationServer", + MaximumDocumentBytes = ReadMaximumDocumentBytes(builder.Configuration) + }; + Configure(builder, options); + using IHost host = builder.Build(); + await host.RunAsync(cancellationToken).ConfigureAwait(false); + } + + private static void Configure( + HostApplicationBuilder builder, + AggregationServerOptions options) + { + Validate(options); + builder.Logging.ClearProviders(); + builder.Logging.AddConsole(); + builder.Services.AddSingleton(options); + + string endpoint = options.EndpointUrl ?? + $"opc.tcp://{options.Host}:{options.Port}/AggregationServer"; + IOpcUaBuilder opcUa = builder.Services.AddOpcUa(); + opcUa.AddOpcTcpTransport(); + opcUa.AddServer(server => + { + server.ApplicationName = options.ApplicationName; + server.ApplicationUri = + $"urn:localhost:OPCFoundation:{options.ApplicationName}"; + server.ProductUri = "uri:opcfoundation.org:AggregationServer"; + if (!string.IsNullOrWhiteSpace(options.PkiRoot)) + { + server.PkiRoot = options.PkiRoot; + } + server.AutoAcceptUntrustedCertificates = true; + server.IncludeUnsecurePolicyNone = true; + server.EndpointUrls.Add(endpoint); + }); + opcUa.AddWotRegistryServer(registry => + { + registry.AutoRefresh = false; + registry.Bounds.MaxDocumentBytes = options.MaximumDocumentBytes; + registry.ManagementAccess = new WotManagementAccessPolicy + { + MinimumSecurityMode = MessageSecurityMode.None, + AllowAnonymous = true, + RequiredRoleId = ObjectIds.WellKnownRole_Anonymous + }; + }); + + opcUa.AddClient(client => + { + client.ApplicationName = $"{options.ApplicationName}.Upstream"; + client.ApplicationUri = + $"urn:localhost:OPCFoundation:{options.ApplicationName}.Upstream"; + client.ProductUri = "uri:opcfoundation.org:AggregationServer"; + if (!string.IsNullOrWhiteSpace(options.PkiRoot)) + { + client.PkiRoot = Path.Combine(options.PkiRoot, "upstream"); + } + client.AutoAcceptUntrustedCertificates = true; + client.Session = new ManagedSessionOptions + { + SessionName = $"{options.ApplicationName}.Upstream", + SessionTimeout = TimeSpan.FromSeconds(60) + }; + }).AddManagedClientPool(); + + opcUa.AddHttpWotBinding(); + opcUa.AddModbusWotBinding(); + builder.Services.AddSingleton(serviceProvider => + { + IManagedSessionPool pool = + serviceProvider.GetRequiredService(); + return new OpcUaWotBindingExecutor(new OpcUaWotBindingOptions + { + DisposeSession = false, + SessionFactory = async (url, ct) => + { + var endpointDescription = new EndpointDescription + { + EndpointUrl = url, + SecurityMode = MessageSecurityMode.None, + SecurityPolicyUri = SecurityPolicies.None + }; + var configuredEndpoint = new ConfiguredEndpoint( + null, + endpointDescription, + null); + return await pool.GetOrConnectAsync(url, configuredEndpoint, ct) + .ConfigureAwait(false); + } + }); + }); + } + + private static int ReadPort(ConfigurationManager configuration) + { + return int.TryParse( + configuration["port"], + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out int port) + ? port + : 62550; + } + + private static int ReadMaximumDocumentBytes(ConfigurationManager configuration) + { + return int.TryParse( + configuration["maximumDocumentBytes"], + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out int maximumDocumentBytes) + ? maximumDocumentBytes + : 32 * 1024 * 1024; + } + + private static void Validate(AggregationServerOptions options) + { + if (string.IsNullOrWhiteSpace(options.ApplicationName)) + { + throw new ArgumentException("ApplicationName is required.", nameof(options)); + } + if (options.MaximumDocumentBytes <= 0) + { + throw new ArgumentException( + "MaximumDocumentBytes must be positive.", + nameof(options)); + } + if (options.EndpointUrl is null && + (string.IsNullOrWhiteSpace(options.Host) || options.Port is < 1 or > 65535)) + { + throw new ArgumentException("A valid host and port are required.", nameof(options)); + } + } + } +} diff --git a/samples/WotCon/AggregationServer/AggregationServerOptions.cs b/samples/WotCon/AggregationServer/AggregationServerOptions.cs new file mode 100644 index 0000000000..779c8d3f17 --- /dev/null +++ b/samples/WotCon/AggregationServer/AggregationServerOptions.cs @@ -0,0 +1,67 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace AggregationServer +{ + /// + /// Configures the generic WoT aggregation server host. + /// + public sealed class AggregationServerOptions + { + /// + /// Gets or sets the endpoint URL. When empty, host and port are used. + /// + public string? EndpointUrl { get; set; } + + /// + /// Gets or sets the endpoint host. + /// + public string Host { get; set; } = "localhost"; + + /// + /// Gets or sets the endpoint port. + /// + public int Port { get; set; } = 62550; + + /// + /// Gets or sets the application name. + /// + public string ApplicationName { get; set; } = "AggregationServer"; + + /// + /// Gets or sets the isolated PKI root shared by the server and upstream client. + /// + public string? PkiRoot { get; set; } + + /// + /// Gets or sets the maximum accepted document size. + /// + public int MaximumDocumentBytes { get; set; } = 32 * 1024 * 1024; + } +} diff --git a/samples/WotCon/AggregationServer/Bindings/MemoryWotBinding.cs b/samples/WotCon/AggregationServer/Bindings/MemoryWotBinding.cs new file mode 100644 index 0000000000..dd5bbd1a73 --- /dev/null +++ b/samples/WotCon/AggregationServer/Bindings/MemoryWotBinding.cs @@ -0,0 +1,252 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Bindings; + +namespace AggregationServer +{ + /// + /// A worked sample showing how a third party contributes a replaceable + /// protocol binder as pure code-behind. The fictitious mem protocol + /// binds property affordances to an in-process key/value store, demonstrating + /// the full extension surface: identity, capability, deterministic + /// identification, a planner and an executor with a live channel. Register it + /// with builder.AddWotBinder(new MemoryWotBinder()) and + /// builder.AddWotBindingExecutor(new MemoryWotBindingExecutor(store)). + /// + public sealed class MemoryWotBinder : WotProtocolBinderBase + { + /// + /// The sample binding vocabulary URI. + /// + public const string BindingUri = "urn:example:wot:mem"; + + private static readonly string[] s_schemes = ["mem"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("example.mem", "1.0", BindingUri, "Sample In-Memory Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "Sample In-Memory Binding", + new WotBindingSource("urn:example:wot:mem", "1.0", WotBindingMaturity.UnofficialDraft, + note: "A sample custom binding for documentation and tests."), + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty + ], + ["application/json", "text/plain"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "memv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href) || + !TryParseUri(href, out Uri uri) || + !string.Equals(uri.Scheme, "mem", StringComparison.OrdinalIgnoreCase)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid mem:// URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string key = uri.AbsolutePath.Trim('/'); + ResolveCodec(form, context, out WotPayloadDescriptor payload); + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor(key); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, capability.ToString()); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + return entries.Count == 0 + ? WotBindingCompilation.Unsupported([.. diagnostics]) + : WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + } + + /// + /// The in-process key/value store the sample binding reads and writes. + /// + public sealed class MemoryWotStore + { + /// + /// Gets the value stored under a key. + /// + public DataValue Get(string key) + { + return m_values.TryGetValue(key, out DataValue value) ? value : new DataValue(Variant.Null); + } + + /// + /// Sets the value stored under a key. + /// + public void Set(string key, DataValue value) + { + m_values[key] = value; + } + + private readonly ConcurrentDictionary m_values = + new(StringComparer.Ordinal); + } + + /// + /// The executor for the sample in-memory binding. + /// + public sealed class MemoryWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new sample executor over the supplied store. + /// + public MemoryWotBindingExecutor(MemoryWotStore store) + { + m_store = store ?? throw new ArgumentNullException(nameof(store)); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("example.mem", "1.0", MemoryWotBinder.BindingUri, "Sample In-Memory Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + return form is not null && string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal); + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "The channel is owned by the caller, who disposes it via DisposeAsync.")] + public ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + IWotBindingChannel channel = new MemoryWotBindingChannel(m_store, form); + return new ValueTask(channel); + } + + private readonly MemoryWotStore m_store; + } + + /// + /// The live channel for the sample in-memory binding. + /// + internal sealed class MemoryWotBindingChannel : IWotBindingChannel + { + public MemoryWotBindingChannel(MemoryWotStore store, WotCompiledForm form) + { + m_store = store; + Form = form; + m_key = form.Addressing.Target; + } + + public WotCompiledForm Form { get; } + + public ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + return new ValueTask(new WotReadResult(StatusCodes.Good, m_store.Get(m_key))); + } + + public ValueTask WriteAsync(DataValue value, CancellationToken cancellationToken = default) + { + m_store.Set(m_key, value); + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + } + + public ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + return new ValueTask(new WotInvokeResult( + StatusCodes.BadNotSupported, null, "The sample binding has no actions.")); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller, who disposes it.")] + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + var subscription = new PollingWotSubscription(Form, token => + { + onNotification(new WotNotification(m_store.Get(m_key))); + return new ValueTask(true); + }, TimeSpan.FromMilliseconds(200)); + return new ValueTask(subscription); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + return ObserveAsync(onEvent, cancellationToken); + } + + public ValueTask DisposeAsync() + { + return default; + } + + private readonly MemoryWotStore m_store; + private readonly string m_key; + } +} diff --git a/samples/WotCon/AggregationServer/Program.cs b/samples/WotCon/AggregationServer/Program.cs new file mode 100644 index 0000000000..cd9f75fb40 --- /dev/null +++ b/samples/WotCon/AggregationServer/Program.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using AggregationServer; + +await AggregationServerHost.RunAsync(args).ConfigureAwait(false); diff --git a/samples/WotCon/AggregationServer/Properties/AssemblyInfo.cs b/samples/WotCon/AggregationServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..7798c9bd57 --- /dev/null +++ b/samples/WotCon/AggregationServer/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/samples/WotCon/AggregationServer/README.md b/samples/WotCon/AggregationServer/README.md new file mode 100644 index 0000000000..4769f7a1d2 --- /dev/null +++ b/samples/WotCon/AggregationServer/README.md @@ -0,0 +1,20 @@ +# AggregationServer + +This sample hosts the generic WoT registry, runtime document materialization, and protocol-binding projection runtime. It contains no Pump-specific generated code; DI, Machinery, Pumps, and the Pump instance are loaded at runtime from WoT files. + +It also includes [`MemoryWotBinding.cs`](Bindings/MemoryWotBinding.cs), a small in-memory custom binding and executor +that demonstrates how third-party protocol bindings plug into the runtime without shipping that demo code in the +`Opc.Ua.WotCon.Bindings` library. It is provided as a reference implementation and is deliberately not registered in +this sample's host, so the aggregation topology exercises only the real HTTP, Modbus and OPC UA bindings. To try it, +register it alongside the other bindings in `AggregationServerHost.Configure`: + +```csharp +var memoryStore = new MemoryWotStore(); +opcUa.AddWotProtocolBinders() + .AddWotBinder(new MemoryWotBinder()) + .AddWotBindingExecutor(new MemoryWotBindingExecutor(memoryStore)); +``` + +The executable server targets `net8.0`, `net9.0`, and `net10.0`, where its OPC UA binding executor is available. Legacy `CustomTestTarget` solution builds use a no-op shell and are not runnable sample configurations. + +See the [WoT aggregation sample guide](../README.md) for topology, commands, monitoring, shadow replacement, troubleshooting, and NativeAOT publishing. diff --git a/samples/WotCon/FlatTagServer/FlatTagNodeManager.cs b/samples/WotCon/FlatTagServer/FlatTagNodeManager.cs new file mode 100644 index 0000000000..38a5a5803d --- /dev/null +++ b/samples/WotCon/FlatTagServer/FlatTagNodeManager.cs @@ -0,0 +1,315 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua; +using Opc.Ua.Server; + +namespace FlatTagServer +{ + /// + /// Creates flat-tag node managers from the configured source options. + /// + public sealed class FlatTagNodeManagerFactory : IAsyncNodeManagerFactory + { + /// + /// Initializes the factory. + /// + public FlatTagNodeManagerFactory(FlatTagServerOptions options) + { + m_options = options ?? throw new ArgumentNullException(nameof(options)); + NamespacesUris = [options.SourceNamespaceUri]; + } + + /// + public ArrayOf NamespacesUris { get; } + + /// + public ValueTask CreateAsync( + IServerInternal server, + ApplicationConfiguration configuration, + CancellationToken cancellationToken = default) + { + _ = configuration; + _ = cancellationToken; + // CA2000 cannot model ownership transfer through ValueTask. + // TODO: Remove this suppression when CA2000 recognizes factory ownership transfer. +#pragma warning disable CA2000 + IAsyncNodeManager nodeManager = new FlatTagNodeManager(server, m_options); +#pragma warning restore CA2000 + return new ValueTask(nodeManager); + } + + private readonly FlatTagServerOptions m_options; + } + + /// + /// Minimal async address space exposing one half of the aggregate Pump tags. + /// + public sealed class FlatTagNodeManager : AsyncCustomNodeManager + { + /// + /// Initializes the node manager. + /// + public FlatTagNodeManager( + IServerInternal server, + FlatTagServerOptions options) + : base(server, options.SourceNamespaceUri) + { + m_options = options ?? throw new ArgumentNullException(nameof(options)); + } + + /// + public override async ValueTask CreateAddressSpaceAsync( + IDictionary> externalReferences, + CancellationToken cancellationToken = default) + { + if (externalReferences is null) + { + throw new ArgumentNullException(nameof(externalReferences)); + } + + if (!externalReferences.TryGetValue( + ObjectIds.ObjectsFolder, + out IList? references)) + { + externalReferences[ObjectIds.ObjectsFolder] = references = []; + } + + ushort namespaceIndex = NamespaceIndexes[0]; + BaseObjectState pump = CreateObject( + null, + namespaceIndex, + "Pump1", + "Pump1", + ReferenceTypeIds.Organizes); + pump.AddReference(ReferenceTypeIds.Organizes, true, ObjectIds.ObjectsFolder); + references.Add(new NodeStateReference( + ReferenceTypeIds.Organizes, + false, + pump.NodeId)); + + BaseObjectState operational = CreateObject( + pump, + namespaceIndex, + "Pump1.Operational", + "Operational"); + BaseObjectState measurements = CreateObject( + operational, + namespaceIndex, + "Pump1.Operational.Measurements", + "Measurements"); + BaseObjectState events = CreateObject( + pump, + namespaceIndex, + "Pump1.Events", + "Events"); + + if (m_options.SourceNamespaceUri == FlatTagServerOptions.SourceANamespaceUri) + { + AddSourceAVariables(namespaceIndex, measurements, events); + } + else + { + AddSourceBVariables(namespaceIndex, measurements, events); + } + + await AddPredefinedNodeAsync(SystemContext, pump, cancellationToken) + .ConfigureAwait(false); + } + + private void AddSourceAVariables( + ushort namespaceIndex, + BaseObjectState measurements, + BaseObjectState events) + { + FlatTagValues values = m_options.Values; + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.DifferentialPressure", + "DifferentialPressure", + DataTypeIds.Double, + Variant.From(values.DifferentialPressure)); + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.FluidTemperature", + "FluidTemperature", + DataTypeIds.Double, + Variant.From(values.FluidTemperature)); + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.MassFlow", + "MassFlow", + DataTypeIds.Double, + Variant.From(values.MassFlow)); + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.Level", + "Level", + DataTypeIds.Double, + Variant.From(values.Level)); + + BaseObjectState supervision = CreateObject( + events, + namespaceIndex, + "Pump1.Events.SupervisionProcessFluid", + "SupervisionProcessFluid"); + CreateVariable( + supervision, + namespaceIndex, + "Pump1.Events.SupervisionProcessFluid.Cavitation", + "Cavitation", + DataTypeIds.Boolean, + Variant.From(values.Cavitation)); + } + + private void AddSourceBVariables( + ushort namespaceIndex, + BaseObjectState measurements, + BaseObjectState events) + { + FlatTagValues values = m_options.Values; + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.BearingTemperature", + "BearingTemperature", + DataTypeIds.Double, + Variant.From(values.BearingTemperature)); + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.PumpPowerInput", + "PumpPowerInput", + DataTypeIds.Double, + Variant.From(values.PumpPowerInput)); + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.PumpEfficiency", + "PumpEfficiency", + DataTypeIds.Double, + Variant.From(values.PumpEfficiency)); + CreateVariable( + measurements, + namespaceIndex, + "Pump1.Operational.Measurements.NumberOfStarts", + "NumberOfStarts", + DataTypeIds.UInt32, + Variant.From(values.NumberOfStarts)); + + BaseObjectState supervision = CreateObject( + events, + namespaceIndex, + "Pump1.Events.SupervisionPumpOperation", + "SupervisionPumpOperation"); + CreateVariable( + supervision, + namespaceIndex, + "Pump1.Events.SupervisionPumpOperation.MotorOverheat", + "MotorOverheat", + DataTypeIds.Boolean, + Variant.From(values.MotorOverheat)); + } + + private static BaseObjectState CreateObject( + NodeState? parent, + ushort namespaceIndex, + string nodeId, + string browseName, + NodeId referenceTypeId = default) + { + var node = new BaseObjectState(parent) + { + SymbolicName = browseName, + ReferenceTypeId = referenceTypeId.IsNull + ? ReferenceTypeIds.HasComponent + : referenceTypeId, + TypeDefinitionId = ObjectTypeIds.BaseObjectType, + NodeId = new NodeId(nodeId, namespaceIndex), + BrowseName = new QualifiedName(browseName, namespaceIndex), + DisplayName = new LocalizedText("en", browseName), + WriteMask = AttributeWriteMask.None, + UserWriteMask = AttributeWriteMask.None, + EventNotifier = EventNotifiers.None + }; + parent?.AddChild(node); + return node; + } + + private static void CreateVariable( + NodeState parent, + ushort namespaceIndex, + string nodeId, + string browseName, + NodeId dataType, + Variant value) + { + var variable = new BaseDataVariableState(parent) + { + SymbolicName = browseName, + ReferenceTypeId = ReferenceTypeIds.HasComponent, + TypeDefinitionId = VariableTypeIds.BaseDataVariableType, + NodeId = new NodeId(nodeId, namespaceIndex), + BrowseName = new QualifiedName(browseName, namespaceIndex), + DisplayName = new LocalizedText("en", browseName), + WriteMask = AttributeWriteMask.None, + UserWriteMask = AttributeWriteMask.None, + DataType = dataType, + ValueRank = ValueRanks.Scalar, + AccessLevel = AccessLevels.CurrentRead, + UserAccessLevel = AccessLevels.CurrentRead, + Historizing = false, + Value = value, + StatusCode = StatusCodes.Good, + Timestamp = DateTime.UtcNow, + OnSimpleReadValueAsync = (_, _, ct) => ReadValueAsync(value, ct) + }; + parent.AddChild(variable); + } + + private static async ValueTask ReadValueAsync( + Variant value, + CancellationToken cancellationToken) + { + await Task.Yield(); + cancellationToken.ThrowIfCancellationRequested(); + return new AttributeSimpleReadResult(ServiceResult.Good, value); + } + + private readonly FlatTagServerOptions m_options; + } +} diff --git a/samples/WotCon/FlatTagServer/FlatTagServer.csproj b/samples/WotCon/FlatTagServer/FlatTagServer.csproj new file mode 100644 index 0000000000..713da69263 --- /dev/null +++ b/samples/WotCon/FlatTagServer/FlatTagServer.csproj @@ -0,0 +1,22 @@ + + + $(AppTargetFrameworks) + Exe + false + FlatTagServer + FlatTagServer + OPC Foundation + Minimal OPC UA source server for the WoT aggregation sample. + Copyright © 2004-2026 OPC Foundation, Inc + enable + true + + + + + + + + + + diff --git a/samples/WotCon/FlatTagServer/FlatTagServerHost.cs b/samples/WotCon/FlatTagServer/FlatTagServerHost.cs new file mode 100644 index 0000000000..c183601460 --- /dev/null +++ b/samples/WotCon/FlatTagServer/FlatTagServerHost.cs @@ -0,0 +1,214 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace FlatTagServer +{ + /// + /// Builds and runs the reusable flat-tag source host. + /// + public static class FlatTagServerHost + { + /// + /// Builds a host from explicit options. + /// + /// + public static IHost Build(FlatTagServerOptions options) + { + if (options is null) + { + throw new ArgumentNullException(nameof(options)); + } + + HostApplicationBuilder builder = Host.CreateApplicationBuilder(); + Configure(builder, options); + return builder.Build(); + } + + /// + /// Builds and runs a host from explicit options. + /// + public static async Task RunAsync( + FlatTagServerOptions options, + CancellationToken cancellationToken = default) + { + using IHost host = Build(options); + await host.RunAsync(cancellationToken).ConfigureAwait(false); + } + + /// + /// Builds and runs a host from command-line configuration. + /// + public static async Task RunAsync( + string[] args, + CancellationToken cancellationToken = default) + { + HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); + FlatTagServerOptions options = FromConfiguration(builder.Configuration); + Configure(builder, options); + using IHost host = builder.Build(); + await host.RunAsync(cancellationToken).ConfigureAwait(false); + } + + private static void Configure( + HostApplicationBuilder builder, + FlatTagServerOptions options) + { + Validate(options); + builder.Logging.ClearProviders(); + builder.Logging.AddConsole(); + builder.Services.AddSingleton(options); + + string endpoint = options.EndpointUrl ?? + $"opc.tcp://{options.Host}:{options.Port}/{options.InstanceName}"; + + builder.Services + .AddOpcUa() + .AddServer(server => + { + server.ApplicationName = options.ApplicationName; + server.ApplicationUri = + $"urn:localhost:OPCFoundation:{options.ApplicationName}:{options.InstanceName}"; + server.ProductUri = "uri:opcfoundation.org:FlatTagServer"; + if (!string.IsNullOrWhiteSpace(options.PkiRoot)) + { + server.PkiRoot = options.PkiRoot; + } + server.AutoAcceptUntrustedCertificates = true; + server.IncludeUnsecurePolicyNone = true; + server.EndpointUrls.Add(endpoint); + }) + .AddNodeManager(); + } + + private static FlatTagServerOptions FromConfiguration(ConfigurationManager configuration) + { + var options = new FlatTagServerOptions + { + EndpointUrl = configuration["endpoint"], + Host = configuration["host"] ?? "localhost", + Port = ReadInt32(configuration, "port", 62551), + SourceNamespaceUri = configuration["namespace"] ?? + FlatTagServerOptions.SourceANamespaceUri, + ApplicationName = configuration["applicationName"] ?? "FlatTagServer", + InstanceName = configuration["instanceName"] ?? "SourceA" + }; + + options.Values.DifferentialPressure = ReadDouble( + configuration, "differentialPressure", options.Values.DifferentialPressure); + options.Values.FluidTemperature = ReadDouble( + configuration, "fluidTemperature", options.Values.FluidTemperature); + options.Values.MassFlow = ReadDouble( + configuration, "massFlow", options.Values.MassFlow); + options.Values.Level = ReadDouble(configuration, "level", options.Values.Level); + options.Values.Cavitation = ReadBoolean( + configuration, "cavitation", options.Values.Cavitation); + options.Values.BearingTemperature = ReadDouble( + configuration, "bearingTemperature", options.Values.BearingTemperature); + options.Values.PumpPowerInput = ReadDouble( + configuration, "pumpPowerInput", options.Values.PumpPowerInput); + options.Values.PumpEfficiency = ReadDouble( + configuration, "pumpEfficiency", options.Values.PumpEfficiency); + options.Values.NumberOfStarts = ReadUInt32( + configuration, "numberOfStarts", options.Values.NumberOfStarts); + options.Values.MotorOverheat = ReadBoolean( + configuration, "motorOverheat", options.Values.MotorOverheat); + return options; + } + + private static void Validate(FlatTagServerOptions options) + { + if (options.SourceNamespaceUri is not FlatTagServerOptions.SourceANamespaceUri and + not FlatTagServerOptions.SourceBNamespaceUri) + { + throw new ArgumentException( + "The source namespace must identify SourceA or SourceB.", + nameof(options)); + } + if (string.IsNullOrWhiteSpace(options.ApplicationName) || + string.IsNullOrWhiteSpace(options.InstanceName)) + { + throw new ArgumentException( + "ApplicationName and InstanceName are required.", + nameof(options)); + } + if (options.EndpointUrl is null && + (string.IsNullOrWhiteSpace(options.Host) || options.Port is < 1 or > 65535)) + { + throw new ArgumentException("A valid host and port are required.", nameof(options)); + } + } + + private static int ReadInt32(ConfigurationManager configuration, string key, int fallback) + { + return int.TryParse( + configuration[key], + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out int value) + ? value + : fallback; + } + + private static uint ReadUInt32(ConfigurationManager configuration, string key, uint fallback) + { + return uint.TryParse( + configuration[key], + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out uint value) + ? value + : fallback; + } + + private static double ReadDouble(ConfigurationManager configuration, string key, double fallback) + { + return double.TryParse( + configuration[key], + NumberStyles.Float, + CultureInfo.InvariantCulture, + out double value) + ? value + : fallback; + } + + private static bool ReadBoolean(ConfigurationManager configuration, string key, bool fallback) + { + return bool.TryParse(configuration[key], out bool value) ? value : fallback; + } + } +} diff --git a/samples/WotCon/FlatTagServer/FlatTagServerOptions.cs b/samples/WotCon/FlatTagServer/FlatTagServerOptions.cs new file mode 100644 index 0000000000..423d50e65c --- /dev/null +++ b/samples/WotCon/FlatTagServer/FlatTagServerOptions.cs @@ -0,0 +1,145 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace FlatTagServer +{ + /// + /// Configures one deterministic flat-tag source server. + /// + public sealed class FlatTagServerOptions + { + /// + /// Source A namespace URI. + /// + public const string SourceANamespaceUri = + "urn:opcfoundation.org:UA:WotAggregation:SourceA"; + + /// + /// Source B namespace URI. + /// + public const string SourceBNamespaceUri = + "urn:opcfoundation.org:UA:WotAggregation:SourceB"; + + /// + /// Gets or sets the endpoint URL. When empty, host, port and instance name are used. + /// + public string? EndpointUrl { get; set; } + + /// + /// Gets or sets the endpoint host. + /// + public string Host { get; set; } = "localhost"; + + /// + /// Gets or sets the endpoint port. + /// + public int Port { get; set; } = 62551; + + /// + /// Gets or sets the source namespace URI. + /// + public string SourceNamespaceUri { get; set; } = SourceANamespaceUri; + + /// + /// Gets or sets the OPC UA application name. + /// + public string ApplicationName { get; set; } = "FlatTagServer"; + + /// + /// Gets or sets the isolated PKI root. + /// + public string? PkiRoot { get; set; } + + /// + /// Gets or sets the endpoint instance name. + /// + public string InstanceName { get; set; } = "SourceA"; + + /// + /// Gets or sets the deterministic values exposed by this source. + /// + public FlatTagValues Values { get; set; } = new(); + } + + /// + /// Deterministic values used by both source instances. + /// + public sealed class FlatTagValues + { + /// + /// Gets or sets the differential pressure. + /// + public double DifferentialPressure { get; set; } = 2.75; + + /// + /// Gets or sets the fluid temperature. + /// + public double FluidTemperature { get; set; } = 315.65; + + /// + /// Gets or sets the mass flow. + /// + public double MassFlow { get; set; } = 0.1825; + + /// + /// Gets or sets the level. + /// + public double Level { get; set; } = 6.75; + + /// + /// Gets or sets the cavitation state. + /// + public bool Cavitation { get; set; } + + /// + /// Gets or sets the bearing temperature. + /// + public double BearingTemperature { get; set; } = 328.4; + + /// + /// Gets or sets the pump power input. + /// + public double PumpPowerInput { get; set; } = 12.5; + + /// + /// Gets or sets the pump efficiency. + /// + public double PumpEfficiency { get; set; } = 88.0; + + /// + /// Gets or sets the number of starts. + /// + public uint NumberOfStarts { get; set; } = 17; + + /// + /// Gets or sets the motor-overheat state. + /// + public bool MotorOverheat { get; set; } + } +} diff --git a/samples/WotCon/FlatTagServer/Program.cs b/samples/WotCon/FlatTagServer/Program.cs new file mode 100644 index 0000000000..bc854817d6 --- /dev/null +++ b/samples/WotCon/FlatTagServer/Program.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using FlatTagServer; + +await FlatTagServerHost.RunAsync(args).ConfigureAwait(false); diff --git a/samples/WotCon/FlatTagServer/Properties/AssemblyInfo.cs b/samples/WotCon/FlatTagServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..7798c9bd57 --- /dev/null +++ b/samples/WotCon/FlatTagServer/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/samples/WotCon/FlatTagServer/README.md b/samples/WotCon/FlatTagServer/README.md new file mode 100644 index 0000000000..962dd72373 --- /dev/null +++ b/samples/WotCon/FlatTagServer/README.md @@ -0,0 +1,5 @@ +# FlatTagServer + +This sample runs one deterministic flat OPC UA source for the WoT aggregation scenario. Start it twice with the Source A and Source B namespace/endpoint options from the [WoT aggregation sample guide](../README.md). + +The server intentionally exposes flat variables rather than a Pumps companion-model hierarchy; the generic aggregation server creates that hierarchy from the checked-in WoT documents. diff --git a/samples/WotCon/README.md b/samples/WotCon/README.md new file mode 100644 index 0000000000..c404762585 --- /dev/null +++ b/samples/WotCon/README.md @@ -0,0 +1,261 @@ +# WoT aggregation sample + +The WoT aggregation sample demonstrates a generic OPC UA server that loads DI, Machinery, Pumps, and Pump-instance shape from WoT Thing Models and a Thing Description, then binds the materialized Pump variables to values read from two independent OPC UA source servers. + +The aggregation server contains no Pump-specific generated code and does not reference the DI, Machinery, or Pumps server/model assemblies. The complete DI/Machinery/Pumps/Pump instance shape is runtime-loaded from the files in [`samples/WotCon/AggregationClient/Documents`](AggregationClient/Documents) through the generic WoT-to-NodeSet converter, runtime NodeSet loader, and target-mapping binding runtime. + +The documents ship with the client because the client is what uploads them. The aggregation server has no build-time or run-time dependency on them: it receives whatever the client writes into the registry. + +## Topology + +There are three long-running server processes: + +```text +FlatTagServer Source A ─┐ + ├─ OPC UA forms ─> AggregationServer +FlatTagServer Source B ─┘ │ + └─ materialized Pump OPC UA address space +``` + +`AggregationClient` is a fourth, short-lived process. It connects to the aggregation server, uploads the checked-in documents, calls `Refresh`, browses the materialized Pump, reads ten values, prints the result, and exits. + +Source A and Source B expose deliberately flat variables. They do not expose a Pump companion-model hierarchy. The aggregation server creates that hierarchy from the WoT documents and routes each materialized variable to its selected upstream source. + +## Prerequisites + +The complete sample requires .NET 8, .NET 9, or .NET 10. `AggregationServer` intentionally targets only `net8.0`, `net9.0`, and `net10.0` because the OPC UA executor required by the checked-in mappings is available only on those frameworks. Legacy `CustomTestTarget` solution builds replace that project with the repository's no-op shell; those matrix builds are not runnable aggregation-server configurations. `FlatTagServer` and `AggregationClient` remain on the shared application target matrix for standalone compatibility, but a runnable end-to-end topology always requires the modern aggregation server. + +Run the commands below from the repository root with the .NET 10 SDK. The samples accept unencrypted anonymous OPC UA connections for local demonstration and auto-accept untrusted certificates; do not copy those security settings into a production deployment. + +## Run the sample + +Start Source A in the first terminal: + +```powershell +dotnet run --project samples\WotCon\FlatTagServer\FlatTagServer.csproj -f net10.0 -- ` + --port 62551 ` + --instanceName SourceA ` + --applicationName FlatTagServerSourceA ` + --namespace urn:opcfoundation.org:UA:WotAggregation:SourceA ` + --differentialPressure 111.25 ` + --fluidTemperature 301.15 ` + --massFlow 0.42 ` + --level 4.25 ` + --cavitation true +``` + +Start Source B in the second terminal: + +```powershell +dotnet run --project samples\WotCon\FlatTagServer\FlatTagServer.csproj -f net10.0 -- ` + --port 62552 ` + --instanceName SourceB ` + --applicationName FlatTagServerSourceB ` + --namespace urn:opcfoundation.org:UA:WotAggregation:SourceB ` + --bearingTemperature 333.15 ` + --pumpPowerInput 17.75 ` + --pumpEfficiency 91.5 ` + --numberOfStarts 23 ` + --motorOverheat true +``` + +Start the generic aggregation server in the third terminal: + +```powershell +dotnet run --project samples\WotCon\AggregationServer\AggregationServer.csproj -f net10.0 -- ` + --port 62550 ` + --applicationName AggregationServer +``` + +Run the loader/client in a fourth terminal after all three servers are listening: + +```powershell +dotnet run --project samples\WotCon\AggregationClient\AggregationClient.csproj -f net10.0 -- ` + --aggregationEndpoint opc.tcp://localhost:62550/AggregationServer ` + --sourceAEndpoint opc.tcp://localhost:62551/SourceA ` + --sourceBEndpoint opc.tcp://localhost:62552/SourceB ` + --documentsDirectory .\samples\WotCon\AggregationClient\Documents +``` + +The client should report four uploaded resources, a successful refresh generation, the recursively browsed Pump hierarchy, and ten Good values. + +## Command-line and programmatic options + +`FlatTagServer` reads the following command-line configuration keys: + +| Key | Default | Meaning | +| --- | --- | --- | +| `endpoint` | unset | Complete endpoint URL; when set, overrides `host`, `port`, and the generated path. | +| `host` | `localhost` | Endpoint host used when `endpoint` is unset. | +| `port` | `62551` | Endpoint port used when `endpoint` is unset. | +| `instanceName` | `SourceA` | Endpoint path and source instance name. | +| `applicationName` | `FlatTagServer` | OPC UA application name. | +| `namespace` | Source A namespace URI | Must be exactly the Source A or Source B namespace URI. | +| `differentialPressure` | `2.75` | Flat source value. | +| `fluidTemperature` | `315.65` | Flat source value. | +| `massFlow` | `0.1825` | Flat source value. | +| `level` | `6.75` | Flat source value. | +| `cavitation` | `false` | Flat source value. | +| `bearingTemperature` | `328.4` | Flat source value. | +| `pumpPowerInput` | `12.5` | Flat source value. | +| `pumpEfficiency` | `88.0` | Flat source value. | +| `numberOfStarts` | `17` | Flat source value. | +| `motorOverheat` | `false` | Flat source value. | + +`AggregationServer` reads `endpoint`, `host` (`localhost`), `port` (`62550`), `applicationName` (`AggregationServer`), and `maximumDocumentBytes` (`33554432`). Its reusable `AggregationServerOptions` additionally exposes `PkiRoot` for programmatic hosts. + +`AggregationClient` reads `aggregationEndpoint`, `sourceAEndpoint`, `sourceBEndpoint`, and `documentsDirectory`. Its reusable `AggregationClientOptions` additionally exposes `ApplicationName` and `PkiRoot` for programmatic and integration-test hosts. + +## Checked-in document set + +[`documents.json`](AggregationClient/Documents/documents.json) declares the sample document set and the dependencies between its entries: + +1. `Opc.Ua.Di.tm.json` as `thingmodels/opc-ua-di`. +2. `Opc.Ua.Machinery.tm.json` as `thingmodels/opc-ua-machinery`, depending on DI. +3. `Opc.Ua.Pumps.tm.json` as `thingmodels/opc-ua-pumps`, depending on DI and Machinery. +4. `SamplePump.td.json` as `thingdescriptions/sample-pump`, depending on all three Thing Models. + +### Upload order is not a server requirement + +The registry accepts documents in any order. Upload order affects only when the Pump becomes visible, never whether it can be materialized: + +* A dependency closure is projected only when it is complete. While a referenced Thing Model is still missing, `WotDependencyGraph` reports the closure as not projectable, `WotMaterializationCoordinator` marks its members failed in the `DependencyResolution` phase, and the previously active generation is retained. Nothing partial is published into the address space. +* As soon as the last missing document arrives, the same closure becomes projectable and the Pump appears in one atomic generation switch. + +The dependency declarations in `documents.json` are therefore a description of the model, not an upload protocol. The manifest is still validated locally before upload, because a manifest that references a document it does not contain, or that contains a cycle, is an authoring error in the sample rather than a legitimate partial upload. + +`WotRegistryClient.LoadDocumentsAsync` additionally guarantees that Thing Models are processed before Thing Descriptions while preserving the caller's relative order within each document kind. + +### Progress while a closure is incomplete + +Both refresh models are valid, and the sample shows the second one: + +* **`AutoRefresh = true` (registry default).** Every upload triggers a refresh, so a client can watch the closure fill in. Members of an incomplete closure raise `WoTLoadFailureEventType` with `LoadState` and a `DependencyResolution` reason naming the unresolved reference, and each completed pass raises `WoTRefreshCompletedEventType` with its summary and generation. Subscribing to the registry object therefore yields per-document progress and status until the closure completes. +* **`AutoRefresh = false`.** No intermediate projections and no intermediate events. The caller uploads everything and then triggers exactly one `Refresh`. + +## Endpoint placeholder substitution + +The checked-in Pump TD is portable and contains `${SOURCE_A_ENDPOINT}` and `${SOURCE_B_ENDPOINT}` placeholders. `AggregationClientRunner.LoadDocumentsAsync` substitutes the two endpoint options only in `SamplePump.td.json` immediately before upload. The checked-in file remains environment-independent, and no generated file is written back to the repository. + +Each property form also contains a portable upstream `uav:id` using the source server's `nsu=` namespace URI. The property affordance contains a separate `uav:mapToNodeId` using the materialized Pump-instance namespace. The form therefore describes where to read, while the affordance describes where the value belongs in the aggregate model. + +## Registry upload and Refresh + +The client creates a `WotRegistryClient` through `AddWotRegistryClient`, loads the four `WotRegistryDocument` values, and calls: + +```csharp +WotRegistryBulkLoadResult loadResult = await client.LoadDocumentsAsync( + documents, + refresh: true, + requestId: Guid.NewGuid().ToString("N"), + ct: cancellationToken); +``` + +For each document, the registry client get-or-creates the correct Thing Model or Thing Description group, get-or-creates the resource, and uploads a new version through the inherited OPC UA `FileType` transfer. With `refresh: true`, it then calls `RefreshAllAsync`. The aggregation server validates dependencies, converts each document closure to NodeSet2, prepares its binding plans, imports the NodeSets, wires the OPC UA target mappings, and publishes the new generation. + +The sample aggregation server sets `AutoRefresh = false` so the four uploads do not cause four intermediate projections. The explicit final `Refresh` activates one complete dependency closure. A deployment that wants live progress instead leaves `AutoRefresh` at its default `true` and consumes the events described above. + +## Pump companion-model shape + +The materialized namespace is `urn:opcfoundation.org:UA:WotAggregation:PumpInstance`, with root `Pump1`. The end-to-end test verifies that the runtime-loaded hierarchy and type definitions comply with the checked-in companion models: + +* `Pump1` has the Pumps `PumpType` definition. +* `Pump1.Identification` uses its DI type definition. +* `Operational`, `Operational.Measurements`, `Events`, `Events.SupervisionProcessFluid`, and `Events.SupervisionPumpOperation` use their Pumps type definitions. +* The hierarchy contains Identification, Operational, Events, and Maintenance groups. +* Measurements contain DifferentialPressure, FluidTemperature, BearingTemperature, PumpPowerInput, MassFlow, PumpEfficiency, Level, and NumberOfStarts. +* Event supervision groups contain Cavitation and MotorOverheat variables. + +These nodes are not compiled into `AggregationServer`. They are produced from the DI, Machinery, Pumps, and Sample Pump WoT documents at runtime. + +## Values from both sources + +The Pump TD routes five properties to each source: + +| Materialized Pump property | Upstream source | +| --- | --- | +| DifferentialPressure | Source A | +| FluidTemperature | Source A | +| MassFlow | Source A | +| Level | Source A | +| Cavitation | Source A | +| BearingTemperature | Source B | +| PumpPowerInput | Source B | +| PumpEfficiency | Source B | +| NumberOfStarts | Source B | +| MotorOverheat | Source B | + +With the commands above, the output should include Source A values such as `DifferentialPressure = 111.25` and Source B values such as `BearingTemperature = 333.15`. Every value is read through the aggregation server's local Pump NodeId, not directly from the source server by the sample client. + +## Local monitored items + +The target-mapping runtime wires the materialized variables to async read handlers. Local OPC UA monitored items on the aggregation server sample those handlers, so creating a monitored item for `Pump1.Operational.Measurements.DifferentialPressure` reads Source A through the same compiled form and lazy OPC UA channel used by an ordinary Read. + +The runtime does not create a second upstream observation bridge for the form's `observeproperty` operation. This keeps local sampling under the aggregation server's subscription engine and avoids duplicate upstream subscriptions. + +The integration test creates a real subscription and monitored item with a 50 ms requested sampling interval, publishes the initial Source A differential-pressure value, and keeps that monitored item alive across a generation replacement. + +## Version replacement and shadow drain + +Uploading another version of `sample-pump` and calling `RefreshAllAsync` creates a shadow runtime NodeSet generation. The new generation becomes the target for new reads and monitored items without disconnecting clients. Existing monitored items remain attached to the old generation until they are deleted or otherwise drain. + +[`WotSampleEndToEndTests.cs`](../../tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEndToEndTests.cs) demonstrates this by changing the DifferentialPressure mapping to read Source B's BearingTemperature, uploading the new Pump TD version, and refreshing. A normal read after the switch returns the Source B value from the new generation. The already-existing monitored item can still publish the Source A value from the retired generation. After that subscription is deleted and the retired generation drains, subsequent reads continue against the new Source B mapping. + +If conversion, mapping resolution, channel wiring, or shadow activation fails, the previous active generation remains in service and the failed refresh reports per-resource diagnostics. + +## Troubleshooting + +### The client cannot connect + +Verify that all three server processes are listening and that the client endpoint paths exactly match `/SourceA`, `/SourceB`, and `/AggregationServer`. The generic-host command-line syntax requires the `--` separator after `dotnet run` options. + +### The source namespace is rejected + +`FlatTagServer` accepts only `urn:opcfoundation.org:UA:WotAggregation:SourceA` or `urn:opcfoundation.org:UA:WotAggregation:SourceB`. Use the matching namespace and endpoint placeholder for each process. + +### The manifest fails before upload + +`documents.json contains a missing or cyclic dependency` means a `dependsOn` id is absent, duplicated, or cyclic. Keep resource ids unique and preserve the DI → Machinery → Pumps → Pump TD dependency graph. + +### Refresh reports a document failure + +Inspect the printed resource phase, outcome, and message. Invalid JSON fails format validation. A malformed or unresolved `uav:mapToNodeId` fails activation. A missing upstream server normally allows upload and projection but causes a mapped Read to fail when its lazy channel first connects. + +### Reads return `BadNodeIdUnknown` or `BadNodeIdInvalid` + +Check both NodeIds in the Pump TD. The form's `uav:id` must use the correct Source A or Source B namespace URI and source variable id. The affordance's `uav:mapToNodeId` must use the Pump-instance namespace and a node created by the runtime-loaded documents. Prefer `nsu=` to numeric namespace indexes. + +### Values appear to come from the wrong source + +Check the endpoint placeholder assignment first, then inspect the property form's upstream `uav:id`. The five Source A and five Source B assignments are listed above. The aggregation client prints stable materialized property names, so a wrong value usually indicates a TD form mapping rather than a browse problem. + +### A replaced value is still observed + +An existing monitored item intentionally remains on the retired generation until it drains. Create a new monitored item or delete the old subscription to observe the replacement generation immediately. Ordinary reads after the successful shadow switch use the new generation. + +## Run the integration tests + +The real sample tests launch all three servers in process with isolated ports and PKI roots: + +```powershell +dotnet test Tests\Opc.Ua.WotCon.Samples.Tests\Opc.Ua.WotCon.Samples.Tests.csproj -f net10.0 --filter "Category=Samples" +``` + +The suite covers successful upload and refresh, companion-model hierarchy, values from both sources, local monitored items, version replacement and shadow drain, invalid documents, missing manifest dependencies, invalid target mappings, and unavailable upstream endpoints. + +## NativeAOT publishing + +All three server/client sample projects set `PublishAot` for `net10.0`. Publish each process for the target runtime identifier; for Windows x64: + +```powershell +dotnet publish samples\WotCon\FlatTagServer\FlatTagServer.csproj -c Release -f net10.0 -r win-x64 --self-contained true +dotnet publish samples\WotCon\AggregationServer\AggregationServer.csproj -c Release -f net10.0 -r win-x64 --self-contained true +dotnet publish samples\WotCon\AggregationClient\AggregationClient.csproj -c Release -f net10.0 -r win-x64 --self-contained true +``` + +Use the published `FlatTagServer.exe` twice with the Source A and Source B arguments above. The client project includes the checked-in `Documents` tree in its publish output, so omit `--documentsDirectory` to use `\Documents` or pass an explicit external copy. + +## Related documentation + +* [WoT protocol bindings](../../docs/WotBindings.md) +* [WoT Connectivity model, server, registry, and client](../../docs/WoTConnectivity.md) diff --git a/src/Opc.Ua.Di.Server/DiNodeManager.cs b/src/Opc.Ua.Di.Server/DiNodeManager.cs index 8bb776d036..3347d24b98 100644 --- a/src/Opc.Ua.Di.Server/DiNodeManager.cs +++ b/src/Opc.Ua.Di.Server/DiNodeManager.cs @@ -761,6 +761,19 @@ internal NodeManagerBuilder GetOrCreateBuilder() } } return results; + }, + dataTypeId => + { + var results = new List(); + foreach (NodeState node in PredefinedNodes.Values) + { + if (node is BaseVariableState variable && + variable.DataType == dataTypeId) + { + results.Add(node); + } + } + return new ArrayOf(results.ToArray()); }); AttachToBuilder(m_builder); diff --git a/src/Opc.Ua.ISA95/Design/Common/Opc.ISA95.NodeIds.csv b/src/Opc.Ua.ISA95/Design/Common/Opc.ISA95.NodeIds.csv index 9c61e59342..7fcfd943c9 100644 --- a/src/Opc.Ua.ISA95/Design/Common/Opc.ISA95.NodeIds.csv +++ b/src/Opc.Ua.ISA95/Design/Common/Opc.ISA95.NodeIds.csv @@ -163,71 +163,71 @@ Opc_ISA95_ISA95AssetAssignmentDataType,4970,Variable ISA95AssetAssignmentDataType_Encoding_DefaultBinary,4973,Object Opc_ISA95_ISA95AssetAssignmentDataType_4974,4974,Variable QualificationTestSpecificationType,4977,ObjectType -PersonnelClassPropertyType_xPropertyName_,4979,Variable -PersonnelClassPropertyType_xTestSpecification_,4981,Object -PersonnelClassPropertyType_xTestSpecification__Version,4982,Variable +PersonnelClassPropertyType_PropertyName_Placeholder,4979,Variable +PersonnelClassPropertyType_TestSpecification_Placeholder,4981,Object +PersonnelClassPropertyType_TestSpecification_Placeholder_Version,4982,Variable PersonnelClassType,4996,ObjectType -PersonnelClassType_xPropertyName_,4997,Variable -PersonnelClassType_xTestSpecification_,4999,Object -PersonnelClassType_xTestSpecification__Version,5000,Variable +PersonnelClassType_PropertyName_Placeholder,4997,Variable +PersonnelClassType_TestSpecification_Placeholder,4999,Object +PersonnelClassType_TestSpecification_Placeholder_Version,5000,Variable EquipmentCapabilityTestResultType,5008,VariableType EquipmentCapabilityTestSpecificationType,5015,ObjectType EquipmentClassPropertyType,5017,VariableType -EquipmentClassPropertyType_xPropertyName_,5019,Variable -EquipmentClassPropertyType_xTestSpecification_,5021,Object -EquipmentClassPropertyType_xTestSpecification__Version,5022,Variable -EquipmentPropertyType_xPropertyName_,5023,Variable -EquipmentPropertyType_xTestSpecification_,5025,Object -EquipmentPropertyType_xTestSpecification__Version,5026,Variable -EquipmentPropertyType_xTestResult_,5027,Variable -EquipmentPropertyType_xTestResult__Id,5028,Variable -EquipmentPropertyType_xTestResult__ResultDescription,5029,Variable -EquipmentPropertyType_xTestResult__TestDate,5030,Variable -EquipmentPropertyType_xTestResult__Result,5031,Variable -EquipmentPropertyType_xTestResult__ResultUnitOfMeasure,5032,Variable -EquipmentPropertyType_xTestResult__Expiration,5033,Variable +EquipmentClassPropertyType_PropertyName_Placeholder,5019,Variable +EquipmentClassPropertyType_TestSpecification_Placeholder,5021,Object +EquipmentClassPropertyType_TestSpecification_Placeholder_Version,5022,Variable +EquipmentPropertyType_PropertyName_Placeholder,5023,Variable +EquipmentPropertyType_TestSpecification_Placeholder,5025,Object +EquipmentPropertyType_TestSpecification_Placeholder_Version,5026,Variable +EquipmentPropertyType_TestResult_Placeholder,5027,Variable +EquipmentPropertyType_TestResult_Placeholder_Id,5028,Variable +EquipmentPropertyType_TestResult_Placeholder_ResultDescription,5029,Variable +EquipmentPropertyType_TestResult_Placeholder_TestDate,5030,Variable +EquipmentPropertyType_TestResult_Placeholder_Result,5031,Variable +EquipmentPropertyType_TestResult_Placeholder_ResultUnitOfMeasure,5032,Variable +EquipmentPropertyType_TestResult_Placeholder_Expiration,5033,Variable EquipmentClassType,5034,ObjectType -EquipmentClassType_xPropertyName_,5035,Variable -EquipmentClassType_xTestSpecification_,5037,Object -EquipmentClassType_xTestSpecification__Version,5038,Variable +EquipmentClassType_PropertyName_Placeholder,5035,Variable +EquipmentClassType_TestSpecification_Placeholder,5037,Object +EquipmentClassType_TestSpecification_Placeholder_Version,5038,Variable EquipmentClassType_EquipmentLevel,5039,Variable EquipmentType,5040,ObjectType -EquipmentType_xPropertyName_,5041,Variable -EquipmentType_xEquipmentClass_,5043,Object -EquipmentType_xTestSpecification_,5045,Object -EquipmentType_xTestSpecification__Version,5046,Variable +EquipmentType_PropertyName_Placeholder,5041,Variable +EquipmentType_EquipmentClass_Placeholder,5043,Object +EquipmentType_TestSpecification_Placeholder,5045,Object +EquipmentType_TestSpecification_Placeholder_Version,5046,Variable EquipmentType_EquipmentLevel,5047,Variable GeoSpatialLocationType,5048,VariableType CompanyType,5049,VariableType PhysicalAssetCapabilityTestResultType,5050,VariableType PhysicalAssetCapabilityTestSpecificationType,5057,ObjectType PhysicalAssetClassPropertyType,5059,VariableType -PhysicalAssetClassPropertyType_xPropertyName_,5061,Variable -PhysicalAssetClassPropertyType_xTestSpecification_,5063,Object -PhysicalAssetClassPropertyType_xTestSpecification__Version,5064,Variable +PhysicalAssetClassPropertyType_PropertyName_Placeholder,5061,Variable +PhysicalAssetClassPropertyType_TestSpecification_Placeholder,5063,Object +PhysicalAssetClassPropertyType_TestSpecification_Placeholder_Version,5064,Variable PhysicalAssetPropertyType,5065,VariableType -PhysicalAssetPropertyType_xPropertyName_,5067,Variable -PhysicalAssetPropertyType_xTestSpecification_,5069,Object -PhysicalAssetPropertyType_xTestSpecification__Version,5070,Variable -PhysicalAssetPropertyType_xTestResult_,5071,Variable -PhysicalAssetPropertyType_xTestResult__Id,5072,Variable -PhysicalAssetPropertyType_xTestResult__ResultDescription,5073,Variable -PhysicalAssetPropertyType_xTestResult__TestDate,5074,Variable -PhysicalAssetPropertyType_xTestResult__Result,5075,Variable -PhysicalAssetPropertyType_xTestResult__ResultUnitOfMeasure,5076,Variable -PhysicalAssetPropertyType_xTestResult__Expiration,5077,Variable +PhysicalAssetPropertyType_PropertyName_Placeholder,5067,Variable +PhysicalAssetPropertyType_TestSpecification_Placeholder,5069,Object +PhysicalAssetPropertyType_TestSpecification_Placeholder_Version,5070,Variable +PhysicalAssetPropertyType_TestResult_Placeholder,5071,Variable +PhysicalAssetPropertyType_TestResult_Placeholder_Id,5072,Variable +PhysicalAssetPropertyType_TestResult_Placeholder_ResultDescription,5073,Variable +PhysicalAssetPropertyType_TestResult_Placeholder_TestDate,5074,Variable +PhysicalAssetPropertyType_TestResult_Placeholder_Result,5075,Variable +PhysicalAssetPropertyType_TestResult_Placeholder_ResultUnitOfMeasure,5076,Variable +PhysicalAssetPropertyType_TestResult_Placeholder_Expiration,5077,Variable PhysicalAssetClassType,5078,ObjectType -PhysicalAssetClassType_xPropertyName_,5079,Variable -PhysicalAssetClassType_xTestSpecification_,5081,Object -PhysicalAssetClassType_xTestSpecification__Version,5082,Variable +PhysicalAssetClassType_PropertyName_Placeholder,5079,Variable +PhysicalAssetClassType_TestSpecification_Placeholder,5081,Object +PhysicalAssetClassType_TestSpecification_Placeholder_Version,5082,Variable PhysicalAssetClassType_Manufacturer,5083,Variable PhysicalAssetClassType_ModelNumber,5084,Variable PhysicalAssetType,5085,ObjectType -PhysicalAssetType_xPropertyName_,5086,Variable +PhysicalAssetType_PropertyName_Placeholder,5086,Variable PhysicalAssetType_PhysicalAssetClass,5088,Object -PhysicalAssetType_xTestSpecification_,5091,Object -PhysicalAssetType_xTestSpecification__Version,5092,Variable -EquipmentType_xPhysicalAsset_,5093,Object +PhysicalAssetType_TestSpecification_Placeholder,5091,Object +PhysicalAssetType_TestSpecification_Placeholder_Version,5092,Variable +EquipmentType_PhysicalAsset_Placeholder,5093,Object ISA95TestResultNonEUType,5094,VariableType ISA95TestResultNonEUType_ResultUnitOfMeasure,5099,Variable ISA95TestResultEUType,5101,VariableType @@ -242,147 +242,147 @@ MadeUpOfEquipment,5115,ReferenceType MadeUpOfPhysicalAsset,5116,ReferenceType MadeUpOfMaterialSublot,5117,ReferenceType PersonPropertyType,5118,VariableType -PersonPropertyType_xPropertyName_,5120,Variable -PersonPropertyType_xTestSpecification_,5122,Object -PersonPropertyType_xTestSpecification__Version,5123,Variable -PersonPropertyType_xTestResult_,5124,Variable -PersonPropertyType_xTestResult__Id,5125,Variable -PersonPropertyType_xTestResult__ResultDescription,5126,Variable -PersonPropertyType_xTestResult__TestDate,5127,Variable -PersonPropertyType_xTestResult__Result,5128,Variable -PersonPropertyType_xTestResult__ResultUnitOfMeasure,5129,Variable -PersonPropertyType_xTestResult__Expiration,5130,Variable +PersonPropertyType_PropertyName_Placeholder,5120,Variable +PersonPropertyType_TestSpecification_Placeholder,5122,Object +PersonPropertyType_TestSpecification_Placeholder_Version,5123,Variable +PersonPropertyType_TestResult_Placeholder,5124,Variable +PersonPropertyType_TestResult_Placeholder_Id,5125,Variable +PersonPropertyType_TestResult_Placeholder_ResultDescription,5126,Variable +PersonPropertyType_TestResult_Placeholder_TestDate,5127,Variable +PersonPropertyType_TestResult_Placeholder_Result,5128,Variable +PersonPropertyType_TestResult_Placeholder_ResultUnitOfMeasure,5129,Variable +PersonPropertyType_TestResult_Placeholder_Expiration,5130,Variable PersonType,5131,ObjectType -PersonType_xPropertyName_,5132,Variable -PersonType_xTestSpecification_,5134,Object -PersonType_xTestSpecification__Version,5135,Variable -PhysicalAssetType_xPhysicalAsset_,5136,Object -PhysicalAssetType_xPhysicalAsset__PhysicalLocation,5137,Variable +PersonType_PropertyName_Placeholder,5132,Variable +PersonType_TestSpecification_Placeholder,5134,Object +PersonType_TestSpecification_Placeholder_Version,5135,Variable +PhysicalAssetType_PhysicalAsset_Placeholder,5136,Object +PhysicalAssetType_PhysicalAsset_Placeholder_PhysicalLocation,5137,Variable PhysicalAssetType_PhysicalLocation,5138,Variable -EquipmentType_xEquipment_,5144,Object -EquipmentType_xEquipment__EquipmentLevel,5145,Variable -EquipmentType_xEquipment__xPhysicalAsset_,5146,Object -PhysicalAssetType_xPhysicalAsset__PhysicalAssetClass,5148,Object -PhysicalAssetType_xPhysicalAsset__FixedAssetId,5151,Variable -PhysicalAssetType_xPhysicalAsset__VendorId,5152,Variable +EquipmentType_Equipment_Placeholder,5144,Object +EquipmentType_Equipment_Placeholder_EquipmentLevel,5145,Variable +EquipmentType_Equipment_Placeholder_PhysicalAsset_Placeholder,5146,Object +PhysicalAssetType_PhysicalAsset_Placeholder_PhysicalAssetClass,5148,Object +PhysicalAssetType_PhysicalAsset_Placeholder_FixedAssetId,5151,Variable +PhysicalAssetType_PhysicalAsset_Placeholder_VendorId,5152,Variable PhysicalAssetType_FixedAssetId,5153,Variable PhysicalAssetType_VendorId,5154,Variable MaterialTestResultType,5165,VariableType MaterialTestSpecificationType,5172,ObjectType MaterialDefinitionPropertyType,5174,VariableType -MaterialDefinitionPropertyType_xPropertyName_,5176,Variable -MaterialDefinitionPropertyType_xTestSpecification_,5178,Object -MaterialDefinitionPropertyType_xTestSpecification__Version,5179,Variable +MaterialDefinitionPropertyType_PropertyName_Placeholder,5176,Variable +MaterialDefinitionPropertyType_TestSpecification_Placeholder,5178,Object +MaterialDefinitionPropertyType_TestSpecification_Placeholder_Version,5179,Variable MaterialClassPropertyType,5180,VariableType -MaterialClassPropertyType_xPropertyName_,5182,Variable -MaterialClassPropertyType_xTestSpecification_,5184,Object -MaterialClassPropertyType_xTestSpecification__Version,5185,Variable +MaterialClassPropertyType_PropertyName_Placeholder,5182,Variable +MaterialClassPropertyType_TestSpecification_Placeholder,5184,Object +MaterialClassPropertyType_TestSpecification_Placeholder_Version,5185,Variable MaterialLotPropertyType,5186,VariableType -MaterialLotPropertyType_xTestResult_,5193,Variable -MaterialLotPropertyType_xTestResult__Id,5194,Variable -MaterialLotPropertyType_xTestResult__ResultDescription,5195,Variable -MaterialLotPropertyType_xTestResult__TestDate,5196,Variable -MaterialLotPropertyType_xTestResult__Result,5197,Variable -MaterialLotPropertyType_xTestResult__ResultUnitOfMeasure,5198,Variable -MaterialLotPropertyType_xTestResult__Expiration,5199,Variable -MaterialLotPropertyType_xPropertyName_,5200,Variable -MaterialLotPropertyType_xPropertyName__Id,5201,Variable -MaterialLotPropertyType_xPropertyName__ResultDescription,5202,Variable -MaterialLotPropertyType_xPropertyName__TestDate,5203,Variable -MaterialLotPropertyType_xPropertyName__Result,5204,Variable -MaterialLotPropertyType_xPropertyName__ResultUnitOfMeasure,5205,Variable -MaterialLotPropertyType_xPropertyName__Expiration,5206,Variable -MaterialLotPropertyType_xTestSpecification_,5207,Object -MaterialLotPropertyType_xTestSpecification__Version,5208,Variable +MaterialLotPropertyType_TestResult_Placeholder,5193,Variable +MaterialLotPropertyType_TestResult_Placeholder_Id,5194,Variable +MaterialLotPropertyType_TestResult_Placeholder_ResultDescription,5195,Variable +MaterialLotPropertyType_TestResult_Placeholder_TestDate,5196,Variable +MaterialLotPropertyType_TestResult_Placeholder_Result,5197,Variable +MaterialLotPropertyType_TestResult_Placeholder_ResultUnitOfMeasure,5198,Variable +MaterialLotPropertyType_TestResult_Placeholder_Expiration,5199,Variable +MaterialLotPropertyType_PropertyName_Placeholder,5200,Variable +MaterialLotPropertyType_PropertyName_Placeholder_Id,5201,Variable +MaterialLotPropertyType_PropertyName_Placeholder_ResultDescription,5202,Variable +MaterialLotPropertyType_PropertyName_Placeholder_TestDate,5203,Variable +MaterialLotPropertyType_PropertyName_Placeholder_Result,5204,Variable +MaterialLotPropertyType_PropertyName_Placeholder_ResultUnitOfMeasure,5205,Variable +MaterialLotPropertyType_PropertyName_Placeholder_Expiration,5206,Variable +MaterialLotPropertyType_TestSpecification_Placeholder,5207,Object +MaterialLotPropertyType_TestSpecification_Placeholder_Version,5208,Variable MaterialClassType,5209,ObjectType -MaterialClassType_xPropertyName_,5210,Variable -MaterialClassType_xTestSpecification_,5212,Object -MaterialClassType_xTestSpecification__Version,5213,Variable -MaterialClassType_xAssemblyClass_,5214,Object -MaterialClassType_xAssemblyClass__AssemblyType,5215,Variable -MaterialClassType_xAssemblyClass__AssemblyRelationship,5216,Variable +MaterialClassType_PropertyName_Placeholder,5210,Variable +MaterialClassType_TestSpecification_Placeholder,5212,Object +MaterialClassType_TestSpecification_Placeholder_Version,5213,Variable +MaterialClassType_AssemblyClass_Placeholder,5214,Object +MaterialClassType_AssemblyClass_Placeholder_AssemblyType,5215,Variable +MaterialClassType_AssemblyClass_Placeholder_AssemblyRelationship,5216,Variable MaterialClassType_AssemblyType,5217,Variable MaterialClassType_AssemblyRelationship,5218,Variable MaterialDefinitionType,5219,ObjectType -MaterialDefinitionType_xPropertyName_,5220,Variable -MaterialDefinitionType_xTestSpecification_,5222,Object -MaterialDefinitionType_xTestSpecification__Version,5223,Variable -MaterialDefinitionType_xMaterialClass_,5224,Object -MaterialDefinitionType_xAssemblyClass_,5227,Object -MaterialDefinitionType_xAssemblyClass__AssemblyType,5228,Variable -MaterialDefinitionType_xAssemblyClass__AssemblyRelationship,5229,Variable +MaterialDefinitionType_PropertyName_Placeholder,5220,Variable +MaterialDefinitionType_TestSpecification_Placeholder,5222,Object +MaterialDefinitionType_TestSpecification_Placeholder_Version,5223,Variable +MaterialDefinitionType_MaterialClass_Placeholder,5224,Object +MaterialDefinitionType_AssemblyClass_Placeholder,5227,Object +MaterialDefinitionType_AssemblyClass_Placeholder_AssemblyType,5228,Variable +MaterialDefinitionType_AssemblyClass_Placeholder_AssemblyRelationship,5229,Variable MaterialDefinitionType_AssemblyType,5230,Variable MaterialDefinitionType_AssemblyRelationship,5231,Variable MaterialLotType,5232,ObjectType -MaterialLotType_xPropertyName_,5233,Variable -MaterialLotType_xPropertyName__Id,5234,Variable -MaterialLotType_xPropertyName__ResultDescription,5235,Variable -MaterialLotType_xPropertyName__TestDate,5236,Variable -MaterialLotType_xPropertyName__Result,5237,Variable -MaterialLotType_xPropertyName__ResultUnitOfMeasure,5238,Variable -MaterialLotType_xPropertyName__Expiration,5239,Variable -MaterialLotType_xTestSpecification_,5240,Object -MaterialLotType_xTestSpecification__Version,5241,Variable -MaterialLotType_xMaterialDefinition_,5242,Object -MaterialLotType_xAssemblyLot_,5245,Object -MaterialLotType_xAssemblyLot__xMaterialDefinition_,5246,Object -MaterialLotType_xAssemblyLot__AssemblyType,5249,Variable -MaterialLotType_xAssemblyLot__AssemblyRelationship,5250,Variable -MaterialLotType_xAssemblyLot__Status,5251,Variable -MaterialLotType_xAssemblyLot__StorageLocation,5252,Variable -MaterialLotType_xAssemblyLot__Quantity,5253,Variable +MaterialLotType_PropertyName_Placeholder,5233,Variable +MaterialLotType_PropertyName_Placeholder_Id,5234,Variable +MaterialLotType_PropertyName_Placeholder_ResultDescription,5235,Variable +MaterialLotType_PropertyName_Placeholder_TestDate,5236,Variable +MaterialLotType_PropertyName_Placeholder_Result,5237,Variable +MaterialLotType_PropertyName_Placeholder_ResultUnitOfMeasure,5238,Variable +MaterialLotType_PropertyName_Placeholder_Expiration,5239,Variable +MaterialLotType_TestSpecification_Placeholder,5240,Object +MaterialLotType_TestSpecification_Placeholder_Version,5241,Variable +MaterialLotType_MaterialDefinition_Placeholder,5242,Object +MaterialLotType_AssemblyLot_Placeholder,5245,Object +MaterialLotType_AssemblyLot_Placeholder_MaterialDefinition_Placeholder,5246,Object +MaterialLotType_AssemblyLot_Placeholder_AssemblyType,5249,Variable +MaterialLotType_AssemblyLot_Placeholder_AssemblyRelationship,5250,Variable +MaterialLotType_AssemblyLot_Placeholder_Status,5251,Variable +MaterialLotType_AssemblyLot_Placeholder_StorageLocation,5252,Variable +MaterialLotType_AssemblyLot_Placeholder_Quantity,5253,Variable MaterialLotType_AssemblyType,5254,Variable MaterialLotType_AssemblyRelationship,5255,Variable MaterialLotType_Status,5256,Variable MaterialLotType_StorageLocation,5257,Variable MaterialLotType_Quantity,5258,Variable MaterialSublotType,5259,ObjectType -MaterialSublotType_xPropertyName_,5260,Variable -MaterialSublotType_xPropertyName__Id,5261,Variable -MaterialSublotType_xPropertyName__ResultDescription,5262,Variable -MaterialSublotType_xPropertyName__TestDate,5263,Variable -MaterialSublotType_xPropertyName__Result,5264,Variable -MaterialSublotType_xPropertyName__ResultUnitOfMeasure,5265,Variable -MaterialSublotType_xPropertyName__Expiration,5266,Variable -MaterialSublotType_xTestSpecification_,5267,Object -MaterialSublotType_xTestSpecification__Version,5268,Variable -MaterialSublotType_xAssemblyLot_,5269,Object -MaterialSublotType_xAssemblySublot_,5278,Object -MaterialSublotType_xAssemblySublot__AssemblyType,5279,Variable -MaterialSublotType_xAssemblySublot__AssemblyRelationship,5280,Variable -MaterialSublotType_xAssemblySublot__Status,5281,Variable -MaterialSublotType_xAssemblySublot__StorageLocation,5282,Variable -MaterialSublotType_xAssemblySublot__Quantity,5283,Variable +MaterialSublotType_PropertyName_Placeholder,5260,Variable +MaterialSublotType_PropertyName_Placeholder_Id,5261,Variable +MaterialSublotType_PropertyName_Placeholder_ResultDescription,5262,Variable +MaterialSublotType_PropertyName_Placeholder_TestDate,5263,Variable +MaterialSublotType_PropertyName_Placeholder_Result,5264,Variable +MaterialSublotType_PropertyName_Placeholder_ResultUnitOfMeasure,5265,Variable +MaterialSublotType_PropertyName_Placeholder_Expiration,5266,Variable +MaterialSublotType_TestSpecification_Placeholder,5267,Object +MaterialSublotType_TestSpecification_Placeholder_Version,5268,Variable +MaterialSublotType_AssemblyLot_Placeholder,5269,Object +MaterialSublotType_AssemblySublot_Placeholder,5278,Object +MaterialSublotType_AssemblySublot_Placeholder_AssemblyType,5279,Variable +MaterialSublotType_AssemblySublot_Placeholder_AssemblyRelationship,5280,Variable +MaterialSublotType_AssemblySublot_Placeholder_Status,5281,Variable +MaterialSublotType_AssemblySublot_Placeholder_StorageLocation,5282,Variable +MaterialSublotType_AssemblySublot_Placeholder_Quantity,5283,Variable MaterialSublotType_AssemblyType,5284,Variable MaterialSublotType_AssemblyRelationship,5285,Variable -MaterialSublotType_xSublot_,5286,Object -MaterialSublotType_xSublot__AssemblyType,5287,Variable -MaterialSublotType_xSublot__AssemblyRelationship,5288,Variable -MaterialSublotType_xSublot__Status,5289,Variable -MaterialSublotType_xSublot__StorageLocation,5290,Variable -MaterialSublotType_xSublot__Quantity,5291,Variable +MaterialSublotType_Sublot_Placeholder,5286,Object +MaterialSublotType_Sublot_Placeholder_AssemblyType,5287,Variable +MaterialSublotType_Sublot_Placeholder_AssemblyRelationship,5288,Variable +MaterialSublotType_Sublot_Placeholder_Status,5289,Variable +MaterialSublotType_Sublot_Placeholder_StorageLocation,5290,Variable +MaterialSublotType_Sublot_Placeholder_Quantity,5291,Variable MaterialSublotType_Status,5292,Variable MaterialSublotType_StorageLocation,5293,Variable MaterialSublotType_Quantity,5294,Variable -MaterialLotType_xAssemblySublot_,5295,Object +MaterialLotType_AssemblySublot_Placeholder,5295,Object DefinedByMaterialClass,5300,ReferenceType DefinedByMaterialDefinition,5301,ReferenceType -PersonType_xPersonnelClass_,5302,Object -PhysicalAssetType_xPhysicalAsset__AssetAssignment,5303,Variable -PhysicalAssetType_xPhysicalAsset__AssetAssignment_Id,5304,Variable -PhysicalAssetType_xPhysicalAsset__AssetAssignment_AssignmentDescription,5305,Variable -PhysicalAssetType_xPhysicalAsset__AssetAssignment_StartTime,5306,Variable -PhysicalAssetType_xPhysicalAsset__AssetAssignment_StopTime,5307,Variable +PersonType_PersonnelClass_Placeholder,5302,Object +PhysicalAssetType_PhysicalAsset_Placeholder_AssetAssignment,5303,Variable +PhysicalAssetType_PhysicalAsset_Placeholder_AssetAssignment_Id,5304,Variable +PhysicalAssetType_PhysicalAsset_Placeholder_AssetAssignment_AssignmentDescription,5305,Variable +PhysicalAssetType_PhysicalAsset_Placeholder_AssetAssignment_StartTime,5306,Variable +PhysicalAssetType_PhysicalAsset_Placeholder_AssetAssignment_StopTime,5307,Variable PhysicalAssetType_AssetAssignment,5308,Variable PhysicalAssetType_AssetAssignment_Id,5309,Variable PhysicalAssetType_AssetAssignment_AssignmentDescription,5310,Variable PhysicalAssetType_AssetAssignment_StartTime,5311,Variable PhysicalAssetType_AssetAssignment_StopTime,5312,Variable -EquipmentType_xEquipment__AssetAssignment,5318,Variable -EquipmentType_xEquipment__AssetAssignment_Id,5319,Variable -EquipmentType_xEquipment__AssetAssignment_AssignmentDescription,5320,Variable -EquipmentType_xEquipment__AssetAssignment_StartTime,5321,Variable -EquipmentType_xEquipment__AssetAssignment_StopTime,5322,Variable +EquipmentType_Equipment_Placeholder_AssetAssignment,5318,Variable +EquipmentType_Equipment_Placeholder_AssetAssignment_Id,5319,Variable +EquipmentType_Equipment_Placeholder_AssetAssignment_AssignmentDescription,5320,Variable +EquipmentType_Equipment_Placeholder_AssetAssignment_StartTime,5321,Variable +EquipmentType_Equipment_Placeholder_AssetAssignment_StopTime,5322,Variable EquipmentType_AssetAssignment,5328,Variable EquipmentType_AssetAssignment_Id,5329,Variable EquipmentType_AssetAssignment_AssignmentDescription,5330,Variable diff --git a/src/Opc.Ua.Server/Fluent/FluentNodeManagerBase.cs b/src/Opc.Ua.Server/Fluent/FluentNodeManagerBase.cs index 33d2dbf2cc..1fa33488d9 100644 --- a/src/Opc.Ua.Server/Fluent/FluentNodeManagerBase.cs +++ b/src/Opc.Ua.Server/Fluent/FluentNodeManagerBase.cs @@ -171,7 +171,7 @@ protected FluentNodeManagerBase( /// .Configure(Configure) /// .Seal(); /// - /// The three root/nodeId/typeId lookups default to scanning the + /// The root/nodeId/typeId/dataTypeId lookups default to scanning the /// manager's /// dictionary, mirroring the resolver wiring that the /// source-generated NodeManagerBase.CreateAddressSpaceAsync @@ -196,7 +196,8 @@ public NodeManagerBuilder CreateFluentBuilder(ushort defaultNamespaceIndex) defaultNamespaceIndex, browseName => PredefinedNodes.Values.FindByBrowseName(browseName)!, nodeId => PredefinedNodes.FindById(nodeId)!, - PredefinedNodes.Values.FindByTypeDefinition); + PredefinedNodes.Values.FindByTypeDefinition, + PredefinedNodes.Values.FindByDataType); AttachToBuilder(builder); return builder; } diff --git a/src/Opc.Ua.Server/Fluent/INodeManagerBuilder.cs b/src/Opc.Ua.Server/Fluent/INodeManagerBuilder.cs index 989019f0eb..cb9df45e1c 100644 --- a/src/Opc.Ua.Server/Fluent/INodeManagerBuilder.cs +++ b/src/Opc.Ua.Server/Fluent/INodeManagerBuilder.cs @@ -154,8 +154,12 @@ INodeBuilder Node(NodeId nodeId) /// /// /// — the id is null. - /// — no instance carries that type definition. - /// — more than one instance matches; supply a disambiguator via the overload. + /// — + /// no instance carries that type definition. + /// — + /// more than one instance matches; supply a + /// disambiguator via the + /// overload. /// /// INodeBuilder NodeFromTypeId(NodeId typeDefinitionId); @@ -247,5 +251,56 @@ INodeBuilder NodeFromTypeId(NodeId typeDefinitionId, QualifiedNa /// CLR type carried by the variable's Value attribute. /// IVariableBuilder VariableFromTypeId(NodeId typeDefinitionId, QualifiedName browseName); + + /// + /// Resolves the unique variable instance whose + /// DataType attribute equals + /// and returns a typed + /// view. Useful for singleton variables whose well-known DataType + /// is more stable than the deployment-specific browse path. + /// + /// + /// CLR type carried by the variable's Value attribute. + /// + /// + /// The DataType id of the variable to locate (typically a + /// generated DataTypeIds.* constant). + /// + /// + /// + /// — the id is null. + /// — + /// no variable carries that DataType. + /// — + /// more than one variable matches; supply a + /// disambiguator via the + /// + /// overload. + /// — + /// the resolved variable's Value is not assignable to + /// . + /// + /// + IVariableBuilder VariableFromDataTypeId(NodeId dataTypeId); + + /// + /// Like but + /// disambiguates among multiple instances by matching + /// against + /// . + /// + /// + /// CLR type carried by the variable's Value attribute. + /// + /// See . + /// + /// Browse name of the instance to pick out. + /// + /// + /// Same conditions as + /// plus when the + /// disambiguator matches no candidate. + /// + IVariableBuilder VariableFromDataTypeId(NodeId dataTypeId, QualifiedName browseName); } } diff --git a/src/Opc.Ua.Server/Fluent/NodeManagerBuilder.cs b/src/Opc.Ua.Server/Fluent/NodeManagerBuilder.cs index 7763e9dc7a..3fc9b850ef 100644 --- a/src/Opc.Ua.Server/Fluent/NodeManagerBuilder.cs +++ b/src/Opc.Ua.Server/Fluent/NodeManagerBuilder.cs @@ -84,6 +84,13 @@ public sealed class NodeManagerBuilder : INodeManagerBuilder, IFluentDispatcher /// TypeDefinitionId matches the supplied . /// Typically a generated walk over the manager's predefined nodes. /// + /// + /// Delegate that returns every whose + /// DataType matches the supplied . + /// Typically a generated walk over the manager's predefined nodes. + /// When null, DataType lookups always resolve to no + /// candidates (as if no variable declared that DataType). + /// /// /// , , /// , , @@ -95,7 +102,8 @@ public NodeManagerBuilder( ushort defaultNamespaceIndex, Func rootResolver, Func nodeIdResolver, - Func> typeIdResolver) + Func> typeIdResolver, + Func>? dataTypeIdResolver = null) { Context = context ?? throw new ArgumentNullException(nameof(context)); NodeManager = nodeManager ?? throw new ArgumentNullException(nameof(nodeManager)); @@ -103,6 +111,7 @@ public NodeManagerBuilder( m_rootResolver = rootResolver ?? throw new ArgumentNullException(nameof(rootResolver)); m_nodeIdResolver = nodeIdResolver ?? throw new ArgumentNullException(nameof(nodeIdResolver)); m_typeIdResolver = typeIdResolver ?? throw new ArgumentNullException(nameof(typeIdResolver)); + m_dataTypeIdResolver = dataTypeIdResolver ?? (static _ => []); } /// @@ -284,6 +293,27 @@ public IVariableBuilder VariableFromTypeId(NodeId typeDefinition browseName)); } + /// + public IVariableBuilder VariableFromDataTypeId(NodeId dataTypeId) + { + ThrowIfSealed(); + NodeState node = ResolveByDataType(dataTypeId, (QualifiedName)null!); + return ToVariableBuilder(node, FormatNodeId(dataTypeId)); + } + + /// + public IVariableBuilder VariableFromDataTypeId(NodeId dataTypeId, QualifiedName browseName) + { + ThrowIfSealed(); + NodeState node = ResolveByDataType(dataTypeId, browseName); + return ToVariableBuilder( + node, + CoreUtils.Format( + "{0} (browse name '{1}')", + FormatNodeId(dataTypeId), + browseName)); + } + internal VariableBuilder ToVariableBuilder(NodeState node, string lookupHint) { if (node is not BaseVariableState variable) @@ -590,6 +620,68 @@ private NodeState ResolveByTypeDefinition(NodeId typeDefinitionId, QualifiedName return match; } + private NodeState ResolveByDataType(NodeId dataTypeId, QualifiedName browseName) + { + if (dataTypeId.IsNull) + { + throw ServiceResultException.Create( + StatusCodes.BadNodeIdInvalid, + "DataTypeId is null or empty."); + } + + ArrayOf candidates = m_dataTypeIdResolver(dataTypeId); + + if (candidates.Count == 0) + { + throw ServiceResultException.Create( + StatusCodes.BadNodeIdUnknown, + "No predefined variable has DataType '{0}'.", + dataTypeId); + } + + if (browseName.IsNull) + { + if (candidates.Count > 1) + { + throw ServiceResultException.Create( + StatusCodes.BadBrowseNameDuplicated, + "DataType '{0}' is ambiguous: {1} matching variables found. " + + "Pass a QualifiedName disambiguator to VariableFromDataTypeId.", + dataTypeId, + candidates.Count); + } + return candidates[0]; + } + + NodeState? match = null; + for (int i = 0; i < candidates.Count; i++) + { + if (candidates[i].BrowseName == browseName) + { + if (match != null) + { + throw ServiceResultException.Create( + StatusCodes.BadBrowseNameDuplicated, + "DataType '{0}' has multiple variables with browse name '{1}'.", + dataTypeId, + browseName); + } + match = candidates[i]; + } + } + + if (match == null) + { + throw ServiceResultException.Create( + StatusCodes.BadNodeIdUnknown, + "DataType '{0}' has no variable with browse name '{1}'.", + dataTypeId, + browseName); + } + + return match; + } + private void ThrowIfSealed() { if (m_sealed) @@ -621,6 +713,7 @@ private static void ThrowIfDuplicate( private readonly Func m_rootResolver; private readonly Func m_nodeIdResolver; private readonly Func> m_typeIdResolver; + private readonly Func> m_dataTypeIdResolver; private bool m_sealed; private readonly Dictionary m_historyRead = []; private readonly Dictionary m_historyUpdate = []; diff --git a/src/Opc.Ua.Server/Hosting/HostedNodeManagerLifecycle.cs b/src/Opc.Ua.Server/Hosting/HostedNodeManagerLifecycle.cs index c5f4ce242b..1cade1e8a1 100644 --- a/src/Opc.Ua.Server/Hosting/HostedNodeManagerLifecycle.cs +++ b/src/Opc.Ua.Server/Hosting/HostedNodeManagerLifecycle.cs @@ -79,6 +79,42 @@ public ValueTask ReloadAsync( return Current.ReloadAsync(registration, replacement, ct); } + /// + public ValueTask ShadowReloadAsync( + NodeManagerRegistration registration, + IAsyncNodeManagerFactory replacement, + CancellationToken ct = default) + { + return Current.ShadowReloadAsync(registration, replacement, ct); + } + + /// + public ValueTask ShadowReloadAsync( + NodeManagerRegistration registration, + INodeManagerFactory replacement, + CancellationToken ct = default) + { + return Current.ShadowReloadAsync(registration, replacement, ct); + } + + /// + public ValueTask ImmediateReloadAsync( + NodeManagerRegistration registration, + IAsyncNodeManagerFactory replacement, + CancellationToken ct = default) + { + return Current.ImmediateReloadAsync(registration, replacement, ct); + } + + /// + public ValueTask ImmediateReloadAsync( + NodeManagerRegistration registration, + INodeManagerFactory replacement, + CancellationToken ct = default) + { + return Current.ImmediateReloadAsync(registration, replacement, ct); + } + /// public ValueTask RemoveAsync( NodeManagerRegistration registration, diff --git a/src/Opc.Ua.Server/Hosting/OpcUaServerHostedService.cs b/src/Opc.Ua.Server/Hosting/OpcUaServerHostedService.cs index e5b06ab7b1..d2f3de91d9 100644 --- a/src/Opc.Ua.Server/Hosting/OpcUaServerHostedService.cs +++ b/src/Opc.Ua.Server/Hosting/OpcUaServerHostedService.cs @@ -40,6 +40,7 @@ using Opc.Ua.Configuration; using Opc.Ua.Identity; using Opc.Ua.Schema; +using Opc.Ua.Security.Certificates; using Opc.Ua.Server.AliasNames; using Opc.Ua.Server.Historian; @@ -427,7 +428,7 @@ await certificateManager.UpdateAsync( configuration.SecurityConfiguration, configuration.ApplicationUri, ct).ConfigureAwait(false); - using var certificates = + using CertificateEntryCollection certificates = certificateManager.SnapshotApplicationCertificates(); return certificates.Count > 0; } @@ -514,7 +515,6 @@ public override void Dispose() m_server?.Dispose(); base.Dispose(); } - } /// @@ -547,5 +547,4 @@ public static partial void UserTokenPolicyTokenTypeIsConfiguredWithout( Message = "Error while stopping OPC UA server.")] public static partial void ErrorWhileStoppingOPCUAServer(this ILogger logger, Exception ex); } - } diff --git a/src/Opc.Ua.Server/NodeManager/Adapters/AsyncNodeManagerAdapter.cs b/src/Opc.Ua.Server/NodeManager/Adapters/AsyncNodeManagerAdapter.cs index d989e5d2a0..77580e42a3 100644 --- a/src/Opc.Ua.Server/NodeManager/Adapters/AsyncNodeManagerAdapter.cs +++ b/src/Opc.Ua.Server/NodeManager/Adapters/AsyncNodeManagerAdapter.cs @@ -719,6 +719,7 @@ public ValueTask TransferMonitoredItemsAsync( IList monitoredItems, IList processedItems, IList errors, + MonitoredItemTransferOptions? transferOptions = null, CancellationToken cancellationToken = default) { if (SyncNodeManager is ITransferMonitoredItemsAsyncNodeManager asyncNodeManager) @@ -729,6 +730,7 @@ public ValueTask TransferMonitoredItemsAsync( monitoredItems, processedItems, errors, + transferOptions, cancellationToken); } @@ -737,12 +739,43 @@ public ValueTask TransferMonitoredItemsAsync( sendInitialValues, monitoredItems, processedItems, - errors); + errors, + transferOptions); // Return a completed ValueTask since the underlying call is synchronous. return default; } + /// + public ValueTask RollbackMonitoredItemsTransferAsync( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null, + CancellationToken cancellationToken = default) + { + if (SyncNodeManager is ITransferMonitoredItemsAsyncNodeManager asyncNodeManager) + { + return asyncNodeManager.RollbackMonitoredItemsTransferAsync( + context, + monitoredItems, + processedItems, + errors, + transferOptions, + cancellationToken); + } + + SyncNodeManager.RollbackMonitoredItemsTransfer( + context, + monitoredItems, + processedItems, + errors, + transferOptions); + + return default; + } + /// public ValueTask TranslateBrowsePathAsync( OperationContext context, diff --git a/src/Opc.Ua.Server/NodeManager/Adapters/SyncNodeManagerAdapter.cs b/src/Opc.Ua.Server/NodeManager/Adapters/SyncNodeManagerAdapter.cs index 20d6c33353..0731fde5c4 100644 --- a/src/Opc.Ua.Server/NodeManager/Adapters/SyncNodeManagerAdapter.cs +++ b/src/Opc.Ua.Server/NodeManager/Adapters/SyncNodeManagerAdapter.cs @@ -248,9 +248,34 @@ public void TransferMonitoredItems( bool sendInitialValues, IList monitoredItems, IList processedItems, - IList errors) + IList errors, + MonitoredItemTransferOptions? transferOptions = null) + { + m_nodeManager.TransferMonitoredItemsAsync( + context, + sendInitialValues, + monitoredItems, + processedItems, + errors, + transferOptions) + .AsTask().GetAwaiter().GetResult(); + } + + /// + public void RollbackMonitoredItemsTransfer( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null) { - m_nodeManager.TransferMonitoredItemsAsync(context, sendInitialValues, monitoredItems, processedItems, errors).AsTask().GetAwaiter().GetResult(); + m_nodeManager.RollbackMonitoredItemsTransferAsync( + context, + monitoredItems, + processedItems, + errors, + transferOptions) + .AsTask().GetAwaiter().GetResult(); } /// diff --git a/src/Opc.Ua.Server/NodeManager/AsyncCustomNodeManager.cs b/src/Opc.Ua.Server/NodeManager/AsyncCustomNodeManager.cs index f526b875d7..e2d09a0218 100644 --- a/src/Opc.Ua.Server/NodeManager/AsyncCustomNodeManager.cs +++ b/src/Opc.Ua.Server/NodeManager/AsyncCustomNodeManager.cs @@ -7069,6 +7069,7 @@ protected virtual ValueTask OnMonitoredItemDeletedAsync( /// The set of monitoring items to update. /// The list of bool with items that were already processed. /// Any errors. + /// Options that describe the transfer execution. /// The cancellation token. public virtual async ValueTask TransferMonitoredItemsAsync( OperationContext context, @@ -7076,10 +7077,13 @@ public virtual async ValueTask TransferMonitoredItemsAsync( IList monitoredItems, IList processedItems, IList errors, + MonitoredItemTransferOptions? transferOptions = null, CancellationToken cancellationToken = default) { ServerSystemContext systemContext = SystemContext.Copy(context); var transferredItems = new List(); + bool deferInitialValues = transferOptions?.DeferInitialValues + ?? MonitoredItemTransferExecution.DeferInitialValues; await m_monitoredItemSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); try @@ -7102,7 +7106,8 @@ public virtual async ValueTask TransferMonitoredItemsAsync( // owned by this node manager. processedItems[ii] = true; transferredItems.Add(monitoredItems[ii]); - if (sendInitialValues) + if (sendInitialValues && + !deferInitialValues) { monitoredItems[ii].SetupResendDataTrigger(); } @@ -7118,6 +7123,55 @@ public virtual async ValueTask TransferMonitoredItemsAsync( await OnMonitoredItemsTransferredAsync(systemContext, transferredItems, cancellationToken).ConfigureAwait(false); } + /// + /// Rolls back side effects produced by a failed monitored-item transfer. + /// + /// The source context to restore. + /// The set of monitoring items to roll back. + /// The list of bool with items that were already processed. + /// Any errors. + /// Options that describe the transfer execution. + /// The cancellation token. + public virtual async ValueTask RollbackMonitoredItemsTransferAsync( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null, + CancellationToken cancellationToken = default) + { + ServerSystemContext systemContext = SystemContext.Copy(context); + var rolledBackItems = new List(); + + await m_monitoredItemSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (processedItems[ii] || monitoredItems[ii] == null) + { + continue; + } + + NodeHandle? handle = IsHandleInNamespace(monitoredItems[ii].ManagerHandle); + if (handle == null) + { + continue; + } + + processedItems[ii] = true; + rolledBackItems.Add(monitoredItems[ii]); + errors[ii] = StatusCodes.Good; + } + } + finally + { + m_monitoredItemSemaphore.Release(); + } + + await OnMonitoredItemsTransferRolledBackAsync(systemContext, rolledBackItems, cancellationToken).ConfigureAwait(false); + } + /// /// Called after transfer of MonitoredItems. /// @@ -7133,6 +7187,21 @@ protected virtual ValueTask OnMonitoredItemsTransferredAsync( return new ValueTask(); } + /// + /// Called after rollback of a failed monitored-item transfer. + /// + /// The source context restored by rollback. + /// The monitored items rolled back. + /// The cancellation token. + protected virtual ValueTask OnMonitoredItemsTransferRolledBackAsync( + ServerSystemContext context, + IList monitoredItems, + CancellationToken cancellationToken = default) + { + // defined by the sub-class + return new ValueTask(); + } + /// /// Changes the monitoring mode for a set of monitored items. /// diff --git a/src/Opc.Ua.Server/NodeManager/CustomNodeManager.cs b/src/Opc.Ua.Server/NodeManager/CustomNodeManager.cs index c911489e0c..9fdec00b76 100644 --- a/src/Opc.Ua.Server/NodeManager/CustomNodeManager.cs +++ b/src/Opc.Ua.Server/NodeManager/CustomNodeManager.cs @@ -5747,15 +5747,19 @@ protected virtual void OnMonitoredItemDeleted( /// The set of monitoring items to update. /// The list of bool with items that were already processed. /// Any errors. + /// Options that describe the transfer execution. public virtual void TransferMonitoredItems( OperationContext context, bool sendInitialValues, IList monitoredItems, IList processedItems, - IList errors) + IList errors, + MonitoredItemTransferOptions? transferOptions = null) { ServerSystemContext systemContext = SystemContext.Copy(context); var transferredItems = new List(); + bool deferInitialValues = transferOptions?.DeferInitialValues + ?? MonitoredItemTransferExecution.DeferInitialValues; lock (Lock) { for (int ii = 0; ii < monitoredItems.Count; ii++) @@ -5776,7 +5780,8 @@ public virtual void TransferMonitoredItems( // owned by this node manager. processedItems[ii] = true; transferredItems.Add(monitoredItems[ii]); - if (sendInitialValues) + if (sendInitialValues && + !deferInitialValues) { monitoredItems[ii].SetupResendDataTrigger(); } @@ -5788,6 +5793,47 @@ public virtual void TransferMonitoredItems( OnMonitoredItemsTransferred(systemContext, transferredItems); } + /// + /// Rolls back side effects produced by a failed monitored-item transfer. + /// + /// The source context to restore. + /// The set of monitoring items to roll back. + /// The list of bool with items that were already processed. + /// Any errors. + /// Options that describe the transfer execution. + public virtual void RollbackMonitoredItemsTransfer( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null) + { + ServerSystemContext systemContext = SystemContext.Copy(context); + var rolledBackItems = new List(); + lock (Lock) + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (processedItems[ii] || monitoredItems[ii] == null) + { + continue; + } + + NodeHandle? handle = IsHandleInNamespace(monitoredItems[ii].ManagerHandle); + if (handle == null) + { + continue; + } + + processedItems[ii] = true; + rolledBackItems.Add(monitoredItems[ii]); + errors[ii] = StatusCodes.Good; + } + } + + OnMonitoredItemsTransferRolledBack(systemContext, rolledBackItems); + } + /// /// Called after transfer of MonitoredItems. /// @@ -5800,6 +5846,18 @@ protected virtual void OnMonitoredItemsTransferred( // defined by the sub-class } + /// + /// Called after rollback of a failed monitored-item transfer. + /// + /// The source context restored by rollback. + /// The monitored items rolled back. + protected virtual void OnMonitoredItemsTransferRolledBack( + ServerSystemContext context, + IList monitoredItems) + { + // defined by the sub-class + } + /// /// Changes the monitoring mode for a set of monitored items. /// diff --git a/src/Opc.Ua.Server/NodeManager/IMasterNodeManager.cs b/src/Opc.Ua.Server/NodeManager/IMasterNodeManager.cs index b39c800923..5bebe28319 100644 --- a/src/Opc.Ua.Server/NodeManager/IMasterNodeManager.cs +++ b/src/Opc.Ua.Server/NodeManager/IMasterNodeManager.cs @@ -364,6 +364,7 @@ ValueTask TransferMonitoredItemsAsync( bool sendInitialValues, IList monitoredItems, IList errors, + MonitoredItemTransferOptions? transferOptions = null, CancellationToken cancellationToken = default); /// @@ -409,4 +410,49 @@ ValueTask TransferMonitoredItemsAsync( ArrayOf nodesToWrite, CancellationToken cancellationToken = default); } + + /// + /// Coordinates the detached monitored item hand-over between the current and replacement + /// NodeManagers during a lifecycle transition. + /// + internal interface IMonitoredItemTransferCoordinator + { + /// + /// Prepares monitored items for transfer to another session without committing the move. + /// + /// The operation context for the destination session. + /// The operation context for the source session. + /// Whether the destination should receive initial values. + /// The monitored items to transfer. + /// The per-item transfer results to update. + /// Optional transfer behavior supplied by the caller. + /// The token that aborts preparation. + /// A transaction that commits or rolls back the prepared transfer. + ValueTask PrepareMonitoredItemsTransferAsync( + OperationContext destinationContext, + OperationContext sourceContext, + bool sendInitialValues, + IList monitoredItems, + IList errors, + MonitoredItemTransferOptions? transferOptions, + CancellationToken cancellationToken); + } + + /// + /// Represents a prepared monitored item transfer whose ownership change is still reversible. + /// + internal interface IMonitoredItemTransferTransaction + { + /// + /// Makes the prepared transfer visible to the destination session. + /// + void Commit(); + + /// + /// Restores the source session ownership when the prepared transfer cannot be committed. + /// + /// The token that aborts rollback. + /// A task that completes when rollback has finished. + ValueTask RollbackAsync(CancellationToken cancellationToken); + } } diff --git a/src/Opc.Ua.Server/NodeManager/INodeManager.cs b/src/Opc.Ua.Server/NodeManager/INodeManager.cs index 1f003492ac..119485ec2c 100644 --- a/src/Opc.Ua.Server/NodeManager/INodeManager.cs +++ b/src/Opc.Ua.Server/NodeManager/INodeManager.cs @@ -323,14 +323,31 @@ void DeleteMonitoredItems( /// Transfers a set of monitored items. /// /// - /// Queue initial values from monitored items in the node managers. + /// Queue initial values from monitored items in the node managers unless + /// requests deferred initial values. /// void TransferMonitoredItems( OperationContext context, bool sendInitialValues, IList monitoredItems, IList processedItems, - IList errors); + IList errors, + MonitoredItemTransferOptions? transferOptions = null); + + /// + /// Rolls back side effects produced by a failed monitored-item transfer. + /// + /// + /// Implementations should undo owner-side effects recorded during + /// and must not apply the forward + /// transfer notification a second time. + /// + void RollbackMonitoredItemsTransfer( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null); /// /// Changes the monitoring mode for a set of monitored items. @@ -616,7 +633,8 @@ public interface ITransferMonitoredItemsAsyncNodeManager /// Transfers a set of monitored items. /// /// - /// Queue initial values from monitored items in the node managers. + /// Queue initial values from monitored items in the node managers unless + /// requests deferred initial values. /// ValueTask TransferMonitoredItemsAsync( OperationContext context, @@ -624,7 +642,81 @@ ValueTask TransferMonitoredItemsAsync( IList monitoredItems, IList processedItems, IList errors, + MonitoredItemTransferOptions? transferOptions = null, CancellationToken cancellationToken = default); + + /// + /// Rolls back side effects produced by a failed monitored-item transfer. + /// + /// + /// Implementations should undo owner-side effects recorded during + /// and must not apply the forward + /// transfer notification a second time. + /// + ValueTask RollbackMonitoredItemsTransferAsync( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null, + CancellationToken cancellationToken = default); + } + + /// + /// Describes how a monitored-item transfer callback is being executed. + /// + public sealed class MonitoredItemTransferOptions + { + /// + /// Gets or sets a value indicating whether node managers shall defer + /// calls to until + /// the owning subscription commits the transfer. + /// + /// + /// This explicit option takes precedence over the ambient + /// fallback. + /// + public bool DeferInitialValues { get; set; } + } + + /// + /// Ambient monitored-item transfer state used as a fallback for legacy + /// transfer implementations that have not been updated to consume + /// . + /// + public static class MonitoredItemTransferExecution + { + /// + /// Gets a value indicating whether current transfer callbacks should + /// defer initial values until the transaction commits. + /// + public static bool DeferInitialValues => s_deferInitialValues.Value > 0; + + /// + /// Begins an ambient scope that asks legacy transfer callbacks to defer + /// initial values until the transaction commits. + /// + /// A disposable scope that restores the previous ambient state. + public static IDisposable BeginDeferredInitialValues() + { + s_deferInitialValues.Value++; + return new DeferredInitialValuesScope(); + } + + private sealed class DeferredInitialValuesScope : IDisposable + { + public void Dispose() + { + if (Interlocked.Exchange(ref m_disposed, 1) == 0) + { + s_deferInitialValues.Value--; + } + } + + private int m_disposed; + } + + private static readonly AsyncLocal s_deferInitialValues = new(); } /// diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/IDynamicNodeManagerHost.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/IDynamicNodeManagerHost.cs index 82448c48f1..50efcf440b 100644 --- a/src/Opc.Ua.Server/NodeManager/Lifecycle/IDynamicNodeManagerHost.cs +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/IDynamicNodeManagerHost.cs @@ -74,10 +74,21 @@ ValueTask PublishAsync( /// /// The NodeManager that is being replaced. /// The prepared replacement. + /// + /// true to allow the replacement even when the current generation still owns + /// active monitored items, as a shadow or immediate reload does; false to fail + /// closed before any routing change, as an ordinary reload does. + /// + /// + /// true to keep the replaced generation in session and existing all-events + /// notification fan-out while its active MonitoredItems drain. + /// /// The token used to cancel the operation. ValueTask ReplaceAsync( IAsyncNodeManager current, PreparedNodeManager replacement, + bool allowActiveMonitoredItems = false, + bool retainReplacedNotifications = false, CancellationToken ct = default); /// @@ -112,18 +123,26 @@ ValueTask UnpublishAsync( CancellationToken ct = default); /// - /// Tears down a NodeManager that is no longer reachable and disposes it. This is the only - /// stage that cannot be undone, so it runs after all Clients have stopped using it. + /// Destroys the address space of a NodeManager that is no longer reachable. This method + /// does not remove external references discovered during deletion and does not dispose the + /// NodeManager. The lifecycle checkpoints this stage before performing either later action. /// - /// The NodeManager to tear down. - /// - /// true to also remove the references this NodeManager added to Nodes owned by - /// other NodeManagers. A reload keeps them, because the replacement re-adds them. - /// + /// The NodeManager whose address space is torn down. + /// The token used to cancel the operation. + ValueTask DestroyAddressSpaceAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct = default); + + /// + /// Removes external references discovered while destroying + /// 's address space. This separate, retryable stage ensures + /// a failure in another NodeManager never repeats third-party address-space deletion. + /// A reload does not invoke this stage because its replacement re-adds the references. + /// + /// The destroyed NodeManager whose references are removed. /// The token used to cancel the operation. - ValueTask DestroyAsync( + ValueTask RemoveDestroyedExternalReferencesAsync( IAsyncNodeManager nodeManager, - bool removeExternalReferences, CancellationToken ct = default); /// @@ -143,6 +162,13 @@ ValueTask RollbackAsync( /// The NodeManager to release. void Release(IAsyncNodeManager nodeManager); + /// + /// Registers a callback the host invokes (from an ownership-sensitive monitored + /// item request such as Delete) once monitored items owned by a shadow-retired + /// generation may have drained. The callback must not tear down anything inline; + /// it schedules cleanup off the request path. + /// + void SetRetiredGenerationDrainObserver(Action? observer); /// /// Reattaches MonitoredItems that were detached because their Node disappeared, once a @@ -155,6 +181,40 @@ ValueTask RecoverDetachedMonitoredItemsAsync( IAsyncNodeManager nodeManager, IReadOnlyCollection? nodeIds = null, CancellationToken cancellationToken = default); + + /// + /// Enables or suspends session and existing all-events notifications for a + /// shadow-retired generation. Suspending notifications establishes the cutoff + /// used before its final request drain and destruction. + /// + /// The shadow-retired generation. + /// true to enable notifications; otherwise false. + void SetRetiredGenerationNotifications( + IAsyncNodeManager nodeManager, + bool enabled); + + /// + /// Disables new lifecycle-protected notifications and waits for dispatches that already + /// captured to finish, without changing its retained + /// all-events subscription snapshot. + /// + /// The generation whose dispatches must drain. + /// The token used to cancel the wait. + ValueTask WaitForNotificationDispatchesAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct = default); + + /// + /// Unsubscribes a shadow-retired generation from the exact all-events monitored + /// items captured when it was retired. Items already handled by an in-flight + /// deletion are absent, while deletions excluded after notification suspension + /// remain in the snapshot and are finalized here. + /// + /// The shadow-retired generation. + /// The token used to cancel the operation. + ValueTask FinalizeRetiredGenerationNotificationsAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct = default); } /// @@ -210,5 +270,20 @@ public PreparedNodeManager( /// restores together with it. /// public Dictionary>? ReplacedExternalReferences { get; set; } + + /// + /// Gets or sets whether may still own active + /// monitored items when this replacement is committed. Set by + /// for a shadow reload; the + /// replaced generation is preserved for its existing monitored items and is torn + /// down only after they drain. + /// + public bool AllowActiveMonitoredItems { get; set; } + + /// + /// Gets or sets whether the replaced generation remains in session and existing + /// all-events notification fan-out after the routing swap. + /// + public bool RetainReplacedNotifications { get; set; } } } diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerLifecycle.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerLifecycle.cs index 5f6361dcc3..9e7e1655c2 100644 --- a/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerLifecycle.cs +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerLifecycle.cs @@ -72,6 +72,50 @@ ValueTask ReloadAsync( INodeManagerFactory replacement, CancellationToken ct = default); + /// + /// Replaces a live registration with a new asynchronous factory generation while + /// allowing the current generation to keep serving monitored items that were + /// already created on it. New service requests are atomically routed to the + /// replacement generation as soon as it is committed; the current generation is + /// retained only for its existing monitored items and any request or continuation + /// point that already captured it, and is disposed automatically once they drain. + /// + ValueTask ShadowReloadAsync( + NodeManagerRegistration registration, + IAsyncNodeManagerFactory replacement, + CancellationToken ct = default); + + /// + /// Replaces a live registration with a new synchronous factory generation while + /// allowing the current generation to keep serving monitored items that were + /// already created on it. New service requests are atomically routed to the + /// replacement generation as soon as it is committed; the current generation is + /// retained only for its existing monitored items and any request or continuation + /// point that already captured it, and is disposed automatically once they drain. + /// + ValueTask ShadowReloadAsync( + NodeManagerRegistration registration, + INodeManagerFactory replacement, + CancellationToken ct = default); + + /// + /// Replaces a live registration and immediately invalidates monitored items + /// owned by the previous generation with . + /// + ValueTask ImmediateReloadAsync( + NodeManagerRegistration registration, + IAsyncNodeManagerFactory replacement, + CancellationToken ct = default); + + /// + /// Replaces a live registration and immediately invalidates monitored items + /// owned by the previous generation with . + /// + ValueTask ImmediateReloadAsync( + NodeManagerRegistration registration, + INodeManagerFactory replacement, + CancellationToken ct = default); + /// /// Removes a live registration from the server. /// diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerMonitoredItemRetirementTracker.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerMonitoredItemRetirementTracker.cs new file mode 100644 index 0000000000..8b2bf2bff4 --- /dev/null +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/INodeManagerMonitoredItemRetirementTracker.cs @@ -0,0 +1,57 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace Opc.Ua.Server +{ + /// + /// Invalidates monitored items owned by a NodeManager before an immediate + /// generation retirement. Implemented by the subscription so that an + /// immediate reload can make every affected item publishable with a + /// terminal status and then release the retired NodeManager, without + /// deleting the client's subscription. + /// + internal interface INodeManagerMonitoredItemRetirementTracker + { + /// + /// Returns whether every monitored item owned by the NodeManager supports + /// immediate retirement. + /// + bool CanRetireMonitoredItems(IAsyncNodeManager nodeManager); + + /// + /// Invalidates all monitored items owned by the NodeManager. + /// + void RetireMonitoredItems(IAsyncNodeManager nodeManager, ServiceResult error); + + /// + /// Releases owner references from retired monitored items. + /// + void DetachRetiredMonitoredItems(IAsyncNodeManager nodeManager); + } +} diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/ISyncNodeManagerMonitoredItemRecovery.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/ISyncNodeManagerMonitoredItemRecovery.cs index c87b609252..8b53a2701d 100644 --- a/src/Opc.Ua.Server/NodeManager/Lifecycle/ISyncNodeManagerMonitoredItemRecovery.cs +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/ISyncNodeManagerMonitoredItemRecovery.cs @@ -55,4 +55,4 @@ void RecoverDetachedMonitoredItems( IAsyncNodeManager nodeManager, IReadOnlyCollection nodeIds); } -} \ No newline at end of file +} diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerLifecycle.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerLifecycle.cs index 4a3bde1ade..68d4731215 100644 --- a/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerLifecycle.cs +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerLifecycle.cs @@ -64,12 +64,38 @@ public ArrayOf Registrations } } + internal long ShutdownCleanupProgress => + Interlocked.Read(ref m_shutdownCleanupProgress); + + internal int RetiredNodeManagerCount + { + get + { + lock (m_registrationLock) + { + return m_retiredNodeManagers.Count; + } + } + } + /// public void Dispose() { - if (!m_disposed) + bool disposeSemaphore; + lock (m_operationLifetimeLock) { + if (m_disposeRequested) + { + return; + } + + m_disposeRequested = true; m_disposed = true; + m_shuttingDown = true; + disposeSemaphore = TryReserveSemaphoreDisposal(); + } + if (disposeSemaphore) + { m_lifecycleSemaphore.Dispose(); } } @@ -83,20 +109,44 @@ internal async ValueTask BeginShutdownAsync( throw new ArgumentNullException(nameof(server)); } - m_shuttingDown = true; - await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + Task activeOperations = EnterShutdownMethod(); + bool semaphoreHeld = false; + bool shutdownPrepared = false; try { + await activeOperations.WaitAsync(ct).ConfigureAwait(false); + await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + semaphoreHeld = true; if (server.NodeManager is IDynamicNodeManagerHost host) { await CleanupRetiredNodeManagersAsync( server, - host).ConfigureAwait(false); + host, + allowShuttingDown: true).ConfigureAwait(false); + + RetiredNodeManager[] retired; + lock (m_registrationLock) + { + retired = [.. m_retiredNodeManagers]; + } + + foreach (RetiredNodeManager retiredNodeManager in retired) + { + host.SetRetiredGenerationNotifications( + retiredNodeManager.NodeManager, + enabled: false); + retiredNodeManager.NotificationsSuspended = true; + } } + shutdownPrepared = true; } finally { - m_lifecycleSemaphore.Release(); + if (semaphoreHeld) + { + m_lifecycleSemaphore.Release(); + } + ExitBeginShutdownMethod(shutdownPrepared); } } @@ -109,28 +159,131 @@ internal async ValueTask CompleteShutdownAsync( throw new ArgumentNullException(nameof(server)); } - await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + Task activeOperations = EnterShutdownMethod(); + bool semaphoreHeld = false; + bool shutdownCompleted = false; try { + await activeOperations.WaitAsync(ct).ConfigureAwait(false); + await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + semaphoreHeld = true; RegistrationState[] registrations; + RetiredNodeManager[] retired; lock (m_registrationLock) { registrations = [.. m_registrations.Values]; - m_registrations.Clear(); + retired = [.. m_retiredNodeManagers]; } var host = server.NodeManager as IDynamicNodeManagerHost; + var failures = new List(); + OperationCanceledException? cancellationException = null; foreach (RegistrationState registration in registrations) { - host?.Release(registration.Prepared.NodeManager); - await DisposeNodeManagerAsync(registration.Prepared.NodeManager) - .ConfigureAwait(false); + try + { + ct.ThrowIfCancellationRequested(); + ShutdownCleanupState cleanup = registration.ShutdownCleanup; + bool completeCommittedRemoval = cleanup.RemovalUnpublished; + if (completeCommittedRemoval && !cleanup.Detached) + { + cleanup.RemovalMonitoredItemsDeleted = true; + cleanup.Detached = true; + registration.Prepared.Staged = false; + RecordShutdownCleanupProgress(); + } + await CleanupShutdownNodeManagerAsync( + server, + host, + registration.Prepared.NodeManager, + cleanup, + pendingReferences: null, + destroyAddressSpace: completeCommittedRemoval, + removeDestroyedExternalReferences: completeCommittedRemoval, + ct) + .ConfigureAwait(false); + lock (m_registrationLock) + { + if (m_registrations.TryGetValue( + registration.Registration.Id, + out RegistrationState? current) && + ReferenceEquals(current, registration)) + { + m_registrations.Remove(registration.Registration.Id); + } + } + } + catch (OperationCanceledException ex) when ( + ct.IsCancellationRequested) + { + cancellationException = ex; + break; + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + failures.Add( + new InvalidOperationException( + "A registered NodeManager failed during shutdown cleanup.", + ex)); + } + } + + if (cancellationException is null) + { + foreach (RetiredNodeManager retiredNodeManager in retired) + { + try + { + ct.ThrowIfCancellationRequested(); + await CleanupShutdownNodeManagerAsync( + server, + host, + retiredNodeManager.NodeManager, + retiredNodeManager.ShutdownCleanup, + retiredNodeManager.PendingReferences, + destroyAddressSpace: true, + removeDestroyedExternalReferences: false, + ct) + .ConfigureAwait(false); + RemoveRetiredNodeManagerRecord(retiredNodeManager); + } + catch (OperationCanceledException ex) when ( + ct.IsCancellationRequested) + { + cancellationException = ex; + break; + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + failures.Add( + new InvalidOperationException( + "A retired NodeManager failed during shutdown cleanup.", + ex)); + } + } + } + + if (cancellationException is not null) + { + throw cancellationException; } + if (failures.Count > 0) + { + throw new AggregateException( + "One or more NodeManagers failed during shutdown cleanup.", + failures); + } + + shutdownCompleted = true; } finally { - m_lifecycleSemaphore.Release(); + if (semaphoreHeld) + { + m_lifecycleSemaphore.Release(); + } + ExitCompleteShutdownMethod(shutdownCompleted); } } @@ -146,6 +299,7 @@ public ValueTask AddAsync( return AddCoreAsync( factory.CreateAsync, + IsRequestCallbackSafe(factory), ct); } @@ -162,6 +316,7 @@ public ValueTask AddAsync( return AddCoreAsync( (server, configuration, _) => new ValueTask( factory.Create(server, configuration).ToAsyncNodeManager()), + allowRequestCallback: false, ct); } @@ -179,6 +334,8 @@ public ValueTask ReloadAsync( return ReloadCoreAsync( registration, replacement.CreateAsync, + ReloadRetirementMode.Migrate, + allowRequestCallback: IsRequestCallbackSafe(replacement), ct); } @@ -197,6 +354,86 @@ public ValueTask ReloadAsync( registration, (server, configuration, _) => new ValueTask( replacement.Create(server, configuration).ToAsyncNodeManager()), + ReloadRetirementMode.Migrate, + allowRequestCallback: false, + ct); + } + + /// + public ValueTask ShadowReloadAsync( + NodeManagerRegistration registration, + IAsyncNodeManagerFactory replacement, + CancellationToken ct = default) + { + if (replacement is null) + { + throw new ArgumentNullException(nameof(replacement)); + } + + return ReloadCoreAsync( + registration, + replacement.CreateAsync, + ReloadRetirementMode.Graceful, + allowRequestCallback: IsRequestCallbackSafe(replacement), + ct); + } + + /// + public ValueTask ShadowReloadAsync( + NodeManagerRegistration registration, + INodeManagerFactory replacement, + CancellationToken ct = default) + { + if (replacement is null) + { + throw new ArgumentNullException(nameof(replacement)); + } + + return ReloadCoreAsync( + registration, + (server, configuration, _) => new ValueTask( + replacement.Create(server, configuration).ToAsyncNodeManager()), + ReloadRetirementMode.Graceful, + allowRequestCallback: false, + ct); + } + + /// + public ValueTask ImmediateReloadAsync( + NodeManagerRegistration registration, + IAsyncNodeManagerFactory replacement, + CancellationToken ct = default) + { + if (replacement is null) + { + throw new ArgumentNullException(nameof(replacement)); + } + + return ReloadCoreAsync( + registration, + replacement.CreateAsync, + ReloadRetirementMode.Immediate, + allowRequestCallback: IsRequestCallbackSafe(replacement), + ct); + } + + /// + public ValueTask ImmediateReloadAsync( + NodeManagerRegistration registration, + INodeManagerFactory replacement, + CancellationToken ct = default) + { + if (replacement is null) + { + throw new ArgumentNullException(nameof(replacement)); + } + + return ReloadCoreAsync( + registration, + (server, configuration, _) => new ValueTask( + replacement.Create(server, configuration).ToAsyncNodeManager()), + ReloadRetirementMode.Immediate, + allowRequestCallback: false, ct); } @@ -210,153 +447,278 @@ public async ValueTask RemoveAsync( throw new ArgumentNullException(nameof(registration)); } - EnsureNotRequestCallback(); - await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + using OperationLifetime operation = EnterLifecycleOperation(); + RegistrationState permissionState = GetCurrentState( + registration, + allowRemovalRetry: true); + bool allowRequestCallback = + permissionState.AllowLifecycleFromRequestCallback; + (IServerInternal entryServer, _) = + GetRunningServer(allowRequestCallback); + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope? requestWaiter = + EnterRequestLifecycleWaiter(entryServer); + await WaitForLifecycleSemaphoreAsync(requestWaiter, ct) + .ConfigureAwait(false); try { - (IServerInternal server, IDynamicNodeManagerHost host) = GetRunningServer(); - await CleanupRetiredNodeManagersAsync(server, host).ConfigureAwait(false); - RegistrationState state = GetCurrentState(registration); - MonitoredItemTransition monitoredItemTransition = - await PrepareMonitoredItemRemovalAsync( - server, - state.Prepared.NodeManager, - ct).ConfigureAwait(false); - if (!state.Prepared.Published && - state.Prepared.Staged) - { - await UnbindFromServerAsync( - server, - state.Prepared.NodeManager, - CancellationToken.None).ConfigureAwait(false); - state.Prepared.Staged = false; - } - if (state.Prepared.Published) - { - await host - .UnpublishAsync( - state.Prepared.NodeManager, - beforeUnpublish: () => - monitoredItemTransition.DetachCurrentAsync(ct), - rollbackUnpublish: () => - monitoredItemTransition.RollbackAsync( - CancellationToken.None), - ct: ct) - .ConfigureAwait(false); - state.Prepared.Published = false; + EnsureRequestCallbackAllowed(allowRequestCallback); + (IServerInternal cleanupServer, IDynamicNodeManagerHost cleanupHost) = + GetRunningServer(allowRequestCallback); + await CleanupRetiredNodeManagersAsync(cleanupServer, cleanupHost) + .ConfigureAwait(false); - try - { - InvalidateContinuationPoints( - server, - state.Prepared.NodeManager); - await server.RequestManager - .WaitForCurrentRequestsAsync(ct) - .ConfigureAwait(false); - InvalidateContinuationPoints( - server, - state.Prepared.NodeManager); - await UnbindFromServerAsync( - server, - state.Prepared.NodeManager, - ct).ConfigureAwait(false); - } - catch (Exception ex) when (ex is not OutOfMemoryException) + RegistrationState state = GetCurrentState( + registration, + allowRemovalRetry: true); + (IServerInternal server, IDynamicNodeManagerHost host) = + GetRunningServer(allowRequestCallback); + ShutdownCleanupState cleanup = state.ShutdownCleanup; + try + { + if (!cleanup.Detached) { - ServerBindings? rollbackBindings = null; + MonitoredItemTransition monitoredItemTransition = + await PrepareMonitoredItemRemovalAsync( + server, + state.Prepared.NodeManager, + ct).ConfigureAwait(false); + bool rollbackPublication = false; + if (!cleanup.RemovalUnpublished) + { + if (state.Prepared.Published) + { + await host + .UnpublishAsync( + state.Prepared.NodeManager, + beforeUnpublish: () => + monitoredItemTransition.DetachCurrentAsync(ct), + rollbackUnpublish: () => + monitoredItemTransition.RollbackAsync( + CancellationToken.None), + ct: ct) + .ConfigureAwait(false); + state.Prepared.Published = false; + rollbackPublication = true; + } + else + { + await monitoredItemTransition + .DetachCurrentAsync(ct) + .ConfigureAwait(false); + } + MarkRemovalUnpublished(cleanup); + } + ClaimRemoval(registration, state); + try { - await host - .PublishAsync( - state.Prepared, - CancellationToken.None) + await WaitForNotificationDispatchesOutsideLifecycleSemaphoreAsync( + server, + host, + state.Prepared.NodeManager) .ConfigureAwait(false); - rollbackBindings = await BindToServerAsync( + ValidateRemovalClaim( + registration, + state, + "The registration was replaced while notifications drained."); + InvalidateContinuationPoints( server, - state.Prepared.NodeManager, - CancellationToken.None).ConfigureAwait(false); - await CommitWithReconciliationAsync( + state.Prepared.NodeManager); + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + ct) + .ConfigureAwait(false); + EnsureSameRunningServer( server, host, - state.Prepared, - state.Prepared.NodeManager, - rollbackBindings, - CancellationToken.None, - afterCommit: () => - monitoredItemTransition.RollbackAsync( - CancellationToken.None)).ConfigureAwait(false); - await server.RequestManager - .WaitForCurrentRequestsAsync(CancellationToken.None) - .ConfigureAwait(false); - await ReconcileBindingsAsync( + allowRequestCallback); + ValidateRemovalClaim( + registration, + state, + "The registration was replaced while removal requests drained."); + InvalidateContinuationPoints( + server, + state.Prepared.NodeManager); + await UnbindFromServerAsync( server, state.Prepared.NodeManager, - rollbackBindings, - CancellationToken.None).ConfigureAwait(false); + ct).ConfigureAwait(false); + state.Prepared.Staged = false; } - catch (Exception rollbackException) when ( - rollbackException is not OutOfMemoryException) + catch (Exception ex) when (ex is not OutOfMemoryException) { - Exception? cleanupException = null; - if (!state.Prepared.Published) + if (!rollbackPublication || + !CanRecoverRunningServer(server, host)) + { + throw; + } + + ServerBindings? rollbackBindings = null; + try + { + await host + .PublishAsync( + state.Prepared, + CancellationToken.None) + .ConfigureAwait(false); + rollbackBindings = await BindToServerAsync( + server, + state.Prepared.NodeManager, + CancellationToken.None).ConfigureAwait(false); + await CommitWithReconciliationAsync( + server, + host, + state.Prepared, + state.Prepared.NodeManager, + rollbackBindings, + CancellationToken.None, + afterCommit: () => + monitoredItemTransition.RollbackAsync( + CancellationToken.None)).ConfigureAwait(false); + ResetRemovalUnpublished(cleanup); + lock (m_registrationLock) + { + state.RemovalPending = false; + } + host.SetRetiredGenerationNotifications( + state.Prepared.NodeManager, + enabled: true); + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + CancellationToken.None) + .ConfigureAwait(false); + EnsureSameRunningServer( + server, + host, + allowRequestCallback); + if (IsCurrentRegistration(registration)) + { + await ReconcileBindingsAsync( + server, + state.Prepared.NodeManager, + rollbackBindings, + CancellationToken.None).ConfigureAwait(false); + } + } + catch (Exception rollbackException) when ( + rollbackException is not OutOfMemoryException) { - try + state.RemovalPending = false; + Exception? cleanupException = null; + if (state.Prepared.Published) + { + ResetRemovalUnpublished(cleanup); + host.SetRetiredGenerationNotifications( + state.Prepared.NodeManager, + enabled: true); + } + else { - if (rollbackBindings is not null) + try { - await UnbindBindingsAsync( + if (rollbackBindings is not null) + { + await UnbindBindingsAsync( + state.Prepared.NodeManager, + rollbackBindings, + CancellationToken.None).ConfigureAwait(false); + } + await UnbindFromServerAsync( + server, state.Prepared.NodeManager, - rollbackBindings, CancellationToken.None).ConfigureAwait(false); + state.Prepared.Staged = false; + } + catch (Exception ex2) when ( + ex2 is not OutOfMemoryException) + { + cleanupException = ex2; } - await UnbindFromServerAsync( - server, - state.Prepared.NodeManager, - CancellationToken.None).ConfigureAwait(false); - state.Prepared.Staged = false; } - catch (Exception ex2) when ( - ex2 is not OutOfMemoryException) + if (cleanupException is not null) { - cleanupException = ex2; + rollbackException = new AggregateException( + "NodeManager rollback binding cleanup failed.", + rollbackException, + cleanupException); } + throw new AggregateException( + "NodeManager removal and rollback both failed.", + ex, + rollbackException); } - if (cleanupException is not null) - { - rollbackException = new AggregateException( - "NodeManager rollback binding cleanup failed.", - rollbackException, - cleanupException); - } - throw new AggregateException( - "NodeManager removal and rollback both failed.", - ex, - rollbackException); + throw; } - throw; + + MarkRemovalDetached(cleanup, monitoredItemTransition); + } + else + { + ClaimRemoval(registration, state); } - } - monitoredItemTransition.MarkDeletedItems(); - await host - .DestroyAsync( - state.Prepared.NodeManager, - removeExternalReferences: true, - ct: CancellationToken.None) - .ConfigureAwait(false); - RebuildActiveTypeTree(server); - await DisposeNodeManagerAsync(state.Prepared.NodeManager) - .ConfigureAwait(false); - lock (m_registrationLock) + if (!cleanup.NotificationsFinalized) + { + await FinalizeNotificationsOutsideLifecycleSemaphoreAsync( + server, + host, + state.Prepared.NodeManager) + .ConfigureAwait(false); + cleanup.NotificationsFinalized = true; + ValidateRemovalClaim( + registration, + state, + "The registration changed while notifications drained."); + } + if (!cleanup.Destroyed) + { + await host + .DestroyAddressSpaceAsync( + state.Prepared.NodeManager, + ct: CancellationToken.None) + .ConfigureAwait(false); + cleanup.NotificationsFinalized = true; + cleanup.Destroyed = true; + } + if (!cleanup.DestroyedExternalReferencesRemoved) + { + await host + .RemoveDestroyedExternalReferencesAsync( + state.Prepared.NodeManager, + CancellationToken.None) + .ConfigureAwait(false); + cleanup.DestroyedExternalReferencesRemoved = true; + } + if (!cleanup.Disposed) + { + RebuildActiveTypeTree(server); + await DisposeNodeManagerAsync(state.Prepared.NodeManager) + .ConfigureAwait(false); + cleanup.Disposed = true; + } + ValidateRemovalClaim( + registration, + state, + "The registration changed while removal cleanup completed."); + lock (m_registrationLock) + { + m_registrations.Remove(registration.Id); + } + } + catch { - m_registrations.Remove(registration.Id); + state.RemovalPending = false; + throw; } - await NotifyCommittedChangeAsync( - server, - "removed", - namespaceCountBefore: server.NamespaceUris.Count, - ct: CancellationToken.None).ConfigureAwait(false); + if (!m_shuttingDown && !m_disposed) + { + await NotifyCommittedChangeAsync( + server, + "removed", + namespaceCountBefore: server.NamespaceUris.Count, + ct: CancellationToken.None).ConfigureAwait(false); + } } finally { @@ -366,10 +728,16 @@ await NotifyCommittedChangeAsync( private async ValueTask AddCoreAsync( CreateNodeManagerAsync createNodeManager, + bool allowRequestCallback, CancellationToken ct) { - EnsureNotRequestCallback(); - await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + using OperationLifetime operation = EnterLifecycleOperation(); + (IServerInternal entryServer, _) = + GetRunningServer(allowRequestCallback); + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope? requestWaiter = + EnterRequestLifecycleWaiter(entryServer); + await WaitForLifecycleSemaphoreAsync(requestWaiter, ct) + .ConfigureAwait(false); IAsyncNodeManager? nodeManager = null; PreparedNodeManager? prepared = null; IServerInternal? server = null; @@ -378,8 +746,11 @@ private async ValueTask AddCoreAsync( bool committed = false; try { - (server, host) = GetRunningServer(); - await CleanupRetiredNodeManagersAsync(server, host).ConfigureAwait(false); + (IServerInternal cleanupServer, IDynamicNodeManagerHost cleanupHost) = + GetRunningServer(allowRequestCallback); + await CleanupRetiredNodeManagersAsync(cleanupServer, cleanupHost) + .ConfigureAwait(false); + (server, host) = GetRunningServer(allowRequestCallback); namespaceCountBefore = server.NamespaceUris.Count; nodeManager = await createNodeManager( server, @@ -411,6 +782,7 @@ await CommitWithReconciliationAsync( server, nodeManager, ct)).ConfigureAwait(false); + RebuildTypeTree(nodeManager); var registration = new NodeManagerRegistration( Guid.NewGuid(), @@ -420,23 +792,37 @@ await CommitWithReconciliationAsync( { m_registrations.Add( registration.Id, - new RegistrationState(registration, prepared)); + new RegistrationState( + registration, + prepared, + allowRequestCallback)); } committed = true; - await server.RequestManager - .WaitForCurrentRequestsAsync(CancellationToken.None) + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + CancellationToken.None) .ConfigureAwait(false); - await ReconcileBindingsAsync( - server, - nodeManager, - bindings, - CancellationToken.None).ConfigureAwait(false); - await NotifyCommittedChangeAsync( + EnsureSameRunningServer( server, - "added", - namespaceCountBefore, - CancellationToken.None).ConfigureAwait(false); + host, + allowRequestCallback); + if (IsCurrentRegistration(registration)) + { + await ReconcileBindingsAsync( + server, + nodeManager, + bindings, + CancellationToken.None).ConfigureAwait(false); + } + if (!m_shuttingDown && !m_disposed) + { + await NotifyCommittedChangeAsync( + server, + "added", + namespaceCountBefore, + CancellationToken.None).ConfigureAwait(false); + } return registration; } catch (Exception ex) when (ex is not OutOfMemoryException) @@ -455,7 +841,8 @@ await NotifyCommittedChangeAsync( cleanupException = await CleanupPreparedAsync( server, host, - prepared).ConfigureAwait(false); + prepared, + allowRequestCallback).ConfigureAwait(false); } NodeManagerRegistration? retainedRegistration = null; @@ -474,38 +861,50 @@ server is not null && m_registrations[retainedRegistration.Id] = new RegistrationState( retainedRegistration, - prepared); + prepared, + allowRequestCallback); } - try + if (CanRecoverRunningServer(server, host)) { - ServerBindings recoveryBindings = - await BindToServerAsync( + try + { + ServerBindings recoveryBindings = + await BindToServerAsync( + server, + nodeManager, + CancellationToken.None).ConfigureAwait(false); + await ReconcileBindingsAsync( server, nodeManager, + recoveryBindings, CancellationToken.None).ConfigureAwait(false); - await ReconcileBindingsAsync( - server, - nodeManager, - recoveryBindings, - CancellationToken.None).ConfigureAwait(false); - await server.RequestManager - .WaitForCurrentRequestsAsync(CancellationToken.None) - .ConfigureAwait(false); - await ReconcileBindingsAsync( - server, - nodeManager, - recoveryBindings, - CancellationToken.None).ConfigureAwait(false); - } - catch (Exception recoveryFailure) when ( - recoveryFailure is not OutOfMemoryException) - { - recoveryException = recoveryFailure; + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + CancellationToken.None) + .ConfigureAwait(false); + EnsureSameRunningServer( + server, + host, + allowRequestCallback); + if (IsCurrentRegistration(retainedRegistration)) + { + await ReconcileBindingsAsync( + server, + nodeManager, + recoveryBindings, + CancellationToken.None).ConfigureAwait(false); + } + } + catch (Exception recoveryFailure) when ( + recoveryFailure is not OutOfMemoryException) + { + recoveryException = recoveryFailure; + } } } - if (server is not null) + if (server is not null && !m_disposed && !m_shuttingDown) { if (nodeManager is not null) { @@ -568,6 +967,8 @@ await NotifyNamespaceTableChangedAsync( private async ValueTask ReloadCoreAsync( NodeManagerRegistration registration, CreateNodeManagerAsync createNodeManager, + ReloadRetirementMode retirementMode, + bool allowRequestCallback, CancellationToken ct) { if (registration is null) @@ -575,8 +976,17 @@ private async ValueTask ReloadCoreAsync( throw new ArgumentNullException(nameof(registration)); } - EnsureNotRequestCallback(); - await m_lifecycleSemaphore.WaitAsync(ct).ConfigureAwait(false); + using OperationLifetime operation = EnterLifecycleOperation(); + bool factoryAllowsRequestCallback = allowRequestCallback; + RegistrationState permissionState = GetCurrentState(registration); + allowRequestCallback = factoryAllowsRequestCallback && + permissionState.AllowLifecycleFromRequestCallback; + (IServerInternal entryServer, _) = + GetRunningServer(allowRequestCallback); + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope? requestWaiter = + EnterRequestLifecycleWaiter(entryServer); + await WaitForLifecycleSemaphoreAsync(requestWaiter, ct) + .ConfigureAwait(false); IAsyncNodeManager? replacementManager = null; PreparedNodeManager? replacement = null; RegistrationState? current = null; @@ -584,12 +994,34 @@ private async ValueTask ReloadCoreAsync( IServerInternal? server = null; IDynamicNodeManagerHost? host = null; int namespaceCountBefore = 0; + bool allowActiveMonitoredItems = + retirementMode != ReloadRetirementMode.Migrate; + bool deferForActiveMonitoredItems = + retirementMode == ReloadRetirementMode.Graceful; + ServiceResult? immediateRetirementError = + retirementMode == ReloadRetirementMode.Immediate + ? new ServiceResult(StatusCodes.BadNodeIdUnknown) + : null; try { - (server, host) = GetRunningServer(); - await CleanupRetiredNodeManagersAsync(server, host).ConfigureAwait(false); - namespaceCountBefore = server.NamespaceUris.Count; + EnsureRequestCallbackAllowed(allowRequestCallback); + (IServerInternal cleanupServer, IDynamicNodeManagerHost cleanupHost) = + GetRunningServer(allowRequestCallback); + await CleanupRetiredNodeManagersAsync(cleanupServer, cleanupHost) + .ConfigureAwait(false); + current = GetCurrentState(registration); + allowRequestCallback = factoryAllowsRequestCallback && + current.AllowLifecycleFromRequestCallback; + EnsureRequestCallbackAllowed(allowRequestCallback); + (server, host) = GetRunningServer(allowRequestCallback); + namespaceCountBefore = server.NamespaceUris.Count; + if (immediateRetirementError is not null) + { + EnsureImmediateRetirementSupported( + server, + current.Prepared.NodeManager); + } replacementManager = await createNodeManager( server, @@ -604,12 +1036,59 @@ await ValidateDataTypeCompatibilityAsync( server, replacementManager, ct).ConfigureAwait(false); - MonitoredItemTransition monitoredItemTransition = - await PrepareMonitoredItemTransitionAsync( - server, - current.Prepared.NodeManager, - replacementManager, - ct).ConfigureAwait(false); + Func? beforeTransitionCommit = null; + Func? afterTransitionCommit = null; + Func? rollbackTransitionCommit = null; + if (!allowActiveMonitoredItems) + { + MonitoredItemTransition monitoredItemTransition = + await PrepareMonitoredItemTransitionAsync( + server, + current.Prepared.NodeManager, + replacementManager, + ct).ConfigureAwait(false); + beforeTransitionCommit = + () => monitoredItemTransition.DetachCurrentAsync(ct); + afterTransitionCommit = async () => + { + List failures = + await monitoredItemTransition.AttachCompatibleAsync( + CancellationToken.None).ConfigureAwait(false); + monitoredItemTransition.MarkDeletedItems(); + try + { + await RecoverDetachedMonitoredItemsAsync( + server, + replacementManager, + CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + failures.Add(ex); + } + + if (failures.Count > 0) + { + throw new AggregateException( + "The replacement NodeManager was committed, but one or more " + + "monitored items could not be attached.", + failures); + } + }; + rollbackTransitionCommit = + () => monitoredItemTransition.RollbackAsync(CancellationToken.None); + } + Func? beforeReloadCommit = beforeTransitionCommit; + if (immediateRetirementError is not null) + { + beforeReloadCommit = () => + { + EnsureImmediateRetirementSupported( + server, + current.Prepared.NodeManager); + return default; + }; + } ArrayOf semanticChanges = GetSemanticChanges( current.Prepared.NodeManager, @@ -634,7 +1113,13 @@ await m_server ct).ConfigureAwait(false); await host - .ReplaceAsync(current.Prepared.NodeManager, replacement, ct) + .ReplaceAsync( + current.Prepared.NodeManager, + replacement, + allowActiveMonitoredItems: allowActiveMonitoredItems, + retainReplacedNotifications: + deferForActiveMonitoredItems, + ct: ct) .ConfigureAwait(false); await CommitWithReconciliationAsync( server, @@ -643,36 +1128,10 @@ await CommitWithReconciliationAsync( replacementManager, bindings, ct, - beforeCommit: () => monitoredItemTransition.DetachCurrentAsync(ct), - afterCommit: async () => - { - List failures = - await monitoredItemTransition.AttachCompatibleAsync( - CancellationToken.None).ConfigureAwait(false); - monitoredItemTransition.MarkDeletedItems(); - try - { - await RecoverDetachedMonitoredItemsAsync( - server, - replacementManager, - CancellationToken.None).ConfigureAwait(false); - } - catch (Exception ex) when (ex is not OutOfMemoryException) - { - failures.Add(ex); - } - - if (failures.Count > 0) - { - throw new AggregateException( - "The replacement NodeManager was committed, but one or more " + - "monitored items could not be attached.", - failures); - } - }, - rollbackCommit: () => - monitoredItemTransition.RollbackAsync( - CancellationToken.None)).ConfigureAwait(false); + beforeCommit: beforeReloadCommit, + afterCommit: afterTransitionCommit, + rollbackCommit: rollbackTransitionCommit).ConfigureAwait(false); + RebuildTypeTree(replacementManager); current.Prepared.Published = false; var nextRegistration = new NodeManagerRegistration( current.Registration.Id, @@ -682,52 +1141,185 @@ await RecoverDetachedMonitoredItemsAsync( { m_registrations[current.Registration.Id] = new RegistrationState( nextRegistration, - replacement); + replacement, + allowRequestCallback); } var retired = new RetiredNodeManager( current.Prepared.NodeManager, droppedInboundReferences, - needsDetachment: true); + needsDetachment: true, + allowActiveMonitoredItems: deferForActiveMonitoredItems, + immediateRetirementError: immediateRetirementError); lock (m_registrationLock) { m_retiredNodeManagers.Add(retired); } + + // Register the drain observer so the host can trigger prompt cleanup once a + // shadow-retired generation's monitored items drain, rather than waiting for + // the next lifecycle operation or server shutdown. + if (deferForActiveMonitoredItems) + { + host.SetRetiredGenerationDrainObserver( + ScheduleRetiredGenerationDrainCleanup); + } + + bool retiredDrainClaimed = + !deferForActiveMonitoredItems || + !HasActiveMonitoredItems( + server, + retired.NodeManager); + bool retiredDrainReady = retiredDrainClaimed; + if (retiredDrainClaimed) + { + if (deferForActiveMonitoredItems) + { + host.SetRetiredGenerationNotifications( + retired.NodeManager, + enabled: false); + retired.NotificationsSuspended = true; + } + retired.DrainPending = true; + await WaitForNotificationDispatchesOutsideLifecycleSemaphoreAsync( + server, + host, + retired.NodeManager) + .ConfigureAwait(false); + if (deferForActiveMonitoredItems && + HasActiveMonitoredItems(server, retired.NodeManager)) + { + host.SetRetiredGenerationNotifications( + retired.NodeManager, + enabled: true); + retired.NotificationsSuspended = false; + retired.DrainPending = false; + retiredDrainReady = false; + } + else + { + InvalidateContinuationPoints(server, retired.NodeManager); + if (immediateRetirementError is not null) + { + await RetireMonitoredItemsAsync( + server, + retired.NodeManager, + immediateRetirementError) + .ConfigureAwait(false); + } + } + } + + Exception? postCommitFailure = null; try { - await server.RequestManager - .WaitForCurrentRequestsAsync(CancellationToken.None) + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + CancellationToken.None) .ConfigureAwait(false); - await ReconcileBindingsAsync( + EnsureSameRunningServer( server, - replacementManager, - bindings, - CancellationToken.None).ConfigureAwait(false); - await CleanupRetiredNodeManagerAsync(server, host, retired) - .ConfigureAwait(false); - lock (m_registrationLock) + host, + allowRequestCallback); + if (IsCurrentRegistration(nextRegistration)) { - m_retiredNodeManagers.Remove(retired); + await ReconcileBindingsAsync( + server, + replacementManager, + bindings, + CancellationToken.None).ConfigureAwait(false); + } + + if (retiredDrainReady) + { + retired.RequestsDrained = true; + if (deferForActiveMonitoredItems && + HasActiveMonitoredItems( + server, + retired.NodeManager)) + { + host.SetRetiredGenerationNotifications( + retired.NodeManager, + enabled: true); + retired.NotificationsSuspended = false; + retired.RequestsDrained = false; + } + else + { + bool cleaned = await CleanupRetiredNodeManagerAsync( + server, + host, + retired).ConfigureAwait(false); + if (cleaned) + { + RemoveRetiredNodeManagerRecord(retired); + } + } } } catch (Exception ex) when (ex is not OutOfMemoryException) { - throw new InvalidOperationException( - "The replacement NodeManager is live, but the retired generation " + - "could not be cleaned up. A later lifecycle operation will retry cleanup.", - ex); + postCommitFailure = ex; + } + finally + { + if (retiredDrainClaimed) + { + try + { + RestoreRetiredNotificationsForActiveItems( + server, + host, + retired); + } + finally + { + retired.DrainPending = false; + } + } } - await NotifyCommittedChangeAsync( - server, - "reloaded", - namespaceCountBefore, - CancellationToken.None, - semanticChanges).ConfigureAwait(false); + if (!m_shuttingDown && !m_disposed) + { + try + { + await NotifyCommittedChangeAsync( + server, + retirementMode switch + { + ReloadRetirementMode.Graceful => "shadow-reloaded", + ReloadRetirementMode.Immediate => "immediate-reloaded", + _ => "reloaded" + }, + namespaceCountBefore, + CancellationToken.None, + semanticChanges).ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + postCommitFailure = postCommitFailure is null + ? ex + : new AggregateException(postCommitFailure, ex); + } + } + + if (postCommitFailure is not null) + { + throw new NodeManagerReloadCommittedException( + nextRegistration, + "The replacement NodeManager is live, but reload completion failed. " + + "A later lifecycle operation will retry retired-generation cleanup.", + postCommitFailure); + } return nextRegistration; } catch (Exception ex) when (ex is not OutOfMemoryException) { + if (ex is NodeManagerReloadCommittedException) + { + throw; + } + Exception? cleanupException = null; if (replacement is not null && !replacement.Published && @@ -736,10 +1328,12 @@ await NotifyCommittedChangeAsync( cleanupException = await CleanupPreparedAsync( server, host, - replacement).ConfigureAwait(false); + replacement, + allowRequestCallback).ConfigureAwait(false); } NodeManagerRegistration? retainedRegistration = null; + NodeManagerRegistration? committedRegistration = null; Exception? recoveryException = null; if (replacement?.Published == true && replacementManager is not null && @@ -750,13 +1344,16 @@ server is not null && bool registrationAlreadyUpdated; lock (m_registrationLock) { - registrationAlreadyUpdated = - m_registrations.TryGetValue( - current.Registration.Id, - out RegistrationState? retainedState) && + registrationAlreadyUpdated = m_registrations.TryGetValue( + current.Registration.Id, + out RegistrationState? retainedState) && ReferenceEquals( retainedState.Registration.NodeManager, replacementManager); + if (registrationAlreadyUpdated) + { + committedRegistration = retainedState!.Registration; + } } if (!registrationAlreadyUpdated) @@ -770,44 +1367,67 @@ server is not null && m_registrations[current.Registration.Id] = new RegistrationState( retainedRegistration, - replacement); + replacement, + allowRequestCallback); m_retiredNodeManagers.Add( new RetiredNodeManager( current.Prepared.NodeManager, droppedInboundReferences, - needsDetachment: true)); + needsDetachment: true, + allowActiveMonitoredItems: deferForActiveMonitoredItems, + immediateRetirementError: immediateRetirementError)); } - try + if (CanRecoverRunningServer(server, host)) { - ServerBindings recoveryBindings = - await BindToServerAsync( + try + { + ServerBindings recoveryBindings = + await BindToServerAsync( + server, + replacementManager, + CancellationToken.None).ConfigureAwait(false); + await ReconcileBindingsAsync( server, replacementManager, + recoveryBindings, CancellationToken.None).ConfigureAwait(false); - await ReconcileBindingsAsync( - server, - replacementManager, - recoveryBindings, - CancellationToken.None).ConfigureAwait(false); - await server.RequestManager - .WaitForCurrentRequestsAsync(CancellationToken.None) - .ConfigureAwait(false); - await ReconcileBindingsAsync( - server, - replacementManager, - recoveryBindings, - CancellationToken.None).ConfigureAwait(false); - } - catch (Exception recoveryFailure) when ( - recoveryFailure is not OutOfMemoryException) - { - recoveryException = recoveryFailure; + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + CancellationToken.None) + .ConfigureAwait(false); + EnsureSameRunningServer( + server, + host, + allowRequestCallback); + if (IsCurrentRegistration(retainedRegistration)) + { + await ReconcileBindingsAsync( + server, + replacementManager, + recoveryBindings, + CancellationToken.None).ConfigureAwait(false); + } + } + catch (Exception recoveryFailure) when ( + recoveryFailure is not OutOfMemoryException) + { + recoveryException = recoveryFailure; + } } } } - if (server is not null) + if (committedRegistration is not null) + { + throw new NodeManagerReloadCommittedException( + committedRegistration, + "The replacement NodeManager is live, but reload completion failed. " + + "A later lifecycle operation will retry retired-generation cleanup.", + ex); + } + + if (server is not null && !m_disposed && !m_shuttingDown) { if (replacementManager is not null) { @@ -836,7 +1456,8 @@ await NotifyNamespaceTableChangedAsync( { failures.Add(recoveryException); } - throw new InvalidOperationException( + throw new NodeManagerReloadCommittedException( + retainedRegistration, "NodeManager reload failed during rollback. " + "The replacement generation was retained and is available " + "from Registrations for retry or removal.", @@ -865,7 +1486,8 @@ await NotifyNamespaceTableChangedAsync( } } - private (IServerInternal Server, IDynamicNodeManagerHost Host) GetRunningServer() + private (IServerInternal Server, IDynamicNodeManagerHost Host) GetRunningServer( + bool allowRequestCallback = false) { if (m_disposed) { @@ -884,7 +1506,8 @@ await NotifyNamespaceTableChangedAsync( } IServerInternal server = m_server.CurrentInstance; - if (server.RequestManager.IsExecutingRequest) + if (server.RequestManager.IsExecutingRequest && + !allowRequestCallback) { throw new InvalidOperationException( "NodeManager lifecycle operations cannot run from an OPC UA request callback."); @@ -897,17 +1520,307 @@ await NotifyNamespaceTableChangedAsync( return (server, host); } - private void EnsureNotRequestCallback() + private OperationLifetime EnterLifecycleOperation() + { + lock (m_operationLifetimeLock) + { + if (m_disposed) + { + throw new ObjectDisposedException(nameof(NodeManagerLifecycle)); + } + if (m_shuttingDown) + { + throw new InvalidOperationException( + "The NodeManager lifecycle is shutting down."); + } + + m_activeLifecycleOperations++; + return new OperationLifetime(this); + } + } + + private bool TryEnterBackgroundOperation() + { + lock (m_operationLifetimeLock) + { + if (m_disposed || m_shuttingDown) + { + return false; + } + + m_activeLifecycleOperations++; + return true; + } + } + + private void ExitLifecycleOperation() + { + TaskCompletionSource? operationsDrained = null; + bool disposeSemaphore; + lock (m_operationLifetimeLock) + { + if (--m_activeLifecycleOperations == 0) + { + operationsDrained = m_operationsDrained; + m_operationsDrained = null; + } + disposeSemaphore = TryReserveSemaphoreDisposal(); + } + + operationsDrained?.TrySetResult(true); + if (disposeSemaphore) + { + m_lifecycleSemaphore.Dispose(); + } + } + + private Task EnterShutdownMethod() + { + lock (m_operationLifetimeLock) + { + if (m_lifecycleSemaphoreDisposed) + { + throw new ObjectDisposedException(nameof(NodeManagerLifecycle)); + } + + m_shuttingDown = true; + m_activeShutdownMethods++; + if (m_activeLifecycleOperations == 0) + { + return Task.CompletedTask; + } + return (m_operationsDrained ??= + new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously)).Task; + } + } + + private void ExitBeginShutdownMethod(bool shutdownPrepared) + { + bool disposeSemaphore; + lock (m_operationLifetimeLock) + { + if (shutdownPrepared) + { + m_shutdownPrepared = true; + } + m_activeShutdownMethods--; + disposeSemaphore = TryReserveSemaphoreDisposal(); + } + if (disposeSemaphore) + { + m_lifecycleSemaphore.Dispose(); + } + } + + private void ExitCompleteShutdownMethod(bool shutdownCompleted) + { + bool disposeSemaphore; + lock (m_operationLifetimeLock) + { + m_shutdownPrepared = !shutdownCompleted; + m_activeShutdownMethods--; + disposeSemaphore = TryReserveSemaphoreDisposal(); + } + if (disposeSemaphore) + { + m_lifecycleSemaphore.Dispose(); + } + } + + private bool TryReserveSemaphoreDisposal() + { + if (!m_disposeRequested || + m_lifecycleSemaphoreDisposed || + m_activeLifecycleOperations != 0 || + m_activeShutdownMethods != 0 || + m_shutdownPrepared) + { + return false; + } + + m_lifecycleSemaphoreDisposed = true; + return true; + } + + private bool CanRecoverRunningServer( + IServerInternal server, + IDynamicNodeManagerHost host) + { + // Linearize the decision to start rollback recovery with shutdown intent. + lock (m_operationLifetimeLock) + { + return !m_disposed && + !m_shuttingDown && + m_server.CurrentState == ServerState.Running && + ReferenceEquals(m_server.CurrentInstance, server) && + ReferenceEquals(server.NodeManager, host); + } + } + + /// + /// Releases the lifecycle semaphore for a request drain and always reacquires it + /// before returning. Callers must revalidate every server or registration state + /// that can change while the semaphore is released. + /// + private async ValueTask DrainRequestsOutsideLifecycleSemaphoreAsync( + IServerInternal server, + CancellationToken ct) + { + m_lifecycleSemaphore.Release(); + try + { + await server.RequestManager + .WaitForCurrentRequestsAsync(ct) + .ConfigureAwait(false); + } + finally + { + await m_lifecycleSemaphore + .WaitAsync(CancellationToken.None) + .ConfigureAwait(false); + } + } + + private async ValueTask FinalizeNotificationsOutsideLifecycleSemaphoreAsync( + IServerInternal server, + IDynamicNodeManagerHost host, + IAsyncNodeManager nodeManager, + bool allowShuttingDown = false) + { + m_lifecycleSemaphore.Release(); + try + { + await host + .FinalizeRetiredGenerationNotificationsAsync( + nodeManager, + CancellationToken.None) + .ConfigureAwait(false); + } + finally + { + await m_lifecycleSemaphore + .WaitAsync(CancellationToken.None) + .ConfigureAwait(false); + } + + if (!TryGetRunningServer( + out IServerInternal currentServer, + out IDynamicNodeManagerHost currentHost, + allowShuttingDown) || + !ReferenceEquals(currentServer, server) || + !ReferenceEquals(currentHost, host)) + { + throw new InvalidOperationException( + "The running server changed while notification dispatches drained."); + } + } + + private async ValueTask WaitForNotificationDispatchesOutsideLifecycleSemaphoreAsync( + IServerInternal server, + IDynamicNodeManagerHost host, + IAsyncNodeManager nodeManager, + bool allowShuttingDown = false) + { + m_lifecycleSemaphore.Release(); + try + { + await host + .WaitForNotificationDispatchesAsync( + nodeManager, + CancellationToken.None) + .ConfigureAwait(false); + } + finally + { + await m_lifecycleSemaphore + .WaitAsync(CancellationToken.None) + .ConfigureAwait(false); + } + + if (!TryGetRunningServer( + out IServerInternal currentServer, + out IDynamicNodeManagerHost currentHost, + allowShuttingDown) || + !ReferenceEquals(currentServer, server) || + !ReferenceEquals(currentHost, host)) + { + throw new InvalidOperationException( + "The running server changed while notification dispatches drained."); + } + } + + private void EnsureSameRunningServer( + IServerInternal server, + IDynamicNodeManagerHost host, + bool allowRequestCallback) + { + (IServerInternal currentServer, IDynamicNodeManagerHost currentHost) = + GetRunningServer(allowRequestCallback); + if (!ReferenceEquals(currentServer, server) || + !ReferenceEquals(currentHost, host)) + { + throw new InvalidOperationException( + "The running server changed while requests were draining."); + } + } + + private bool IsCurrentRegistration(NodeManagerRegistration registration) + { + lock (m_registrationLock) + { + return m_registrations.TryGetValue( + registration.Id, + out RegistrationState? state) && + state.Registration.Generation == registration.Generation && + ReferenceEquals( + state.Registration.NodeManager, + registration.NodeManager); + } + } + + private void EnsureRequestCallbackAllowed(bool allowRequestCallback) { if (m_server.CurrentState == ServerState.Running && - m_server.CurrentInstance.RequestManager.IsExecutingRequest) + m_server.CurrentInstance.RequestManager.IsExecutingRequest && + !allowRequestCallback) { throw new InvalidOperationException( "NodeManager lifecycle operations cannot run from an OPC UA request callback."); } } - private RegistrationState GetCurrentState(NodeManagerRegistration registration) + private async ValueTask WaitForLifecycleSemaphoreAsync( + RequestManagerLifecycleExtension.RequestLifecycleWaiterScope? requestWaiter, + CancellationToken ct) + { + Task semaphoreWait = m_lifecycleSemaphore.WaitAsync(ct); + requestWaiter?.MarkSemaphoreWaitStarted(); + await semaphoreWait.ConfigureAwait(false); + } + + private static RequestManagerLifecycleExtension.RequestLifecycleWaiterScope? + EnterRequestLifecycleWaiter(IServerInternal server) + { + RequestManagerLifecycleExtension? extension = + server.RequestManager.LifecycleExtension; + return extension is not null && + server.RequestManager.IsExecutingRequest + ? extension.EnterLifecycleWaiter() + : null; + } + + private static bool IsRequestCallbackSafe(IAsyncNodeManagerFactory factory) + { + return factory is IRequestCallbackSafeNodeManagerFactory + { + AllowLifecycleFromRequestCallback: true + }; + } + + private RegistrationState GetCurrentState( + NodeManagerRegistration registration, + bool allowRemovalRetry = false) { lock (m_registrationLock) { @@ -917,7 +1830,10 @@ private RegistrationState GetCurrentState(NodeManagerRegistration registration) state.Registration.Generation != registration.Generation || !ReferenceEquals( state.Registration.NodeManager, - registration.NodeManager)) + registration.NodeManager) || + state.RemovalPending || + (state.ShutdownCleanup.RemovalUnpublished && + !allowRemovalRetry)) { throw new InvalidOperationException( "The registration is stale or is not owned by this lifecycle provider."); @@ -926,6 +1842,67 @@ private RegistrationState GetCurrentState(NodeManagerRegistration registration) } } + private void ClaimRemoval( + NodeManagerRegistration registration, + RegistrationState state) + { + lock (m_registrationLock) + { + if (!m_registrations.TryGetValue( + registration.Id, + out RegistrationState? currentState) || + !ReferenceEquals(currentState, state) || + state.RemovalPending) + { + throw new InvalidOperationException( + "The registration changed while removal was being committed."); + } + state.RemovalPending = true; + } + } + + private void ValidateRemovalClaim( + NodeManagerRegistration registration, + RegistrationState state, + string message) + { + lock (m_registrationLock) + { + if (!m_registrations.TryGetValue( + registration.Id, + out RegistrationState? currentState) || + !ReferenceEquals(currentState, state) || + !state.RemovalPending) + { + throw new InvalidOperationException(message); + } + } + } + + private static void MarkRemovalUnpublished(ShutdownCleanupState cleanup) + { + cleanup.RemovalUnpublished = true; + cleanup.ReferencesRemoved = true; + } + + private static void ResetRemovalUnpublished(ShutdownCleanupState cleanup) + { + cleanup.RemovalUnpublished = false; + cleanup.ReferencesRemoved = false; + } + + private static void MarkRemovalDetached( + ShutdownCleanupState cleanup, + MonitoredItemTransition monitoredItemTransition) + { + if (!cleanup.RemovalMonitoredItemsDeleted) + { + monitoredItemTransition.MarkDeletedItems(); + cleanup.RemovalMonitoredItemsDeleted = true; + } + cleanup.Detached = true; + } + private static async ValueTask PrepareMonitoredItemRemovalAsync( IServerInternal server, @@ -1075,32 +2052,115 @@ item is not IDetachableMonitoredItem throw new NotSupportedException( "The subscription and NodeManager monitored-item ownership snapshots do not match."); } - return (nodeManagerLifecycle, subscriptionItems); - } - - private static bool AreSameNodeManager( - IAsyncNodeManager first, - IAsyncNodeManager second) - { - return ReferenceEquals(first, second) || - ReferenceEquals(first.SyncNodeManager, second.SyncNodeManager); + return (nodeManagerLifecycle, subscriptionItems); + } + + private static bool AreSameNodeManager( + IAsyncNodeManager first, + IAsyncNodeManager second) + { + return ReferenceEquals(first, second) || + ReferenceEquals(first.SyncNodeManager, second.SyncNodeManager); + } + + private static ValueTask RecoverDetachedMonitoredItemsAsync( + IServerInternal server, + IAsyncNodeManager nodeManager, + CancellationToken ct) + { + return server.NodeManager is IDynamicNodeManagerHost recovery + ? recovery.RecoverDetachedMonitoredItemsAsync( + nodeManager, + cancellationToken: ct) + : default; + } + + private static void EnsureNoActiveMonitoredItems( + IServerInternal server, + IAsyncNodeManager nodeManager) + { + if (HasActiveMonitoredItems(server, nodeManager)) + { + throw new InvalidOperationException( + "The NodeManager cannot be reloaded or removed while it owns monitored items."); + } + } + + private static bool HasActiveMonitoredItems( + IServerInternal server, + IAsyncNodeManager nodeManager) + { + foreach (ISubscription subscription in server.SubscriptionManager.GetSubscriptions()) + { + if (subscription.MonitoredItemCount == 0) + { + continue; + } + if (subscription is not ISubscriptionMonitoredItemLifecycle tracker) + { + throw new NotSupportedException( + "The configured subscription cannot verify NodeManager ownership."); + } + if (tracker.HasMonitoredItems(nodeManager)) + { + return true; + } + } + return false; + } + + private static void EnsureImmediateRetirementSupported( + IServerInternal server, + IAsyncNodeManager nodeManager) + { + foreach (ISubscription subscription in server.SubscriptionManager.GetSubscriptions()) + { + if (subscription.MonitoredItemCount == 0) + { + continue; + } + if (subscription is not ISubscriptionMonitoredItemLifecycle tracker) + { + throw new NotSupportedException( + "The configured subscription cannot verify NodeManager ownership."); + } + if (!tracker.HasMonitoredItems(nodeManager)) + { + continue; + } + if (subscription is not INodeManagerMonitoredItemRetirementTracker retirementTracker || + !retirementTracker.CanRetireMonitoredItems(nodeManager)) + { + throw new NotSupportedException( + "The configured subscription cannot retire NodeManager-owned monitored items."); + } + } } - private static ValueTask RecoverDetachedMonitoredItemsAsync( + /// + /// Retires every monitored item owned by the NodeManager, optionally releasing + /// the owner references afterwards. Each subscription and monitored item applies + /// the transition under its own lock, so no additional server-wide mutation lock + /// is taken here. + /// + private static ValueTask RetireMonitoredItemsAsync( IServerInternal server, IAsyncNodeManager nodeManager, - CancellationToken ct) + ServiceResult error, + bool detachOwner = false) { - return server.NodeManager is IDynamicNodeManagerHost recovery - ? recovery.RecoverDetachedMonitoredItemsAsync( - nodeManager, - cancellationToken: ct) - : default; + RetireMonitoredItemsCore(server, nodeManager, error); + if (detachOwner) + { + DetachRetiredMonitoredItemsCore(server, nodeManager); + } + return default; } - private static void EnsureNoActiveMonitoredItems( + private static void RetireMonitoredItemsCore( IServerInternal server, - IAsyncNodeManager nodeManager) + IAsyncNodeManager nodeManager, + ServiceResult error) { foreach (ISubscription subscription in server.SubscriptionManager.GetSubscriptions()) { @@ -1113,10 +2173,28 @@ private static void EnsureNoActiveMonitoredItems( throw new NotSupportedException( "The configured subscription cannot verify NodeManager ownership."); } - if (tracker.HasMonitoredItems(nodeManager)) + if (!tracker.HasMonitoredItems(nodeManager)) { - throw new InvalidOperationException( - "The NodeManager cannot be reloaded or removed while it owns monitored items."); + continue; + } + if (subscription is not INodeManagerMonitoredItemRetirementTracker retirementTracker) + { + throw new NotSupportedException( + "The configured subscription cannot retire NodeManager-owned monitored items."); + } + retirementTracker.RetireMonitoredItems(nodeManager, error); + } + } + + private static void DetachRetiredMonitoredItemsCore( + IServerInternal server, + IAsyncNodeManager nodeManager) + { + foreach (ISubscription subscription in server.SubscriptionManager.GetSubscriptions()) + { + if (subscription is INodeManagerMonitoredItemRetirementTracker retirementTracker) + { + retirementTracker.DetachRetiredMonitoredItems(nodeManager); } } } @@ -1344,24 +2422,29 @@ await nodeManager private static async ValueTask UnbindFromServerAsync( IServerInternal server, IAsyncNodeManager nodeManager, - CancellationToken ct) + CancellationToken ct, + bool unsubscribeAllEvents = true) { - foreach (IEventMonitoredItem monitoredItem in server.EventManager.GetMonitoredItems()) + if (unsubscribeAllEvents) { - if (!monitoredItem.MonitoringAllEvents) + foreach (IEventMonitoredItem monitoredItem in + server.EventManager.GetMonitoredItems()) { - continue; - } + if (!monitoredItem.MonitoringAllEvents) + { + continue; + } - using var eventContext = new OperationContext(monitoredItem); - await nodeManager - .SubscribeToAllEventsAsync( - eventContext, - monitoredItem.SubscriptionId, - monitoredItem, - true, - ct) - .ConfigureAwait(false); + using var eventContext = new OperationContext(monitoredItem); + await nodeManager + .SubscribeToAllEventsAsync( + eventContext, + monitoredItem.SubscriptionId, + monitoredItem, + true, + ct) + .ConfigureAwait(false); + } } foreach (ISession session in server.SessionManager.GetSessions()) @@ -1644,15 +2727,19 @@ private static void RebuildActiveTypeTree(IServerInternal server) { foreach (IAsyncNodeManager nodeManager in server.NodeManager.AsyncNodeManagers) { - if (nodeManager is AsyncCustomNodeManager asyncCustomNodeManager) - { - asyncCustomNodeManager.RebuildTypeTree(); - } - else if (nodeManager.SyncNodeManager is - CustomNodeManager2 customNodeManager) - { - customNodeManager.RebuildTypeTree(); - } + RebuildTypeTree(nodeManager); + } + } + + private static void RebuildTypeTree(IAsyncNodeManager nodeManager) + { + if (nodeManager is AsyncCustomNodeManager asyncCustomNodeManager) + { + asyncCustomNodeManager.RebuildTypeTree(); + } + else if (nodeManager.SyncNodeManager is CustomNodeManager2 customNodeManager) + { + customNodeManager.RebuildTypeTree(); } } @@ -1825,140 +2912,703 @@ await serverObject.UrisVersion ct) .ConfigureAwait(false); } - } - } + } + } + + private static async ValueTask DisposeNodeManagerAsync( + IAsyncNodeManager nodeManager) + { + if (nodeManager is IAsyncDisposable asyncDisposable) + { + await asyncDisposable.DisposeAsync().ConfigureAwait(false); + } + else if (nodeManager is IDisposable disposable) + { + disposable.Dispose(); + } + } + + private async ValueTask CleanupShutdownNodeManagerAsync( + IServerInternal server, + IDynamicNodeManagerHost? host, + IAsyncNodeManager nodeManager, + ShutdownCleanupState cleanup, + List? pendingReferences, + bool destroyAddressSpace, + bool removeDestroyedExternalReferences, + CancellationToken ct) + { + if (!cleanup.NotificationsFinalized) + { + if (host is not null) + { + await host + .FinalizeRetiredGenerationNotificationsAsync(nodeManager, ct) + .ConfigureAwait(false); + } + cleanup.NotificationsFinalized = true; + RecordShutdownCleanupProgress(); + } + + if (!cleanup.ReferencesRemoved) + { + if (pendingReferences is { Count: > 0 }) + { + await server.NodeManager + .RemoveReferencesAsync(pendingReferences, ct) + .ConfigureAwait(false); + pendingReferences.Clear(); + } + cleanup.ReferencesRemoved = true; + RecordShutdownCleanupProgress(); + } + + if (destroyAddressSpace && !cleanup.Destroyed) + { + if (host is not null) + { + await host + .DestroyAddressSpaceAsync( + nodeManager, + ct) + .ConfigureAwait(false); + } + else + { + await nodeManager.DeleteAddressSpaceAsync(ct).ConfigureAwait(false); + } + cleanup.Destroyed = true; + RecordShutdownCleanupProgress(); + } + + if (removeDestroyedExternalReferences && + !cleanup.DestroyedExternalReferencesRemoved) + { + if (host is not null) + { + await host + .RemoveDestroyedExternalReferencesAsync(nodeManager, ct) + .ConfigureAwait(false); + } + cleanup.DestroyedExternalReferencesRemoved = true; + RecordShutdownCleanupProgress(); + } + + if (!cleanup.Released) + { + host?.Release(nodeManager); + cleanup.Released = true; + RecordShutdownCleanupProgress(); + } + + if (!cleanup.Disposed) + { + await DisposeNodeManagerAsync(nodeManager).ConfigureAwait(false); + cleanup.Disposed = true; + RecordShutdownCleanupProgress(); + } + } + + private void RecordShutdownCleanupProgress() + { + Interlocked.Increment(ref m_shutdownCleanupProgress); + } + + private void RemoveRetiredNodeManagerRecord(RetiredNodeManager retired) + { + bool removed; + lock (m_registrationLock) + { + removed = m_retiredNodeManagers.Remove(retired); + } + if (removed) + { + RecordShutdownCleanupProgress(); + } + } + + private static async ValueTask TryDisposeNodeManagerAsync( + IAsyncNodeManager nodeManager) + { + try + { + await DisposeNodeManagerAsync(nodeManager).ConfigureAwait(false); + return null; + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + return ex; + } + } + + private async ValueTask CleanupPreparedAsync( + IServerInternal? server, + IDynamicNodeManagerHost host, + PreparedNodeManager prepared, + bool allowRequestCallback) + { + var failures = new List(); + if (server is not null && prepared.Published) + { + try + { + await FinalizeNotificationsOutsideLifecycleSemaphoreAsync( + server, + host, + prepared.NodeManager, + allowShuttingDown: true) + .ConfigureAwait(false); + await DrainRequestsOutsideLifecycleSemaphoreAsync( + server, + CancellationToken.None) + .ConfigureAwait(false); + EnsureSameRunningServer( + server, + host, + allowRequestCallback); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + failures.Add(ex); + } + } + + Exception? unbindException = null; + if (server is not null) + { + try + { + await UnbindFromServerAsync( + server, + prepared.NodeManager, + CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + unbindException = ex; + failures.Add(ex); + } + } + + Exception? rollbackException = null; + try + { + await host + .RollbackAsync(prepared, CancellationToken.None) + .ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + rollbackException = ex; + failures.Add(ex); + } + + if (prepared.Published && server is not null) + { + host.SetRetiredGenerationNotifications( + prepared.NodeManager, + enabled: true); + } + + if (failures.Count > 1) + { + return new AggregateException( + "NodeManager finalization, unbinding, or structural rollback failed.", + failures); + } + return failures.Count == 1 ? failures[0] : null; + } + + /// + /// Schedules a background pass that disposes any shadow-retired generation whose + /// monitored items have drained. Invoked by the host from an ownership-sensitive + /// monitored item request (for example, the Delete that drains the last item), so + /// the teardown must never run inline on the request path: it is dispatched to the + /// thread pool with the request's execution context suppressed. Background and direct + /// cleanup use the same claim protocol: briefly take the lifecycle semaphore to suspend + /// retired-generation notifications and invalidate continuation points, release it for + /// the request drain, then reacquire and revalidate before destruction. This prevents + /// either cleanup schedule from forming a circular wait with a callback-safe lifecycle + /// call. + /// + private void ScheduleRetiredGenerationDrainCleanup() + { + if (!TryEnterBackgroundOperation()) + { + return; + } + bool scheduled = false; + lock (m_registrationLock) + { + if (m_retiredNodeManagers.Count == 0) + { + ExitLifecycleOperation(); + return; + } + } + + // Suppress the triggering request's execution context so the background pass is + // not observed as running inside an OPC UA request callback. + bool restoreFlow = false; + try + { + if (!ExecutionContext.IsFlowSuppressed()) + { + ExecutionContext.SuppressFlow(); + restoreFlow = true; + } + _ = Task.Run(DrainRetiredGenerationsAsync); + scheduled = true; + } + finally + { + if (restoreFlow) + { + ExecutionContext.RestoreFlow(); + } + if (!scheduled) + { + ExitLifecycleOperation(); + } + } + } + + private async Task DrainRetiredGenerationsAsync() + { + bool semaphoreHeld = false; + try + { + if (!TryGetRunningServer( + out IServerInternal server, + out IDynamicNodeManagerHost host)) + { + return; + } - private static async ValueTask DisposeNodeManagerAsync( - IAsyncNodeManager nodeManager) - { - if (nodeManager is IAsyncDisposable asyncDisposable) + await m_lifecycleSemaphore.WaitAsync(CancellationToken.None) + .ConfigureAwait(false); + semaphoreHeld = true; + if (!TryGetRunningServer( + out IServerInternal currentServer, + out IDynamicNodeManagerHost currentHost) || + !ReferenceEquals(currentServer, server) || + !ReferenceEquals(currentHost, host)) + { + return; + } + await CleanupRetiredNodeManagersAsync(server, host) + .ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) { - await asyncDisposable.DisposeAsync().ConfigureAwait(false); + // Prompt cleanup is best-effort. Any generation that could not be torn down + // here is retried by the next lifecycle operation or server shutdown. } - else if (nodeManager is IDisposable disposable) + finally { - disposable.Dispose(); + if (semaphoreHeld) + { + m_lifecycleSemaphore.Release(); + } + ExitLifecycleOperation(); } } - private static async ValueTask TryDisposeNodeManagerAsync( - IAsyncNodeManager nodeManager) + private bool TryGetRunningServer( + out IServerInternal server, + out IDynamicNodeManagerHost host, + bool allowShuttingDown = false) { - try + server = null!; + host = null!; + if ((m_disposed || m_shuttingDown) && !allowShuttingDown) { - await DisposeNodeManagerAsync(nodeManager).ConfigureAwait(false); - return null; + return false; } - catch (Exception ex) when (ex is not OutOfMemoryException) + if (!allowShuttingDown && + m_server.CurrentState != ServerState.Running) { - return ex; + return false; + } + + IServerInternal runningServer = m_server.CurrentInstance; + if (runningServer.NodeManager is not IDynamicNodeManagerHost dynamicHost) + { + return false; } + + server = runningServer; + host = dynamicHost; + return true; } - private static async ValueTask CleanupPreparedAsync( - IServerInternal? server, + private async ValueTask CleanupRetiredNodeManagersAsync( + IServerInternal server, IDynamicNodeManagerHost host, - PreparedNodeManager prepared) + bool allowShuttingDown = false) { - Exception? unbindException = null; - if (server is not null) + while (true) { + bool pendingDrain; + lock (m_registrationLock) + { + pendingDrain = m_retiredNodeManagers.Any(retired => + retired.DrainPending); + } + + if (pendingDrain) + { + return; + } + + RetiredNodeManager[] retired; + lock (m_registrationLock) + { + retired = [.. m_retiredNodeManagers]; + } + + var claimed = new List(); + foreach (RetiredNodeManager retiredNodeManager in retired) + { + if (retiredNodeManager.DrainPending || + (retiredNodeManager.AllowActiveMonitoredItems && + HasActiveMonitoredItems( + server, + retiredNodeManager.NodeManager))) + { + continue; + } + + if (retiredNodeManager.AllowActiveMonitoredItems && + !retiredNodeManager.NotificationsSuspended) + { + host.SetRetiredGenerationNotifications( + retiredNodeManager.NodeManager, + enabled: false); + retiredNodeManager.NotificationsSuspended = true; + } + retiredNodeManager.RequestsDrained = false; + retiredNodeManager.DrainPending = true; + claimed.Add(retiredNodeManager); + } + + if (claimed.Count == 0) + { + return; + } + try { - await UnbindFromServerAsync( - server, - prepared.NodeManager, - CancellationToken.None).ConfigureAwait(false); + var drainReady = new List(); + foreach (RetiredNodeManager retiredNodeManager in claimed) + { + await WaitForNotificationDispatchesOutsideLifecycleSemaphoreAsync( + server, + host, + retiredNodeManager.NodeManager, + allowShuttingDown) + .ConfigureAwait(false); + + bool stillRetired; + lock (m_registrationLock) + { + stillRetired = + m_retiredNodeManagers.Contains(retiredNodeManager); + } + if (!stillRetired) + { + continue; + } + if (retiredNodeManager.AllowActiveMonitoredItems && + HasActiveMonitoredItems( + server, + retiredNodeManager.NodeManager)) + { + host.SetRetiredGenerationNotifications( + retiredNodeManager.NodeManager, + enabled: true); + retiredNodeManager.NotificationsSuspended = false; + continue; + } + if (retiredNodeManager.NeedsDetachment) + { + InvalidateContinuationPoints( + server, + retiredNodeManager.NodeManager); + if (retiredNodeManager.ImmediateRetirementError is not null) + { + await RetireMonitoredItemsAsync( + server, + retiredNodeManager.NodeManager, + retiredNodeManager.ImmediateRetirementError) + .ConfigureAwait(false); + } + } + drainReady.Add(retiredNodeManager); + } + + if (drainReady.Count == 0) + { + return; + } + + m_lifecycleSemaphore.Release(); + try + { + await server.RequestManager + .WaitForCurrentRequestsAsync(CancellationToken.None) + .ConfigureAwait(false); + } + finally + { + await m_lifecycleSemaphore + .WaitAsync(CancellationToken.None) + .ConfigureAwait(false); + } + + foreach (RetiredNodeManager retiredNodeManager in drainReady) + { + retiredNodeManager.RequestsDrained = true; + } + + if (!TryGetRunningServer( + out IServerInternal currentServer, + out IDynamicNodeManagerHost currentHost, + allowShuttingDown) || + !ReferenceEquals(currentServer, server) || + !ReferenceEquals(currentHost, host)) + { + return; + } + + foreach (RetiredNodeManager retiredNodeManager in drainReady) + { + bool stillRetired; + lock (m_registrationLock) + { + stillRetired = + m_retiredNodeManagers.Contains(retiredNodeManager); + } + if (!stillRetired) + { + continue; + } + if (retiredNodeManager.AllowActiveMonitoredItems && + HasActiveMonitoredItems( + server, + retiredNodeManager.NodeManager)) + { + host.SetRetiredGenerationNotifications( + retiredNodeManager.NodeManager, + enabled: true); + retiredNodeManager.NotificationsSuspended = false; + retiredNodeManager.RequestsDrained = false; + continue; + } + + bool cleaned = await CleanupRetiredNodeManagerAsync( + server, + host, + retiredNodeManager, + allowShuttingDown).ConfigureAwait(false); + if (cleaned) + { + RemoveRetiredNodeManagerRecord(retiredNodeManager); + } + } } - catch (Exception ex) when (ex is not OutOfMemoryException) + finally { - unbindException = ex; + foreach (RetiredNodeManager retiredNodeManager in claimed) + { + try + { + RestoreRetiredNotificationsForActiveItems( + server, + host, + retiredNodeManager); + } + finally + { + retiredNodeManager.DrainPending = false; + } + } } } + } - Exception? rollbackException = null; - try - { - await host - .RollbackAsync(prepared, CancellationToken.None) - .ConfigureAwait(false); - } - catch (Exception ex) when (ex is not OutOfMemoryException) + private void RestoreRetiredNotificationsForActiveItems( + IServerInternal server, + IDynamicNodeManagerHost host, + RetiredNodeManager retired) + { + if (!retired.AllowActiveMonitoredItems || + !retired.NotificationsSuspended || + m_shuttingDown || + m_disposed) { - rollbackException = ex; + return; } - if (unbindException is not null && rollbackException is not null) + if (!TryGetRunningServer( + out IServerInternal currentServer, + out IDynamicNodeManagerHost currentHost) || + !ReferenceEquals(currentServer, server) || + !ReferenceEquals(currentHost, host)) { - return new AggregateException( - "NodeManager unbinding and structural rollback both failed.", - unbindException, - rollbackException); + return; } - return unbindException ?? rollbackException; - } - private async ValueTask CleanupRetiredNodeManagersAsync( - IServerInternal server, - IDynamicNodeManagerHost host) - { - RetiredNodeManager[] retired; lock (m_registrationLock) { - retired = [.. m_retiredNodeManagers]; + if (!m_retiredNodeManagers.Contains(retired)) + { + return; + } } - foreach (RetiredNodeManager retiredNodeManager in retired) + if (!HasActiveMonitoredItems(server, retired.NodeManager)) { - await CleanupRetiredNodeManagerAsync( - server, - host, - retiredNodeManager).ConfigureAwait(false); - lock (m_registrationLock) - { - m_retiredNodeManagers.Remove(retiredNodeManager); - } + return; } + + host.SetRetiredGenerationNotifications( + retired.NodeManager, + enabled: true); + retired.NotificationsSuspended = false; + retired.RequestsDrained = false; } - private static async ValueTask CleanupRetiredNodeManagerAsync( + /// + /// Detaches and destroys a retired NodeManager generation, returning true + /// once fully cleaned up. A shadow-reloaded generation that still owns active + /// monitored items is left untouched (requests, continuation points, and + /// monitored items that already captured it keep working) and false is + /// returned so the caller retries cleanup on a later opportunity. An immediate + /// retirement instead invalidates owned monitored items before detachment; neither + /// policy deletes the client's subscription. + /// + private async ValueTask CleanupRetiredNodeManagerAsync( IServerInternal server, IDynamicNodeManagerHost host, - RetiredNodeManager retired) + RetiredNodeManager retired, + bool allowShuttingDown = false) { + ShutdownCleanupState cleanup = retired.ShutdownCleanup; if (retired.NeedsDetachment) { + if (retired.AllowActiveMonitoredItems && + HasActiveMonitoredItems(server, retired.NodeManager)) + { + return false; + } + + if (retired.AllowActiveMonitoredItems && + !retired.NotificationsSuspended) + { + host.SetRetiredGenerationNotifications( + retired.NodeManager, + enabled: false); + retired.NotificationsSuspended = true; + } + + if (retired.ImmediateRetirementError is not null) + { + await RetireMonitoredItemsAsync( + server, + retired.NodeManager, + retired.ImmediateRetirementError) + .ConfigureAwait(false); + } + if (!retired.RequestsDrained) + { + throw new InvalidOperationException( + "A retired NodeManager cannot be detached before its requests drain."); + } InvalidateContinuationPoints(server, retired.NodeManager); - await server.RequestManager - .WaitForCurrentRequestsAsync(CancellationToken.None) - .ConfigureAwait(false); - InvalidateContinuationPoints(server, retired.NodeManager); + if (retired.ImmediateRetirementError is not null) + { + // A request that captured the old routing generation before the + // switch may have completed monitored-item creation during the + // drain. Retire that late item before detaching the owner. + await RetireMonitoredItemsAsync( + server, + retired.NodeManager, + retired.ImmediateRetirementError, + detachOwner: true) + .ConfigureAwait(false); + } EnsureNoActiveMonitoredItems(server, retired.NodeManager); + if (retired.AllowActiveMonitoredItems && + !cleanup.NotificationsFinalized) + { + await FinalizeNotificationsOutsideLifecycleSemaphoreAsync( + server, + host, + retired.NodeManager, + allowShuttingDown) + .ConfigureAwait(false); + cleanup.NotificationsFinalized = true; + RecordShutdownCleanupProgress(); + } await UnbindFromServerAsync( server, retired.NodeManager, - CancellationToken.None).ConfigureAwait(false); + CancellationToken.None, + unsubscribeAllEvents: !retired.AllowActiveMonitoredItems) + .ConfigureAwait(false); retired.NeedsDetachment = false; + if (!cleanup.Detached) + { + cleanup.Detached = true; + RecordShutdownCleanupProgress(); + } + } + else if (!cleanup.Detached) + { + cleanup.Detached = true; + RecordShutdownCleanupProgress(); } - if (retired.PendingReferences.Count > 0) + if (!cleanup.ReferencesRemoved) { - await server.NodeManager - .RemoveReferencesAsync( - retired.PendingReferences, - CancellationToken.None) + if (retired.PendingReferences.Count > 0) + { + await server.NodeManager + .RemoveReferencesAsync( + retired.PendingReferences, + CancellationToken.None) + .ConfigureAwait(false); + retired.PendingReferences.Clear(); + } + cleanup.ReferencesRemoved = true; + RecordShutdownCleanupProgress(); + } + + if (!cleanup.Destroyed) + { + await host + .DestroyAddressSpaceAsync( + retired.NodeManager, + ct: CancellationToken.None) .ConfigureAwait(false); - retired.PendingReferences.Clear(); + if (!cleanup.NotificationsFinalized) + { + cleanup.NotificationsFinalized = true; + RecordShutdownCleanupProgress(); + } + cleanup.Destroyed = true; + RecordShutdownCleanupProgress(); } - await host - .DestroyAsync( - retired.NodeManager, - removeExternalReferences: false, - ct: CancellationToken.None) - .ConfigureAwait(false); - RebuildActiveTypeTree(server); - await DisposeNodeManagerAsync(retired.NodeManager).ConfigureAwait(false); + if (!cleanup.Disposed) + { + RebuildActiveTypeTree(server); + await DisposeNodeManagerAsync(retired.NodeManager).ConfigureAwait(false); + cleanup.Disposed = true; + RecordShutdownCleanupProgress(); + } + return cleanup.Disposed; } private delegate ValueTask CreateNodeManagerAsync( @@ -1966,8 +3616,22 @@ private delegate ValueTask CreateNodeManagerAsync( ApplicationConfiguration configuration, CancellationToken ct); + /// + /// Tracks monitored items while a NodeManager reload detaches them from the retiring + /// NodeManager and attaches compatible items to the replacement. + /// internal sealed class MonitoredItemTransition { + /// + /// Creates a monitored item transition with the item sets selected during reload + /// preparation. + /// + /// The server that owns the subscriptions being inspected. + /// The lifecycle endpoint for the retiring NodeManager. + /// The lifecycle endpoint for the replacement NodeManager, if any. + /// Items that can be handed to the replacement NodeManager. + /// Items whose nodes disappeared during reload. + /// Optional test hook that verifies subscription ownership. public MonitoredItemTransition( IServerInternal server, INodeManagerMonitoredItemLifecycle current, @@ -1984,6 +3648,12 @@ public MonitoredItemTransition( m_isOwnedBySubscription = isOwnedBySubscription; } + /// + /// Detaches every item still owned by a subscription from the retiring NodeManager. + /// + /// The token that aborts detach work. + /// A task that completes when all current items have detached. + /// The retiring NodeManager rejects a detach. public async ValueTask DetachCurrentAsync(CancellationToken ct) { foreach (IMonitoredItem monitoredItem in m_compatibleItems.Concat(m_deletedItems)) @@ -1996,8 +3666,9 @@ public async ValueTask DetachCurrentAsync(CancellationToken ct) continue; } - ServiceResult result = await m_current - .DetachMonitoredItemAsync(monitoredItem, ct) + ServiceResult result = await m_current.DetachMonitoredItemAsync( + monitoredItem, + ct) .ConfigureAwait(false); if (ServiceResult.IsBad(result)) { @@ -2011,6 +3682,12 @@ public async ValueTask DetachCurrentAsync(CancellationToken ct) } } + /// + /// Attaches compatible items to the replacement NodeManager and records failures + /// that should delete the item instead. + /// + /// The token that aborts attach work. + /// The non-fatal failures that occurred while attempting the attach. public async ValueTask> AttachCompatibleAsync( CancellationToken ct) { @@ -2040,8 +3717,9 @@ public async ValueTask> AttachCompatibleAsync( bool attached = false; try { - ServiceResult result = await m_replacement - .AttachMonitoredItemAsync(monitoredItem, ct) + ServiceResult result = await m_replacement.AttachMonitoredItemAsync( + monitoredItem, + ct) .ConfigureAwait(false); if (ServiceResult.IsGood(result)) { @@ -2073,8 +3751,9 @@ public async ValueTask> AttachCompatibleAsync( m_attachedItems.Remove(monitoredItem); try { - await m_replacement - .DetachMonitoredItemAsync(monitoredItem, ct) + await m_replacement.DetachMonitoredItemAsync( + monitoredItem, + ct) .ConfigureAwait(false); } catch (Exception ex) when (ex is not OutOfMemoryException) @@ -2088,6 +3767,10 @@ await m_replacement return failures; } + /// + /// Marks deleted or incompatible items as removed after the replacement transition + /// succeeds. + /// public void MarkDeletedItems() { foreach (IMonitoredItem monitoredItem in m_deletedItems.Concat(m_failedItems)) @@ -2101,6 +3784,12 @@ public void MarkDeletedItems() } } + /// + /// Reverses the detach and attach steps already completed by this transition. + /// + /// The token that aborts rollback work. + /// A task that completes when the transition has been restored. + /// One or more monitored items could not be restored. public async ValueTask RollbackAsync(CancellationToken ct) { var failures = new List(); @@ -2110,8 +3799,9 @@ public async ValueTask RollbackAsync(CancellationToken ct) { try { - ServiceResult result = await m_replacement - .DetachMonitoredItemAsync(m_attachedItems[ii], ct) + ServiceResult result = await m_replacement.DetachMonitoredItemAsync( + m_attachedItems[ii], + ct) .ConfigureAwait(false); if (ServiceResult.IsBad(result)) { @@ -2134,8 +3824,9 @@ public async ValueTask RollbackAsync(CancellationToken ct) try { - ServiceResult result = await m_current - .RecoverMonitoredItemAsync(m_detachedItems[ii], ct) + ServiceResult result = await m_current.RecoverMonitoredItemAsync( + m_detachedItems[ii], + ct) .ConfigureAwait(false); if (ServiceResult.IsBad(result)) { @@ -2240,19 +3931,34 @@ public ValueTask RecoverMonitoredItemAsync( } } + private enum ReloadRetirementMode + { + Migrate, + Graceful, + Immediate + } + private sealed class RegistrationState { public RegistrationState( NodeManagerRegistration registration, - PreparedNodeManager prepared) + PreparedNodeManager prepared, + bool allowLifecycleFromRequestCallback) { Registration = registration; Prepared = prepared; + AllowLifecycleFromRequestCallback = allowLifecycleFromRequestCallback; } public NodeManagerRegistration Registration { get; } public PreparedNodeManager Prepared { get; } + + public bool AllowLifecycleFromRequestCallback { get; } + + public bool RemovalPending { get; set; } + + public ShutdownCleanupState ShutdownCleanup { get; } = new(); } private sealed class ServerBindings @@ -2282,11 +3988,15 @@ private sealed class RetiredNodeManager public RetiredNodeManager( IAsyncNodeManager nodeManager, List pendingReferences, - bool needsDetachment) + bool needsDetachment, + bool allowActiveMonitoredItems = false, + ServiceResult? immediateRetirementError = null) { NodeManager = nodeManager; PendingReferences = pendingReferences; NeedsDetachment = needsDetachment; + AllowActiveMonitoredItems = allowActiveMonitoredItems; + ImmediateRetirementError = immediateRetirementError; } public IAsyncNodeManager NodeManager { get; } @@ -2294,14 +4004,91 @@ public RetiredNodeManager( public List PendingReferences { get; } public bool NeedsDetachment { get; set; } + + /// + /// Gets or sets whether session and existing all-events notifications have + /// been suspended before the final request drain. + /// + public bool NotificationsSuspended { get; set; } + + /// + /// Gets or sets whether all requests that could still call this generation + /// have drained since notifications and continuation points were cut off. + /// + public bool RequestsDrained { get; set; } + + /// + /// Gets or sets whether a background or direct two-phase drain currently owns + /// cleanup. Callback-safe lifecycle operations skip the generation until that + /// pass revalidates. + /// + public bool DrainPending { get; set; } + + /// + /// Gets whether this generation was retired by a shadow reload and may still + /// own active monitored items. Cleanup is deferred rather than rejected while + /// this holds true and monitored items remain. + /// + public bool AllowActiveMonitoredItems { get; } + + /// + /// Gets the status queued to monitored items before immediate cleanup. + /// + public ServiceResult? ImmediateRetirementError { get; } + + public ShutdownCleanupState ShutdownCleanup { get; } = new(); + } + + private sealed class ShutdownCleanupState + { + public bool RemovalUnpublished { get; set; } + + public bool RemovalMonitoredItemsDeleted { get; set; } + + public bool Detached { get; set; } + + public bool NotificationsFinalized { get; set; } + + public bool ReferencesRemoved { get; set; } + + public bool Destroyed { get; set; } + + public bool DestroyedExternalReferencesRemoved { get; set; } + + public bool Released { get; set; } + + public bool Disposed { get; set; } + } + + private sealed class OperationLifetime : IDisposable + { + public OperationLifetime(NodeManagerLifecycle owner) + { + m_owner = owner; + } + + public void Dispose() + { + Interlocked.Exchange(ref m_owner, null)?.ExitLifecycleOperation(); + } + + private NodeManagerLifecycle? m_owner; } private readonly StandardServer m_server; private readonly SemaphoreSlim m_lifecycleSemaphore = new(1, 1); private readonly Lock m_registrationLock = new(); + private readonly Lock m_operationLifetimeLock = new(); private readonly Dictionary m_registrations = []; private readonly List m_retiredNodeManagers = []; - private bool m_disposed; + private TaskCompletionSource? m_operationsDrained; + private int m_activeLifecycleOperations; + private int m_activeShutdownMethods; + private long m_shutdownCleanupProgress; + private bool m_shutdownPrepared; + private bool m_disposeRequested; + private bool m_lifecycleSemaphoreDisposed; + private volatile bool m_disposed; private volatile bool m_shuttingDown; } } diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerReloadCommittedException.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerReloadCommittedException.cs new file mode 100644 index 0000000000..decbb420e0 --- /dev/null +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerReloadCommittedException.cs @@ -0,0 +1,67 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Diagnostics.CodeAnalysis; + +namespace Opc.Ua.Server +{ + /// + /// Reports a reload failure that occurred after the replacement generation + /// was committed and provides its authoritative registration. + /// + [SuppressMessage( + "Design", + "CA1032:Implement standard exception constructors", + Justification = "A committed reload exception is meaningful only with its authoritative registration.")] + public sealed class NodeManagerReloadCommittedException : InvalidOperationException + { + /// + /// Initializes an exception for a reload whose replacement registration already became authoritative. + /// + /// The committed replacement registration that callers must keep. + /// The failure message describing the post-commit error. + /// The exception raised after commit completed. + /// is null. + public NodeManagerReloadCommittedException( + NodeManagerRegistration registration, + string message, + Exception innerException) + : base(message, innerException) + { + Registration = registration ?? throw new ArgumentNullException(nameof(registration)); + } + + /// + /// Gets the committed replacement registration that remains the active NodeManager generation. + /// + public NodeManagerRegistration Registration { get; } + } +} diff --git a/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerRoutingTable.cs b/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerRoutingTable.cs index a69790e91b..943d7faa27 100644 --- a/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerRoutingTable.cs +++ b/src/Opc.Ua.Server/NodeManager/Lifecycle/NodeManagerRoutingTable.cs @@ -532,6 +532,24 @@ public bool IsVisible(IAsyncNodeManager nodeManager) ReferenceEquals(manager, nodeManager)); } + /// + /// Returns whether the given NodeManager is still registered (visible or hidden). + /// A shadow-retired generation removed from the routing table returns false, + /// which callers use to detect that a monitored item is owned by a retired + /// generation rather than a live routing-table manager. + /// + public bool Contains(IAsyncNodeManager nodeManager) + { + if (nodeManager is null) + { + return false; + } + + RoutingSnapshot snapshot = Volatile.Read(ref m_snapshot); + return snapshot.NodeManagers.Any(manager => + ReferenceEquals(manager, nodeManager)); + } + /// /// Shows or hides a registered NodeManager. Committing a lifecycle operation shows the /// NodeManager, and starting to remove one hides it without unregistering it. diff --git a/src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs b/src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs index 40624295f4..4279135498 100644 --- a/src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs +++ b/src/Opc.Ua.Server/NodeManager/MasterNodeManager.cs @@ -41,6 +41,7 @@ namespace Opc.Ua.Server public class MasterNodeManager : IDisposable, IMasterNodeManager, + IMonitoredItemTransferCoordinator, IDynamicNodeManagerHost, ISyncNodeManagerMonitoredItemRecovery { @@ -321,6 +322,8 @@ public virtual async ValueTask StartupAsync(CancellationToken cancellationToken await m_startupShutdownSemaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); try { + m_shutdownCompletedNodeManagers.Clear(); + Volatile.Write(ref m_shutdownCompletedNodeManagerCount, 0); m_logger.MasterNodeManagerStartupNodeManagersCount(m_nodeManagers.Count); // create the address spaces. @@ -374,18 +377,33 @@ public virtual async ValueTask SessionClosingAsync( await m_startupShutdownSemaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); try { - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) + IAsyncNodeManager[] activeNodeManagers = [.. m_nodeManagers]; + NotificationDispatchLease[] dispatches = + GetSessionNotificationDispatches(activeNodeManagers); + try { - try - { - await nodeManager.SessionClosingAsync(context, sessionId, deleteSubscriptions, cancellationToken) - .ConfigureAwait(false); - } - catch (Exception e) + foreach (NotificationDispatchLease dispatch in dispatches) { - m_logger.UnexpectedErrorClosingSessionForNodeManagerNodeManager(e, nodeManager.GetType().Name); + try + { + await dispatch.NodeManager.SessionClosingAsync( + context, + sessionId, + deleteSubscriptions, + cancellationToken).ConfigureAwait(false); + } + catch (Exception e) + { + m_logger.UnexpectedErrorClosingSessionForNodeManagerNodeManager( + e, + dispatch.NodeManager.GetType().Name); + } } } + finally + { + DisposeNotificationDispatches(dispatches); + } } finally { @@ -399,18 +417,32 @@ public virtual async ValueTask SessionActivatedAsync( NodeId sessionId, CancellationToken cancellationToken = default) { - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) + IAsyncNodeManager[] activeNodeManagers = [.. m_nodeManagers]; + NotificationDispatchLease[] dispatches = + GetSessionNotificationDispatches(activeNodeManagers); + try { - try - { - await nodeManager.SessionActivatedAsync(context, sessionId, cancellationToken) - .ConfigureAwait(false); - } - catch (Exception e) + foreach (NotificationDispatchLease dispatch in dispatches) { - m_logger.UnexpectedErrorNotifyingNodeManagerOfSession(e, nodeManager.GetType().Name); + try + { + await dispatch.NodeManager.SessionActivatedAsync( + context, + sessionId, + cancellationToken).ConfigureAwait(false); + } + catch (Exception e) + { + m_logger.UnexpectedErrorNotifyingNodeManagerOfSession( + e, + dispatch.NodeManager.GetType().Name); + } } } + finally + { + DisposeNotificationDispatches(dispatches); + } } /// @@ -420,12 +452,51 @@ public virtual async ValueTask ShutdownAsync(CancellationToken cancellationToken try { - m_logger.MasterNodeManagerShutdownNodeManagersCount(m_nodeManagers.Count); + IAsyncNodeManager[] nodeManagers = [.. m_nodeManagers]; + m_logger.MasterNodeManagerShutdownNodeManagersCount(nodeManagers.Length); + var failures = new List(); + OperationCanceledException? cancellationException = null; - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) + foreach (IAsyncNodeManager nodeManager in nodeManagers) { - await nodeManager.DeleteAddressSpaceAsync(cancellationToken) - .ConfigureAwait(false); + if (m_shutdownCompletedNodeManagers.Any(completed => + ReferenceEquals(completed, nodeManager))) + { + continue; + } + + try + { + cancellationToken.ThrowIfCancellationRequested(); + await nodeManager.DeleteAddressSpaceAsync(cancellationToken) + .ConfigureAwait(false); + m_shutdownCompletedNodeManagers.Add(nodeManager); + Interlocked.Increment(ref m_shutdownCompletedNodeManagerCount); + } + catch (OperationCanceledException ex) when ( + cancellationToken.IsCancellationRequested) + { + cancellationException = ex; + break; + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + failures.Add( + new InvalidOperationException( + $"NodeManager '{nodeManager.GetType().Name}' failed to delete its address space during shutdown.", + ex)); + } + } + + if (cancellationException is not null) + { + throw cancellationException; + } + if (failures.Count > 0) + { + throw new AggregateException( + "One or more NodeManagers failed to delete their address spaces during shutdown.", + failures); } } finally @@ -517,6 +588,8 @@ async ValueTask IDynamicNodeManagerHost.PublishAsync( async ValueTask IDynamicNodeManagerHost.ReplaceAsync( IAsyncNodeManager current, PreparedNodeManager replacement, + bool allowActiveMonitoredItems, + bool retainReplacedNotifications, CancellationToken ct) { if (current is null) @@ -542,6 +615,9 @@ async ValueTask IDynamicNodeManagerHost.ReplaceAsync( } replacement.ReplacedNodeManager = current; replacement.ReplacedExternalReferences = currentExternalReferences; + replacement.AllowActiveMonitoredItems = allowActiveMonitoredItems; + replacement.RetainReplacedNotifications = + retainReplacedNotifications; replacement.Staged = true; } finally @@ -646,8 +722,11 @@ private async ValueTask CommitPreparedNodeManagerAsync( } else { - EnsureNoActiveMonitoredItems( - prepared.ReplacedNodeManager); + if (!prepared.AllowActiveMonitoredItems) + { + EnsureNoActiveMonitoredItems( + prepared.ReplacedNodeManager); + } await CommitReplacementAsync(prepared).ConfigureAwait(false); } prepared.Staged = false; @@ -766,9 +845,8 @@ await AddExternalReferencesAsync( } } - async ValueTask IDynamicNodeManagerHost.DestroyAsync( + async ValueTask IDynamicNodeManagerHost.DestroyAddressSpaceAsync( IAsyncNodeManager nodeManager, - bool removeExternalReferences, CancellationToken ct) { if (nodeManager is null) @@ -776,83 +854,585 @@ async ValueTask IDynamicNodeManagerHost.DestroyAsync( throw new ArgumentNullException(nameof(nodeManager)); } + await FinalizeRetiredGenerationNotificationsAsync(nodeManager, ct) + .ConfigureAwait(false); await m_startupShutdownSemaphoreSlim.WaitAsync(ct).ConfigureAwait(false); try { await nodeManager.DeleteAddressSpaceAsync(ct).ConfigureAwait(false); - if (removeExternalReferences) + RemoveRetiredGenerationNotifications(nodeManager); + } + finally + { + m_startupShutdownSemaphoreSlim.Release(); + } + } + + async ValueTask IDynamicNodeManagerHost.RemoveDestroyedExternalReferencesAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + await m_startupShutdownSemaphoreSlim.WaitAsync(ct).ConfigureAwait(false); + try + { + List referencesToRemove = nodeManager switch + { + AsyncCustomNodeManager asyncCustomNodeManager => + asyncCustomNodeManager.GetRemovedExternalReferences(), + _ when nodeManager.SyncNodeManager is + CustomNodeManager2 customNodeManager => + customNodeManager.GetRemovedExternalReferences(), + _ => [] + }; + if (referencesToRemove.Count > 0) + { + await RemoveReferencesAsync(referencesToRemove, ct).ConfigureAwait(false); + } + if (nodeManager is AsyncCustomNodeManager asyncManagerToClear) + { + asyncManagerToClear.ClearRemovedExternalReferences(); + } + else if (nodeManager.SyncNodeManager is + CustomNodeManager2 syncManagerToClear) + { + syncManagerToClear.ClearRemovedExternalReferences(); + } + } + finally + { + m_startupShutdownSemaphoreSlim.Release(); + } + } + + async ValueTask IDynamicNodeManagerHost.RollbackAsync( + PreparedNodeManager prepared, + CancellationToken ct) + { + ValidatePreparedNodeManager(prepared, allowPublished: true); + + if (prepared.Published) + { + await ((IDynamicNodeManagerHost)this) + .UnpublishAsync(prepared.NodeManager, ct: ct) + .ConfigureAwait(false); + prepared.Published = false; + } + prepared.Staged = false; + m_nodeManagers.RemoveNamespaceManager(prepared.NodeManager); + SetPreparing(prepared.NodeManager, preparing: false); + + await ((IDynamicNodeManagerHost)this) + .DestroyAddressSpaceAsync( + prepared.NodeManager, + ct: ct) + .ConfigureAwait(false); + } + + void IDynamicNodeManagerHost.Release(IAsyncNodeManager nodeManager) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + RemoveRetiredGenerationNotifications(nodeManager); + if (m_dynamicExternalReferences.Remove(nodeManager)) + { + m_nodeManagers.Remove(nodeManager); + } + } + + void IDynamicNodeManagerHost.SetRetiredGenerationDrainObserver(Action? observer) + { + m_retiredGenerationDrainObserver = observer; + } + + void IDynamicNodeManagerHost.SetRetiredGenerationNotifications( + IAsyncNodeManager nodeManager, + bool enabled) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + lock (m_retiredGenerationNotificationsLock) + { + RetiredGenerationNotifications? notifications = + m_retiredGenerationNotifications.FirstOrDefault(candidate => + ReferenceEquals(candidate.NodeManager, nodeManager)); + NotificationDispatchState? dispatchState = + notifications?.DispatchState ?? + m_notificationDispatchStates.FirstOrDefault(candidate => + candidate.References(nodeManager)); + if (dispatchState is not null) + { + dispatchState.Enabled = enabled; + } + if (notifications is not null) + { + notifications.Enabled = enabled; + notifications.AcceptEventDeletes = enabled; + } + } + } + + async ValueTask IDynamicNodeManagerHost.WaitForNotificationDispatchesAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct) + { + await WaitForNotificationDispatchesAsync(nodeManager, ct) + .ConfigureAwait(false); + } + + async ValueTask IDynamicNodeManagerHost + .FinalizeRetiredGenerationNotificationsAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct) + { + await FinalizeRetiredGenerationNotificationsAsync(nodeManager, ct) + .ConfigureAwait(false); + } + + private async ValueTask FinalizeRetiredGenerationNotificationsAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + await WaitForNotificationDispatchesAsync(nodeManager, ct) + .ConfigureAwait(false); + + RetiredGenerationNotifications? notifications; + lock (m_retiredGenerationNotificationsLock) + { + notifications = m_retiredGenerationNotifications.FirstOrDefault( + candidate => ReferenceEquals(candidate.NodeManager, nodeManager)); + } + if (notifications is null) + { + return; + } + + IEventMonitoredItem[] monitoredItems; + lock (m_retiredGenerationNotificationsLock) + { + if (!m_retiredGenerationNotifications.Contains(notifications)) + { + return; + } + monitoredItems = [.. notifications.SubscribedEventMonitoredItems]; + } + + foreach (IEventMonitoredItem monitoredItem in monitoredItems) + { + using var eventContext = new OperationContext(monitoredItem); + await nodeManager + .SubscribeToAllEventsAsync( + eventContext, + monitoredItem.SubscriptionId, + monitoredItem, + true, + ct) + .ConfigureAwait(false); + lock (m_retiredGenerationNotificationsLock) + { + if (m_retiredGenerationNotifications.Contains(notifications)) + { + notifications.SubscribedEventMonitoredItems.RemoveAll( + candidate => ReferenceEquals(candidate, monitoredItem)); + } + } + } + } + + private async ValueTask WaitForNotificationDispatchesAsync( + IAsyncNodeManager nodeManager, + CancellationToken ct) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + Task dispatchesDrained; + lock (m_retiredGenerationNotificationsLock) + { + RetiredGenerationNotifications? notifications = + m_retiredGenerationNotifications.FirstOrDefault( + candidate => ReferenceEquals(candidate.NodeManager, nodeManager)); + NotificationDispatchState dispatchState = + notifications?.DispatchState ?? + GetOrCreateNotificationDispatchState(nodeManager); + dispatchState.Enabled = false; + if (notifications is not null) + { + notifications.Enabled = false; + notifications.AcceptEventDeletes = false; + } + + dispatchesDrained = dispatchState.ActiveDispatches == 0 + ? Task.CompletedTask + : (dispatchState.DispatchesDrained ??= + new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously)).Task; + } + + await dispatchesDrained.WaitAsync(ct).ConfigureAwait(false); + } + + private void RetainRetiredGenerationNotifications( + IAsyncNodeManager nodeManager) + { + List monitoredItems = + [ + .. Server.EventManager.GetMonitoredItems().Where( + monitoredItem => monitoredItem.MonitoringAllEvents) + ]; + lock (m_retiredGenerationNotificationsLock) + { + if (m_retiredGenerationNotifications.Any(candidate => + ReferenceEquals(candidate.NodeManager, nodeManager))) + { + throw new InvalidOperationException( + "The NodeManager is already retained for lifecycle notifications."); + } + NotificationDispatchState dispatchState = + GetOrCreateNotificationDispatchState(nodeManager); + var notifications = new RetiredGenerationNotifications( + nodeManager, + dispatchState, + monitoredItems); + dispatchState.Notifications = notifications; + m_retiredGenerationNotifications.Add(notifications); + } + } + + private void RemoveRetiredGenerationNotifications( + IAsyncNodeManager nodeManager) + { + lock (m_retiredGenerationNotificationsLock) + { + for (int ii = m_retiredGenerationNotifications.Count - 1; ii >= 0; ii--) + { + RetiredGenerationNotifications notifications = + m_retiredGenerationNotifications[ii]; + if (ReferenceEquals(notifications.NodeManager, nodeManager)) + { + m_retiredGenerationNotifications.RemoveAt(ii); + if (ReferenceEquals( + notifications.DispatchState.Notifications, + notifications)) + { + notifications.DispatchState.Notifications = null; + } + if (notifications.DispatchState.Enabled && + notifications.DispatchState.ActiveDispatches == 0) + { + m_notificationDispatchStates.Remove(notifications.DispatchState); + } + } + } + m_notificationDispatchStates.RemoveAll(dispatchState => + dispatchState.Enabled && + dispatchState.ActiveDispatches == 0 && + dispatchState.References(nodeManager)); + } + } + + private NotificationDispatchLease[] GetSessionNotificationDispatches( + IReadOnlyList activeNodeManagers) + { + var dispatches = new List(); + lock (m_retiredGenerationNotificationsLock) + { + foreach (IAsyncNodeManager nodeManager in activeNodeManagers) + { + AddActiveNotificationDispatch(dispatches, nodeManager); + } + foreach (RetiredGenerationNotifications notifications in + m_retiredGenerationNotifications) + { + if (notifications.Enabled && + !ContainsNodeManager(dispatches, notifications.NodeManager)) + { + dispatches.Add( + CreateRetiredNotificationDispatch(notifications)); + } + } + } + return [.. dispatches]; + } + + private NotificationDispatchLease[] GetAllEventNotificationDispatches( + IReadOnlyList activeNodeManagers, + IEventMonitoredItem monitoredItem) + { + var dispatches = new List(); + lock (m_retiredGenerationNotificationsLock) + { + foreach (IAsyncNodeManager nodeManager in activeNodeManagers) + { + AddActiveNotificationDispatch(dispatches, nodeManager); + } + foreach (RetiredGenerationNotifications notifications in + m_retiredGenerationNotifications) + { + if (notifications.Enabled && + notifications.SubscribedEventMonitoredItems.Any(candidate => + ReferenceEquals(candidate, monitoredItem)) && + !ContainsNodeManager(dispatches, notifications.NodeManager)) + { + dispatches.Add( + CreateRetiredNotificationDispatch(notifications)); + } + } + } + return [.. dispatches]; + } + + private NotificationDispatchLease[] GetConditionRefreshDispatches( + IReadOnlyList activeNodeManagers, + IList monitoredItems) + { + var dispatches = new List(); + IEventMonitoredItem[] currentItems = [.. monitoredItems]; + lock (m_retiredGenerationNotificationsLock) + { + foreach (IAsyncNodeManager nodeManager in activeNodeManagers) + { + AddActiveNotificationDispatch( + dispatches, + nodeManager, + currentItems); + } + foreach (RetiredGenerationNotifications notifications in + m_retiredGenerationNotifications) + { + if (!notifications.Enabled || + ContainsNodeManager(dispatches, notifications.NodeManager)) + { + continue; + } + + IEventMonitoredItem[] retainedItems = + [ + .. currentItems.Where(monitoredItem => + notifications.SubscribedEventMonitoredItems.Any(candidate => + ReferenceEquals(candidate, monitoredItem)) || + ReferenceEquals( + monitoredItem.NodeManager, + notifications.NodeManager)) + ]; + if (retainedItems.Length > 0) + { + dispatches.Add( + CreateRetiredNotificationDispatch( + notifications, + retainedItems)); + } + } + } + return [.. dispatches]; + } + + private NotificationDispatchLease[] GetAllEventUnsubscribeDispatches( + IEventMonitoredItem monitoredItem) + { + IAsyncNodeManager[] activeNodeManagers = [.. m_nodeManagers]; + var dispatches = new List(); + lock (m_retiredGenerationNotificationsLock) + { + foreach (IAsyncNodeManager nodeManager in activeNodeManagers) + { + AddActiveNotificationDispatch(dispatches, nodeManager); + } + foreach (RetiredGenerationNotifications notifications in + m_retiredGenerationNotifications) + { + if (notifications.AcceptEventDeletes && + notifications.SubscribedEventMonitoredItems.Any(candidate => + ReferenceEquals(candidate, monitoredItem)) && + !ContainsNodeManager(dispatches, notifications.NodeManager)) + { + dispatches.Add( + CreateRetiredNotificationDispatch(notifications)); + } + } + } + return [.. dispatches]; + } + + private void CompleteRetiredAllEventUnsubscribe( + IEventMonitoredItem monitoredItem, + IReadOnlyList dispatches) + { + lock (m_retiredGenerationNotificationsLock) + { + foreach (NotificationDispatchLease dispatch in dispatches) + { + RetiredGenerationNotifications? retired = + dispatch.Notifications; + if (retired is null) + { + continue; + } + if (m_retiredGenerationNotifications.Contains(retired)) + { + retired.SubscribedEventMonitoredItems.RemoveAll(candidate => + ReferenceEquals(candidate, monitoredItem)); + } + } + } + } + + private void CompleteRetiredAllEventUnsubscribe( + IEventMonitoredItem monitoredItem, + RetiredGenerationNotifications notifications) + { + lock (m_retiredGenerationNotificationsLock) + { + if (m_retiredGenerationNotifications.Contains(notifications)) + { + notifications.SubscribedEventMonitoredItems.RemoveAll(candidate => + ReferenceEquals(candidate, monitoredItem)); + } + } + } + + private NotificationDispatchLease CreateRetiredNotificationDispatch( + RetiredGenerationNotifications notifications, + IEventMonitoredItem[]? monitoredItems = null) + { + return CreateNotificationDispatch( + notifications.NodeManager, + notifications.DispatchState, + monitoredItems); + } + + private NotificationDispatchLease? TryCreateActiveNotificationDispatch( + IAsyncNodeManager nodeManager, + IEventMonitoredItem[]? monitoredItems = null) + { + if (m_retiredGenerationNotifications.Any(candidate => + ReferenceEquals(candidate.NodeManager, nodeManager))) + { + return null; + } + NotificationDispatchState dispatchState = + GetOrCreateNotificationDispatchState(nodeManager); + return dispatchState.Enabled + ? CreateNotificationDispatch( + nodeManager, + dispatchState, + monitoredItems) + : null; + } + + private void AddActiveNotificationDispatch( + List dispatches, + IAsyncNodeManager nodeManager, + IEventMonitoredItem[]? monitoredItems = null) + { + NotificationDispatchLease? dispatch = + TryCreateActiveNotificationDispatch(nodeManager, monitoredItems); + try + { + if (dispatch is not null) { - List referencesToRemove = nodeManager switch - { - AsyncCustomNodeManager asyncCustomNodeManager => - asyncCustomNodeManager.GetRemovedExternalReferences(), - _ when nodeManager.SyncNodeManager is - CustomNodeManager2 customNodeManager => - customNodeManager.GetRemovedExternalReferences(), - _ => [] - }; - if (referencesToRemove.Count > 0) - { - await RemoveReferencesAsync( - referencesToRemove, - CancellationToken.None).ConfigureAwait(false); - } - if (nodeManager is AsyncCustomNodeManager asyncManagerToClear) - { - asyncManagerToClear.ClearRemovedExternalReferences(); - } - else if (nodeManager.SyncNodeManager is - CustomNodeManager2 syncManagerToClear) - { - syncManagerToClear.ClearRemovedExternalReferences(); - } + dispatches.Add(dispatch); + dispatch = null; } } finally { - m_startupShutdownSemaphoreSlim.Release(); + dispatch?.Dispose(); } } - async ValueTask IDynamicNodeManagerHost.RollbackAsync( - PreparedNodeManager prepared, - CancellationToken ct) + private NotificationDispatchLease CreateNotificationDispatch( + IAsyncNodeManager nodeManager, + NotificationDispatchState dispatchState, + IEventMonitoredItem[]? monitoredItems) { - ValidatePreparedNodeManager(prepared, allowPublished: true); + dispatchState.ActiveDispatches++; + return new NotificationDispatchLease( + this, + nodeManager, + dispatchState, + monitoredItems ?? []); + } - if (prepared.Published) + private static bool ContainsNodeManager( + IReadOnlyList dispatches, + IAsyncNodeManager nodeManager) + { + return dispatches.Any(dispatch => + ReferenceEquals(dispatch.NodeManager, nodeManager)); + } + + private void ReleaseNotificationDispatch( + NotificationDispatchState dispatchState) + { + TaskCompletionSource? dispatchesDrained = null; + lock (m_retiredGenerationNotificationsLock) { - await ((IDynamicNodeManagerHost)this) - .UnpublishAsync(prepared.NodeManager, ct: ct) - .ConfigureAwait(false); - prepared.Published = false; - } - prepared.Staged = false; - m_nodeManagers.RemoveNamespaceManager(prepared.NodeManager); - SetPreparing(prepared.NodeManager, preparing: false); + Debug.Assert(dispatchState.ActiveDispatches > 0); + if (dispatchState.ActiveDispatches <= 0) + { + return; + } - await ((IDynamicNodeManagerHost)this) - .DestroyAsync( - prepared.NodeManager, - removeExternalReferences: false, - ct: ct) - .ConfigureAwait(false); + if (--dispatchState.ActiveDispatches == 0) + { + dispatchesDrained = dispatchState.DispatchesDrained; + dispatchState.DispatchesDrained = null; + if (dispatchState.Enabled && + !m_retiredGenerationNotifications.Any(notifications => + ReferenceEquals( + notifications.DispatchState, + dispatchState))) + { + m_notificationDispatchStates.Remove(dispatchState); + } + } + } + dispatchesDrained?.TrySetResult(true); } - void IDynamicNodeManagerHost.Release(IAsyncNodeManager nodeManager) + private NotificationDispatchState GetOrCreateNotificationDispatchState( + IAsyncNodeManager nodeManager) { - if (nodeManager is null) + m_notificationDispatchStates.RemoveAll(candidate => + !candidate.IsAlive); + NotificationDispatchState? dispatchState = + m_notificationDispatchStates.FirstOrDefault(candidate => + candidate.References(nodeManager)); + if (dispatchState is null) { - throw new ArgumentNullException(nameof(nodeManager)); + dispatchState = new NotificationDispatchState(nodeManager); + m_notificationDispatchStates.Add(dispatchState); } + return dispatchState; + } - if (m_dynamicExternalReferences.Remove(nodeManager)) + private static void DisposeNotificationDispatches( + IReadOnlyList dispatches) + { + foreach (NotificationDispatchLease dispatch in dispatches) { - m_nodeManagers.Remove(nodeManager); + dispatch.Dispose(); } } - /// void ISyncNodeManagerMonitoredItemRecovery.RecoverDetachedMonitoredItems( IAsyncNodeManager nodeManager, @@ -877,9 +1457,7 @@ void ISyncNodeManagerMonitoredItemRecovery.RecoverDetachedMonitoredItems( continue; } - IReadOnlyList monitoredItems = - lifecycle.GetRecoverableMonitoredItemsSnapshot(nodeIds); - foreach (IMonitoredItem monitoredItem in monitoredItems) + foreach (IMonitoredItem monitoredItem in lifecycle.GetRecoverableMonitoredItemsSnapshot(nodeIds)) { var itemLifecycle = (IDetachableMonitoredItem)monitoredItem; if (!itemLifecycle.IsDetached) @@ -915,7 +1493,6 @@ void ISyncNodeManagerMonitoredItemRecovery.RecoverDetachedMonitoredItems( failures.Add(new ServiceResultException(attachResult)); } } - } if (failures.Count > 0) @@ -1070,14 +1647,6 @@ private static bool IsExpectedRecoveryFailure(ServiceResult result) return null; } - private static bool AreSameNodeManager( - IAsyncNodeManager first, - IAsyncNodeManager second) - { - return ReferenceEquals(first, second) || - ReferenceEquals(first.SyncNodeManager, second.SyncNodeManager); - } - /// public void RegisterNamespaceManager(string namespaceUri, INodeManager nodeManager) { @@ -1799,15 +2368,15 @@ await ValidatePermissionsAndGetMetadataAsync( return permissionResult; } - NodeId targetNodeId = NodeId.Null; - object? targetHandle = null; IAsyncNodeManager? targetOwner = null; NodeMetadata? targetMetadata = null; + if (TryGetExplicitLocalTargetNodeId( item.TargetServerUri, item.TargetNodeId, - out targetNodeId)) + out NodeId targetNodeId)) { + object? targetHandle; (targetHandle, targetOwner) = await GetManagerHandleAsync( targetNodeId, cancellationToken).ConfigureAwait(false); @@ -1972,7 +2541,6 @@ await ValidatePermissionsAndGetMetadataAsync( } NodeId targetNodeId = NodeId.Null; - object? targetHandle = null; IAsyncNodeManager? targetOwner = null; NodeMetadata? targetMetadata = null; bool explicitlyLocalTarget = @@ -1983,6 +2551,7 @@ await ValidatePermissionsAndGetMetadataAsync( out targetNodeId); if (explicitlyLocalTarget) { + object? targetHandle; (targetHandle, targetOwner) = await GetManagerHandleAsync( targetNodeId, cancellationToken).ConfigureAwait(false); @@ -4044,18 +4613,34 @@ public virtual async ValueTask ConditionRefreshAsync( IList monitoredItems, CancellationToken cancellationToken = default) { - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) + IAsyncNodeManager[] activeNodeManagers = [.. m_nodeManagers]; + NotificationDispatchLease[] dispatches = + GetConditionRefreshDispatches( + activeNodeManagers, + monitoredItems); + try { - try - { - await nodeManager.ConditionRefreshAsync(context, monitoredItems, cancellationToken) - .ConfigureAwait(false); - } - catch (Exception e) + foreach (NotificationDispatchLease dispatch in dispatches) { - m_logger.ErrorCallingConditionRefreshAsyncOnAsyncNodeManager(e); + try + { + await dispatch.NodeManager + .ConditionRefreshAsync( + context, + dispatch.MonitoredItems, + cancellationToken) + .ConfigureAwait(false); + } + catch (Exception e) + { + m_logger.ErrorCallingConditionRefreshAsyncOnAsyncNodeManager(e); + } } } + finally + { + DisposeNotificationDispatches(dispatches); + } } /// @@ -4640,6 +5225,13 @@ public virtual async ValueTask ModifyMonitoredItemsAsync( continue; } + ServiceResult? retirementError = GetRetirementError(monitoredItems[ii]); + if (retirementError is not null) + { + errors[ii] = retirementError; + itemsToModify[ii].Processed = true; + continue; + } if (monitoredItems[ii] is IDetachableMonitoredItem { IsDetached: true @@ -4678,19 +5270,19 @@ await ModifyMonitoredItemsForEventsAsync( cancellationToken) .ConfigureAwait(false); - // let each node manager figure out which items it owns. - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) - { - await nodeManager.ModifyMonitoredItemsAsync( - context, - timestampsToReturn, - monitoredItems, - itemsToModify, - errors, - filterResults, - cancellationToken) - .ConfigureAwait(false); - } + // let each owning node manager modify the items it created. Data monitored + // items are dispatched to their recorded owning NodeManager (grouped by + // owner) rather than to visible routing-table managers only, so items still + // owned by a shadow-retired generation are handled by that generation. + await DispatchModifyToOwningNodeManagersAsync( + context, + timestampsToReturn, + monitoredItems, + itemsToModify, + errors, + filterResults, + cancellationToken) + .ConfigureAwait(false); // update results. for (int ii = 0; ii < errors.Count; ii++) @@ -4772,15 +5364,27 @@ private async ValueTask ModifyMonitoredItemsForEventsAsync( // subscribe to all node managers. if ((monitoredItem.MonitoredItemType & MonitoredItemTypeMask.AllEvents) != 0) { - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) + IAsyncNodeManager[] activeNodeManagers = [.. m_nodeManagers]; + NotificationDispatchLease[] dispatches = + GetAllEventNotificationDispatches( + activeNodeManagers, + monitoredItem); + try { - await nodeManager.SubscribeToAllEventsAsync( - context, - monitoredItem.SubscriptionId, - monitoredItem, - false, - cancellationToken) - .ConfigureAwait(false); + foreach (NotificationDispatchLease dispatch in dispatches) + { + await dispatch.NodeManager.SubscribeToAllEventsAsync( + context, + monitoredItem.SubscriptionId, + monitoredItem, + false, + cancellationToken) + .ConfigureAwait(false); + } + } + finally + { + DisposeNotificationDispatches(dispatches); } } // only subscribe to the node manager that owns the node. @@ -4817,61 +5421,384 @@ public virtual void TransferMonitoredItems( errors).AsTask().GetAwaiter().GetResult(); } - /// - public virtual async ValueTask TransferMonitoredItemsAsync( - OperationContext context, - bool sendInitialValues, - IList monitoredItems, - IList errors, - CancellationToken cancellationToken = default) + /// + public virtual async ValueTask TransferMonitoredItemsAsync( + OperationContext context, + bool sendInitialValues, + IList monitoredItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null, + CancellationToken cancellationToken = default) + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + if (monitoredItems == null) + { + throw new ArgumentNullException(nameof(monitoredItems)); + } + if (errors == null) + { + throw new ArgumentNullException(nameof(errors)); + } + + using OperationContext sourceContext = CreateTransferSourceContext( + context, + monitoredItems); + IMonitoredItemTransferTransaction transaction = + await PrepareMonitoredItemsTransferAsync( + context, + sourceContext, + sendInitialValues, + monitoredItems, + errors, + transferOptions, + cancellationToken).ConfigureAwait(false); + try + { + transaction.Commit(); + } + catch (Exception commitError) + { + try + { + await transaction.RollbackAsync(CancellationToken.None).ConfigureAwait(false); + } + catch (Exception rollbackError) + { + throw new AggregateException(commitError, rollbackError); + } + throw; + } + } + + ValueTask + IMonitoredItemTransferCoordinator.PrepareMonitoredItemsTransferAsync( + OperationContext destinationContext, + OperationContext sourceContext, + bool sendInitialValues, + IList monitoredItems, + IList errors, + MonitoredItemTransferOptions? transferOptions, + CancellationToken cancellationToken) + { + return PrepareMonitoredItemsTransferAsync( + destinationContext, + sourceContext, + sendInitialValues, + monitoredItems, + errors, + transferOptions, + cancellationToken); + } + + private async ValueTask + PrepareMonitoredItemsTransferAsync( + OperationContext destinationContext, + OperationContext sourceContext, + bool sendInitialValues, + IList monitoredItems, + IList errors, + MonitoredItemTransferOptions? transferOptions, + CancellationToken cancellationToken) + { + if (destinationContext == null) + { + throw new ArgumentNullException(nameof(destinationContext)); + } + if (sourceContext == null) + { + throw new ArgumentNullException(nameof(sourceContext)); + } + if (monitoredItems == null) + { + throw new ArgumentNullException(nameof(monitoredItems)); + } + if (errors == null) + { + throw new ArgumentNullException(nameof(errors)); + } + + var processedItems = new List(monitoredItems.Count); + var originalErrors = new ServiceResult[errors.Count]; + var resendStates = new bool[monitoredItems.Count]; + var effectiveTransferOptions = new MonitoredItemTransferOptions + { + DeferInitialValues = sendInitialValues || + (transferOptions?.DeferInitialValues ?? false) + }; + + // preset results for unknown nodes + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + IMonitoredItem? monitoredItem = monitoredItems[ii]; + originalErrors[ii] = errors[ii]; + resendStates[ii] = monitoredItem?.IsResendData ?? false; + ServiceResult? retirementError = GetRetirementError(monitoredItem); + bool isDetached = monitoredItem is IDetachableMonitoredItem + { + IsDetached: true + }; + processedItems.Add( + monitoredItem == null || + retirementError is not null || + isDetached); + errors[ii] = retirementError ?? + (isDetached + ? ServiceResult.Good + : new ServiceResult(StatusCodes.BadMonitoredItemIdInvalid)); + } + + var participants = new List(); + List<(IAsyncNodeManager Owner, List Indices)>? owners = + GroupDataMonitoredItemsByOwner( + monitoredItems, + index => processedItems[index]); + if (owners is not null) + { + foreach ((IAsyncNodeManager owner, List indices) in owners) + { + // Present only this owner's items as unprocessed. + bool[] ownedItems = new bool[monitoredItems.Count]; + for (int ii = 0; ii < ownedItems.Length; ii++) + { + ownedItems[ii] = true; + } + foreach (int ii in indices) + { + ownedItems[ii] = false; + } + + try + { + using (MonitoredItemTransferExecution.BeginDeferredInitialValues()) + { + await owner.TransferMonitoredItemsAsync( + destinationContext, + sendInitialValues, + monitoredItems, + ownedItems, + errors, + effectiveTransferOptions, + cancellationToken) + .ConfigureAwait(false); + } + } + catch (Exception transferError) + { + var failedTransaction = new MonitoredItemTransferTransaction( + sourceContext, + sendInitialValues, + monitoredItems, + errors, + originalErrors, + resendStates, + participants, + effectiveTransferOptions); + try + { + await failedTransaction.RollbackAsync(CancellationToken.None) + .ConfigureAwait(false); + } + catch (Exception rollbackError) + { + throw new AggregateException(transferError, rollbackError); + } + throw; + } + + participants.Add( + new MonitoredItemTransferParticipant( + owner, + [.. indices])); + + // Merge the owner's processed marks back into the shared list. + foreach (int ii in indices) + { + if (ownedItems[ii]) + { + processedItems[ii] = true; + } + } + } + } + + return new MonitoredItemTransferTransaction( + sourceContext, + sendInitialValues, + monitoredItems, + errors, + originalErrors, + resendStates, + participants, + effectiveTransferOptions); + } + + private static OperationContext CreateTransferSourceContext( + OperationContext destinationContext, + IList monitoredItems) + { + if (destinationContext == null) + { + throw new ArgumentNullException(nameof(destinationContext)); + } + if (monitoredItems == null) + { + throw new ArgumentNullException(nameof(monitoredItems)); + } + + ISession? sourceSession = null; + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + sourceSession = monitoredItems[ii]?.Session; + if (sourceSession != null) + { + break; + } + } + + return sourceSession != null + ? new OperationContext(sourceSession, destinationContext.DiagnosticsMask) + : new OperationContext( + new RequestHeader(), + null!, + RequestType.Unknown, + RequestLifetime.None); + } + + private sealed class MonitoredItemTransferParticipant + { + public MonitoredItemTransferParticipant( + IAsyncNodeManager nodeManager, + int[] processedItems) + { + NodeManager = nodeManager; + ProcessedItems = processedItems; + } + + public IAsyncNodeManager NodeManager { get; } + + public int[] ProcessedItems { get; } + } + + private sealed class MonitoredItemTransferTransaction : + IMonitoredItemTransferTransaction { - if (context == null) + public MonitoredItemTransferTransaction( + OperationContext sourceContext, + bool sendInitialValues, + IList monitoredItems, + IList errors, + ServiceResult[] originalErrors, + bool[] resendStates, + List participants, + MonitoredItemTransferOptions transferOptions) { - throw new ArgumentNullException(nameof(context)); + m_sourceContext = sourceContext; + m_sendInitialValues = sendInitialValues; + m_monitoredItems = monitoredItems; + m_errors = errors; + m_originalErrors = originalErrors; + m_resendStates = resendStates; + m_participants = participants; + m_transferOptions = transferOptions; } - if (monitoredItems == null) + public void Commit() { - throw new ArgumentNullException(nameof(monitoredItems)); + if (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) + { + throw new InvalidOperationException("The monitored-item transfer is no longer pending."); + } + + if (!m_sendInitialValues) + { + return; + } + + for (int ii = 0; ii < m_monitoredItems.Count; ii++) + { + IMonitoredItem? monitoredItem = m_monitoredItems[ii]; + if (monitoredItem == null || ServiceResult.IsBad(m_errors[ii])) + { + continue; + } + if (monitoredItem is IDetachableMonitoredItem + { + IsDetached: true + } detachedMonitoredItem) + { + detachedMonitoredItem.QueueNodeIdUnknown(); + } + else + { + monitoredItem.SetupResendDataTrigger(); + } + } } - if (errors == null) + public async ValueTask RollbackAsync(CancellationToken cancellationToken) { - throw new ArgumentNullException(nameof(errors)); - } + int previousState = Interlocked.Exchange(ref m_state, 2); + if (previousState == 2) + { + return; + } - var processedItems = new List(monitoredItems.Count); + var rollbackErrors = new List(); + for (int ii = m_participants.Count - 1; ii >= 0; ii--) + { + MonitoredItemTransferParticipant participant = m_participants[ii]; + var processedItems = Enumerable.Repeat(true, m_monitoredItems.Count).ToList(); + for (int jj = 0; jj < participant.ProcessedItems.Length; jj++) + { + processedItems[participant.ProcessedItems[jj]] = false; + } + var errors = Enumerable.Repeat(ServiceResult.Good, m_monitoredItems.Count).ToList(); + try + { + await participant.NodeManager.RollbackMonitoredItemsTransferAsync( + m_sourceContext, + m_monitoredItems, + processedItems, + errors, + m_transferOptions, + cancellationToken) + .ConfigureAwait(false); + } + catch (Exception error) + { + rollbackErrors.Add(error); + } + } - // preset results for unknown nodes - for (int ii = 0; ii < monitoredItems.Count; ii++) - { - IMonitoredItem? monitoredItem = monitoredItems[ii]; - bool isDetached = monitoredItem is IDetachableMonitoredItem + for (int ii = 0; ii < m_monitoredItems.Count; ii++) { - IsDetached: true - }; - processedItems.Add(monitoredItem == null || isDetached); - errors[ii] = isDetached - ? ServiceResult.Good - : new ServiceResult(StatusCodes.BadMonitoredItemIdInvalid); - if (isDetached && sendInitialValues && monitoredItem is not null) + if (m_monitoredItems[ii] is IMonitoredItemTransferState transferState) + { + transferState.RestoreResendDataTrigger(m_resendStates[ii]); + } + m_errors[ii] = m_originalErrors[ii]; + } + + if (rollbackErrors.Count > 0) { - ((IDetachableMonitoredItem)monitoredItem).QueueNodeIdUnknown(); + throw new AggregateException( + "One or more monitored-item owners could not roll back a failed transfer.", + rollbackErrors); } } - // call each node manager. - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) - { - await nodeManager.TransferMonitoredItemsAsync( - context, - sendInitialValues, - monitoredItems, - processedItems, - errors, - cancellationToken) - .ConfigureAwait(false); - } + private readonly OperationContext m_sourceContext; + private readonly bool m_sendInitialValues; + private readonly IList m_monitoredItems; + private readonly IList m_errors; + private readonly ServiceResult[] m_originalErrors; + private readonly bool[] m_resendStates; + private readonly List m_participants; + private readonly MonitoredItemTransferOptions m_transferOptions; + private int m_state; } /// @@ -4920,6 +5847,7 @@ public virtual async ValueTask DeleteMonitoredItemsAsync( for (int ii = 0; ii < itemsToDelete.Count; ii++) { IMonitoredItem? monitoredItem = itemsToDelete[ii]; + ServiceResult? retirementError = GetRetirementError(monitoredItem); bool isDetached = monitoredItem is IDetachableMonitoredItem { IsDetached: true @@ -4927,8 +5855,10 @@ public virtual async ValueTask DeleteMonitoredItemsAsync( processedItems.Add( ServiceResult.IsBad(errors[ii]) || monitoredItem == null || + retirementError is not null || isDetached); - if (isDetached && monitoredItem is not null) + if ((retirementError is not null || isDetached) && + monitoredItem is not null) { errors[ii] = ServiceResult.Good; if ((monitoredItem.MonitoredItemType & MonitoredItemTypeMask.Events) != 0) @@ -4948,17 +5878,21 @@ await DeleteMonitoredItemsForEventsAsync( cancellationToken) .ConfigureAwait(false); - // call each node manager. - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) - { - await nodeManager.DeleteMonitoredItemsAsync( + // call each owning node manager. Data monitored items are dispatched to their + // recorded owning NodeManager (grouped by owner) so items owned by a + // shadow-retired generation are deleted by that generation, draining it. + await DispatchDataMonitoredItemsToOwningNodeManagersAsync( + itemsToDelete, + processedItems, + (owner, ownedItems) => owner.DeleteMonitoredItemsAsync( context, itemsToDelete, - processedItems, + ownedItems, errors, - cancellationToken) - .ConfigureAwait(false); - } + cancellationToken), + notifyRetiredGenerationDrain: true, + cancellationToken) + .ConfigureAwait(false); // fill results for unknown nodes. for (int ii = 0; ii < errors.Count; ii++) @@ -4981,6 +5915,7 @@ private async ValueTask DeleteMonitoredItemsForEventsAsync( IList errors, CancellationToken cancellationToken = default) { + bool retiredGenerationDrained = false; for (int ii = 0; ii < monitoredItems.Count; ii++) { if (processedItems[ii]) @@ -4995,26 +5930,45 @@ private async ValueTask DeleteMonitoredItemsForEventsAsync( continue; } + IAsyncNodeManager owningNodeManager = monitoredItem.NodeManager; processedItems[ii] = true; // unsubscribe to all node managers. if ((monitoredItem.MonitoredItemType & MonitoredItemTypeMask.AllEvents) != 0) { - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) + NotificationDispatchLease[] dispatches = + GetAllEventUnsubscribeDispatches(monitoredItem); + try { - await nodeManager.SubscribeToAllEventsAsync( - context, - subscriptionId, - monitoredItem, - true, - cancellationToken) - .ConfigureAwait(false); + foreach (NotificationDispatchLease dispatch in dispatches) + { + await dispatch.NodeManager.SubscribeToAllEventsAsync( + context, + subscriptionId, + monitoredItem, + true, + cancellationToken) + .ConfigureAwait(false); + if (dispatch.Notifications is not null) + { + CompleteRetiredAllEventUnsubscribe( + monitoredItem, + dispatch.Notifications); + } + } + CompleteRetiredAllEventUnsubscribe( + monitoredItem, + dispatches); + } + finally + { + DisposeNotificationDispatches(dispatches); } } // only unsubscribe to the node manager that owns the node. else { - await monitoredItem.NodeManager.SubscribeToEventsAsync( + await owningNodeManager.SubscribeToEventsAsync( context, monitoredItem.ManagerHandle, subscriptionId, @@ -5025,10 +5979,16 @@ await monitoredItem.NodeManager.SubscribeToEventsAsync( // delete the item. Server.EventManager.DeleteMonitoredItem(monitoredItem.Id); + retiredGenerationDrained |= !m_nodeManagers.Contains(owningNodeManager); // success. errors[ii] = StatusCodes.Good; } + + if (retiredGenerationDrained) + { + m_retiredGenerationDrainObserver?.Invoke(); + } } /// @@ -5060,6 +6020,13 @@ public virtual async ValueTask SetMonitoringModeAsync( for (int ii = 0; ii < itemsToModify.Count; ii++) { IMonitoredItem? monitoredItem = itemsToModify[ii]; + ServiceResult? retirementError = GetRetirementError(monitoredItem); + if (retirementError is not null) + { + processedItems.Add(true); + errors[ii] = retirementError; + continue; + } bool isDetached = monitoredItem is IDetachableMonitoredItem { IsDetached: true @@ -5089,17 +6056,22 @@ public virtual async ValueTask SetMonitoringModeAsync( processedItems, errors); - foreach (IAsyncNodeManager nodeManager in m_nodeManagers) - { - await nodeManager.SetMonitoringModeAsync( + // set the monitoring mode on each owning node manager. Data monitored items are + // dispatched to their recorded owning NodeManager (grouped by owner) so items + // owned by a shadow-retired generation are handled by that generation. + await DispatchDataMonitoredItemsToOwningNodeManagersAsync( + itemsToModify, + processedItems, + (owner, ownedItems) => owner.SetMonitoringModeAsync( context, monitoringMode, itemsToModify, - processedItems, + ownedItems, errors, - cancellationToken) - .ConfigureAwait(false); - } + cancellationToken), + notifyRetiredGenerationDrain: false, + cancellationToken) + .ConfigureAwait(false); // fill results for unknown nodes. for (int ii = 0; ii < errors.Count; ii++) @@ -5145,6 +6117,190 @@ private static void SetMonitoringModeForEvents( } } + /// + /// Groups the unprocessed data monitored items by their recorded owning + /// NodeManager (by reference), preserving the original index of each item. Event + /// items and items already handled (processed) or unknown (null) are skipped. + /// + private static List<(IAsyncNodeManager Owner, List Indices)>? + GroupDataMonitoredItemsByOwner( + IList monitoredItems, + Func isProcessed) + { + List<(IAsyncNodeManager Owner, List Indices)>? owners = null; + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (isProcessed(ii) || monitoredItems[ii] == null) + { + continue; + } + + IAsyncNodeManager owner = monitoredItems[ii].NodeManager; + if (owner is null) + { + continue; + } + + owners ??= []; + int group = -1; + for (int kk = 0; kk < owners.Count; kk++) + { + if (ReferenceEquals(owners[kk].Owner, owner)) + { + group = kk; + break; + } + } + + if (group < 0) + { + owners.Add((owner, [])); + group = owners.Count - 1; + } + + owners[group].Indices.Add(ii); + } + + return owners; + } + + private static ServiceResult? GetRetirementError(IMonitoredItem? monitoredItem) + { + return monitoredItem is IRetirableMonitoredItem { RetirementError: { } error } + ? error + : null; + } + + /// + /// Dispatches an ownership-sensitive data monitored item operation to each item's + /// recorded owning NodeManager rather than to the visible routing-table managers. + /// Each owner is offered only the items it owns (all other indices are pre-marked + /// processed) so a same-namespace replacement generation can never claim monitored + /// items still owned by a shadow-retired generation. Owners that are no longer + /// registered in the routing table are shadow-retired generations; when + /// is set the registered drain + /// observer is notified afterwards so retired generations can be torn down once + /// their monitored items drain. + /// + private async ValueTask DispatchDataMonitoredItemsToOwningNodeManagersAsync( + IList monitoredItems, + List processedItems, + Func, ValueTask> dispatch, + bool notifyRetiredGenerationDrain, + CancellationToken cancellationToken) + { + List<(IAsyncNodeManager Owner, List Indices)>? owners = + GroupDataMonitoredItemsByOwner( + monitoredItems, + index => processedItems[index]); + if (owners is null) + { + return; + } + + bool retiredGenerationDrained = false; + foreach ((IAsyncNodeManager owner, List indices) in owners) + { + // Present only this owner's items as unprocessed. + bool[] ownedItems = new bool[monitoredItems.Count]; + for (int ii = 0; ii < ownedItems.Length; ii++) + { + ownedItems[ii] = true; + } + foreach (int ii in indices) + { + ownedItems[ii] = false; + } + + await dispatch(owner, ownedItems).ConfigureAwait(false); + + // Merge the owner's processed marks back into the shared list. + foreach (int ii in indices) + { + if (ownedItems[ii]) + { + processedItems[ii] = true; + } + } + + if (notifyRetiredGenerationDrain && !m_nodeManagers.Contains(owner)) + { + retiredGenerationDrained = true; + } + } + + if (retiredGenerationDrained) + { + m_retiredGenerationDrainObserver?.Invoke(); + } + } + + /// + /// Dispatches Modify to each data monitored item's recorded owning NodeManager. + /// Modify tracks per-item completion through + /// rather than a processed-flag list, so each owner is isolated by temporarily + /// marking every item it does not own as processed for the duration of its call. + /// + private async ValueTask DispatchModifyToOwningNodeManagersAsync( + OperationContext context, + TimestampsToReturn timestampsToReturn, + IList monitoredItems, + ArrayOf itemsToModify, + IList errors, + IList filterResults, + CancellationToken cancellationToken) + { + List<(IAsyncNodeManager Owner, List Indices)>? owners = + GroupDataMonitoredItemsByOwner( + monitoredItems, + index => itemsToModify[index].Processed); + if (owners is null) + { + return; + } + + foreach ((IAsyncNodeManager owner, List indices) in owners) + { + bool[] ownedItems = new bool[monitoredItems.Count]; + foreach (int ii in indices) + { + ownedItems[ii] = true; + } + + // Temporarily mark every item this owner does not own as processed so it + // only touches its own items, then restore them for the next owner. + var masked = new List(); + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (!ownedItems[ii] && !itemsToModify[ii].Processed) + { + itemsToModify[ii].Processed = true; + masked.Add(ii); + } + } + + try + { + await owner.ModifyMonitoredItemsAsync( + context, + timestampsToReturn, + monitoredItems, + itemsToModify, + errors, + filterResults, + cancellationToken) + .ConfigureAwait(false); + } + finally + { + foreach (int ii in masked) + { + itemsToModify[ii].Processed = false; + } + } + } + } + private static void ValidatePreparedNodeManager( PreparedNodeManager prepared, bool allowPublished = false) @@ -5249,12 +6405,18 @@ private async ValueTask CommitReplacementAsync( bool currentReferenceMutationStarted = false; bool replacementReferenceMutationStarted = false; bool routeReplaced = false; + bool retiredNotificationsRetained = false; try { currentReferenceMutationStarted = true; await RemoveExternalReferencesAsync( currentExternalReferences, CancellationToken.None).ConfigureAwait(false); + if (prepared.RetainReplacedNotifications) + { + RetainRetiredGenerationNotifications(current); + retiredNotificationsRetained = true; + } m_nodeManagers.Replace( current, prepared.NodeManager, @@ -5312,6 +6474,7 @@ await RemoveExternalReferencesAsync( if (currentRestored) { + bool currentVisibilityRestored = !routeReplaced; if (currentReferenceMutationStarted) { try @@ -5337,6 +6500,7 @@ await AddExternalReferencesAsync( m_nodeManagers.SetVisible( current, currentWasVisible); + currentVisibilityRestored = true; } catch (Exception rollbackException) when ( rollbackException is not OutOfMemoryException) @@ -5344,6 +6508,11 @@ await AddExternalReferencesAsync( failures.Add(rollbackException); } } + if (retiredNotificationsRetained && + currentVisibilityRestored) + { + RemoveRetiredGenerationNotifications(current); + } } else { @@ -5524,6 +6693,9 @@ private async ValueTask RemoveExternalReferencesAsync( /// public IReadOnlyList AsyncNodeManagers => [.. m_nodeManagers]; + internal int ShutdownCompletedNodeManagerCount => + Volatile.Read(ref m_shutdownCompletedNodeManagerCount); + /// public IReadOnlyList NodeManagers => [.. m_nodeManagers.Select(manager => manager.SyncNodeManager)]; @@ -6244,10 +7416,95 @@ protected internal static ServiceResult ValidateRolePermissions( private static readonly TimeSpan s_nodeManagementCompensationTimeout = TimeSpan.FromSeconds(5); + + private sealed class NotificationDispatchLease : IDisposable + { + public NotificationDispatchLease( + MasterNodeManager owner, + IAsyncNodeManager nodeManager, + NotificationDispatchState dispatchState, + IEventMonitoredItem[] monitoredItems) + { + m_owner = owner; + NodeManager = nodeManager; + DispatchState = dispatchState; + MonitoredItems = monitoredItems; + } + + public IAsyncNodeManager NodeManager { get; } + + public NotificationDispatchState DispatchState { get; } + + public RetiredGenerationNotifications? Notifications => + DispatchState.Notifications; + + public IEventMonitoredItem[] MonitoredItems { get; } + + public void Dispose() + { + Interlocked.Exchange(ref m_owner, null)? + .ReleaseNotificationDispatch(DispatchState); + } + + private MasterNodeManager? m_owner; + } + + private sealed class RetiredGenerationNotifications + { + public RetiredGenerationNotifications( + IAsyncNodeManager nodeManager, + NotificationDispatchState dispatchState, + List eventMonitoredItems) + { + NodeManager = nodeManager; + DispatchState = dispatchState; + SubscribedEventMonitoredItems = eventMonitoredItems; + } + + public IAsyncNodeManager NodeManager { get; } + + public NotificationDispatchState DispatchState { get; } + + public List SubscribedEventMonitoredItems { get; } + + public bool Enabled { get; set; } = true; + + public bool AcceptEventDeletes { get; set; } = true; + + } + + private sealed class NotificationDispatchState + { + public NotificationDispatchState(IAsyncNodeManager nodeManager) + { + m_nodeManager = new WeakReference(nodeManager); + } + + public bool IsAlive => m_nodeManager.TryGetTarget(out _); + + public bool References(IAsyncNodeManager nodeManager) + { + return m_nodeManager.TryGetTarget(out IAsyncNodeManager? candidate) && + ReferenceEquals(candidate, nodeManager); + } + + public bool Enabled { get; set; } = true; + + public int ActiveDispatches { get; set; } + + public TaskCompletionSource? DispatchesDrained { get; set; } + + public RetiredGenerationNotifications? Notifications { get; set; } + + private readonly WeakReference m_nodeManager; + } + private readonly ILogger m_logger; private readonly SemaphoreSlim m_dynamicMutationSemaphore = new(1, 1); private readonly SemaphoreSlim m_startupShutdownSemaphoreSlim = new(1, 1); private readonly NodeManagerRoutingTable m_nodeManagers; + private readonly List m_shutdownCompletedNodeManagers = []; + private int m_shutdownCompletedNodeManagerCount; private readonly MonitoredItemIdFactory m_monitoredItemIdFactory = new(); private readonly List m_preparingNodeManagers = []; private readonly Lock m_preparingNodeManagersLock = new(); @@ -6256,6 +7513,13 @@ protected internal static ServiceResult ValidateRolePermissions( private readonly Dictionary>> m_dynamicExternalReferences = []; + private readonly Lock m_retiredGenerationNotificationsLock = new(); + private readonly List + m_retiredGenerationNotifications = []; + private readonly List + m_notificationDispatchStates = []; + private volatile Action? m_retiredGenerationDrainObserver; + private bool m_disposed; } @@ -6495,5 +7759,4 @@ public static partial void DeleteReferencesRollbackFailed2( NodeId source, ExpandedNodeId target); } - } diff --git a/src/Opc.Ua.Server/NodeManager/NodeStateLookupExtensions.cs b/src/Opc.Ua.Server/NodeManager/NodeStateLookupExtensions.cs index 34a8485995..aaa800293c 100644 --- a/src/Opc.Ua.Server/NodeManager/NodeStateLookupExtensions.cs +++ b/src/Opc.Ua.Server/NodeManager/NodeStateLookupExtensions.cs @@ -34,11 +34,12 @@ namespace Opc.Ua.Server.NodeManager { /// /// Linear-scan + dictionary lookups over a node-manager's predefined - /// node collection. Surfaces the three patterns that node-manager + /// node collection. Surfaces the patterns that node-manager /// subclasses repeatedly hand-roll against /// CustomNodeManager.PredefinedNodes / /// AsyncCustomNodeManager.PredefinedNodes: - /// browse-name root lookup, NodeId lookup, and TypeDefinitionId scan. + /// browse-name root lookup, NodeId lookup, TypeDefinitionId scan, and + /// DataType scan. /// public static class NodeStateLookupExtensions { @@ -135,5 +136,42 @@ public static List FindByTypeDefinition( } return results; } + + /// + /// Returns every in + /// whose + /// equals + /// . The list is empty when no match + /// exists; non-variable nodes are skipped. + /// + /// + /// The set to scan, typically PredefinedNodes.Values. + /// + /// + /// DataType NodeId to match (e.g. a known DataTypeIds + /// constant). + /// + /// + /// is . + /// + public static ArrayOf FindByDataType( + this IEnumerable nodes, + NodeId dataTypeId) + { + if (nodes == null) + { + throw new ArgumentNullException(nameof(nodes)); + } + var results = new List(); + foreach (NodeState node in nodes) + { + if (node is BaseVariableState variable && + variable.DataType == dataTypeId) + { + results.Add(node); + } + } + return new ArrayOf(results.ToArray()); + } } } diff --git a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensions.cs b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensions.cs index 4cfc3c60a0..daa833fd04 100644 --- a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensions.cs +++ b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensions.cs @@ -94,5 +94,72 @@ public static ValueTask ReloadRuntimeNodeSetAsync( new RuntimeNodeSetNodeManagerFactory(replacement), ct); } + + /// + /// Replaces a live runtime NodeSet registration from replacement options while + /// allowing the current generation to keep serving monitored items that were + /// already created on it. New service requests are atomically routed to the + /// replacement generation as soon as it is committed; the current generation is + /// retained only for its existing monitored items and any request or continuation + /// point that already captured it, and is disposed automatically once they drain. + /// + /// + /// Thrown when , , or + /// is null. + /// + public static ValueTask ShadowReloadRuntimeNodeSetAsync( + this INodeManagerLifecycle lifecycle, + NodeManagerRegistration registration, + RuntimeNodeSetOptions replacement, + CancellationToken ct = default) + { + if (lifecycle is null) + { + throw new ArgumentNullException(nameof(lifecycle)); + } + if (registration is null) + { + throw new ArgumentNullException(nameof(registration)); + } + if (replacement is null) + { + throw new ArgumentNullException(nameof(replacement)); + } + + return lifecycle.ShadowReloadAsync( + registration, + new RuntimeNodeSetNodeManagerFactory(replacement), + ct); + } + + /// + /// Replaces a live runtime NodeSet registration and immediately invalidates + /// monitored items owned by the previous generation with + /// . + /// + public static ValueTask ImmediateReloadRuntimeNodeSetAsync( + this INodeManagerLifecycle lifecycle, + NodeManagerRegistration registration, + RuntimeNodeSetOptions replacement, + CancellationToken ct = default) + { + if (lifecycle is null) + { + throw new ArgumentNullException(nameof(lifecycle)); + } + if (registration is null) + { + throw new ArgumentNullException(nameof(registration)); + } + if (replacement is null) + { + throw new ArgumentNullException(nameof(replacement)); + } + + return lifecycle.ImmediateReloadAsync( + registration, + new RuntimeNodeSetNodeManagerFactory(replacement), + ct); + } } } diff --git a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManager.cs b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManager.cs index 96aa7141b1..656373bea5 100644 --- a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManager.cs +++ b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManager.cs @@ -30,6 +30,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.ExceptionServices; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -68,13 +69,22 @@ internal sealed class RuntimeNodeSetNodeManager : /// /// /// Namespace URI used as the default for browse-path lookups in - /// the fluent builder. May be null when no - /// callback is set. + /// the fluent builder. May be null when neither + /// nor + /// is set. /// /// /// Optional fluent configuration callback invoked after all /// NodeSet2 nodes have been added to the address space. /// + /// + /// Optional asynchronous fluent configuration callback invoked + /// after (if also set) has run, + /// using the same unsealed builder. May return an + /// owned by this manager's + /// generation; it is disposed asynchronously when the generation + /// is torn down. + /// internal RuntimeNodeSetNodeManager( IServerInternal server, ApplicationConfiguration configuration, @@ -82,13 +92,15 @@ internal RuntimeNodeSetNodeManager( string[] modelNamespaceUris, ParsedNodeSetDocument[] documents, string? defaultNamespaceUri, - Action? configure) + Action? configure, + Func>? configureAsync) : base(server, configuration, logger, modelNamespaceUris) { m_documents = documents ?? throw new ArgumentNullException(nameof(documents)); m_defaultNamespaceUri = defaultNamespaceUri; m_configure = configure; + m_configureAsync = configureAsync; } /// @@ -141,22 +153,108 @@ await AddReverseReferencesAsync(externalReferences, cancellationToken) .ConfigureAwait(false); // Step 6 – Apply the optional fluent configuration. - if (m_configure is not null) + if (m_configure is not null || m_configureAsync is not null) { ushort defaultNsIndex = ResolveDefaultNamespaceIndex(); NodeManagerBuilder builder = CreateFluentBuilder(defaultNsIndex); - m_configure(builder); - builder.Seal(); + m_configure?.Invoke(builder); + + IAsyncDisposable? generationOwner = m_configureAsync is null + ? null + : await m_configureAsync(builder, cancellationToken).ConfigureAwait(false); + try + { + builder.Seal(); + + // Step 7 – Replay NotifyNodeAdded for every predefined node + // so that OnNodeAdded handlers registered in Configure fire. + foreach (KeyValuePair kvp in PredefinedNodes) + { + builder.NotifyNodeAdded(SystemContext, kvp.Value); + } + } + catch (Exception activationException) when ( + activationException is not OutOfMemoryException) + { + if (generationOwner is not null) + { + try + { + await generationOwner.DisposeAsync().ConfigureAwait(false); + } + catch (Exception disposalException) when ( + disposalException is not OutOfMemoryException) + { + throw new AggregateException( + "RuntimeNodeSet configuration and generation owner disposal both failed.", + activationException, + disposalException); + } + } + throw; + } + m_dispatcher = builder.Dispatcher; + m_generationOwner = generationOwner; + } + } + + /// + /// + /// Disposes the generation owner + /// returned by + /// (if any) before releasing the base class's address-space + /// resources. Both steps always run, even if one of them fails, + /// so the owner can never leak. If both fail, the base cleanup + /// failure is treated as primary and reported together with the + /// owner disposal failure via . + /// + public override async ValueTask DeleteAddressSpaceAsync( + CancellationToken cancellationToken = default) + { + IAsyncDisposable? owner = Interlocked.Exchange(ref m_generationOwner, null); + Exception? ownerException = null; - // Step 7 – Replay NotifyNodeAdded for every predefined node - // so that OnNodeAdded handlers registered in Configure fire. - foreach (KeyValuePair kvp in PredefinedNodes) + if (owner is not null) + { + try + { + await owner.DisposeAsync().ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) { - builder.NotifyNodeAdded(SystemContext, kvp.Value); + ownerException = ex; } } + + Exception? baseException = null; + try + { + await base.DeleteAddressSpaceAsync(cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + baseException = ex; + } + + if (baseException is not null && ownerException is not null) + { + throw new AggregateException( + "RuntimeNodeSet address-space cleanup and generation owner disposal both failed.", + baseException, + ownerException); + } + + if (baseException is not null) + { + ExceptionDispatchInfo.Capture(baseException).Throw(); + } + + if (ownerException is not null) + { + ExceptionDispatchInfo.Capture(ownerException).Throw(); + } } /// @@ -211,7 +309,6 @@ await base.AddReferencesAsync(references, cancellationToken) added.Add(reference); } } - } } } @@ -426,6 +523,7 @@ private void RegisterMappingNamespaces(UANodeSet nodeSet) /// on the first duplicate /// detected. /// + /// private static void DetectDuplicateNodeIds(NodeStateCollection nodes) { var seen = new HashSet(); @@ -448,6 +546,7 @@ private static void DetectDuplicateNodeIds(NodeStateCollection nodes) /// Referenced namespaces may appear in NodeSet references, but not as /// NodeIds of nodes imported by this manager. /// + /// private void ValidateOwnedNodeNamespaces(NodeStateCollection nodes) { for (int i = 0; i < nodes.Count; i++) @@ -482,6 +581,7 @@ private void ValidateOwnedNodeNamespaces(NodeStateCollection nodes) /// . Throws when the URI is /// not registered in the server's namespace table. /// + /// private ushort ResolveDefaultNamespaceIndex() { if (string.IsNullOrEmpty(m_defaultNamespaceUri)) @@ -506,8 +606,10 @@ private ushort ResolveDefaultNamespaceIndex() private readonly ParsedNodeSetDocument[] m_documents; private readonly string? m_defaultNamespaceUri; private readonly Action? m_configure; + private readonly Func>? m_configureAsync; private readonly Lock m_addedReferencesLock = new(); private readonly Dictionary> m_addedReferences = []; private IFluentDispatcher? m_dispatcher; + private IAsyncDisposable? m_generationOwner; } } diff --git a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManagerFactory.cs b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManagerFactory.cs index da57e1fcc5..19ceea4752 100644 --- a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManagerFactory.cs +++ b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetNodeManagerFactory.cs @@ -70,7 +70,9 @@ namespace Opc.Ua.Server.RuntimeNodeSet /// . /// /// - public sealed class RuntimeNodeSetNodeManagerFactory : IAsyncNodeManagerFactory + public sealed class RuntimeNodeSetNodeManagerFactory : + IAsyncNodeManagerFactory, + IRequestCallbackSafeNodeManagerFactory { /// /// Initializes the factory from the supplied @@ -80,7 +82,7 @@ public sealed class RuntimeNodeSetNodeManagerFactory : IAsyncNodeManagerFactory /// /// /// Configuration describing the NodeSet2 sources and optional - /// fluent Configure callback. + /// fluent Configure/ConfigureAsync callbacks. /// /// /// is null. @@ -105,6 +107,8 @@ public RuntimeNodeSetNodeManagerFactory(RuntimeNodeSetOptions options) m_sources = [.. options.Sources]; m_defaultNamespaceUri = options.DefaultNamespaceUri; m_configure = options.Configure; + m_configureAsync = options.ConfigureAsync; + AllowLifecycleFromRequestCallback = options.AllowLifecycleFromRequestCallback; NamespacesUris = BuildNamespacesUris(m_sources); if (!string.IsNullOrEmpty(m_defaultNamespaceUri) && @@ -119,6 +123,9 @@ public RuntimeNodeSetNodeManagerFactory(RuntimeNodeSetOptions options) /// public ArrayOf NamespacesUris { get; } + /// + public bool AllowLifecycleFromRequestCallback { get; } + /// public async ValueTask CreateAsync( IServerInternal server, @@ -142,7 +149,7 @@ public async ValueTask CreateAsync( string? defaultNs = ResolveDefaultNamespace( sorted, m_defaultNamespaceUri, - m_configure is not null); + m_configure is not null || m_configureAsync is not null); string[] modelUris = new string[NamespacesUris.Count]; @@ -159,7 +166,8 @@ public async ValueTask CreateAsync( modelUris, sorted, defaultNs, - m_configure); + m_configure, + m_configureAsync); #pragma warning restore CA2000 } @@ -167,6 +175,7 @@ public async ValueTask CreateAsync( /// Scans all sources and builds the deduped, ordered namespace URI list /// used by . /// + /// private static ArrayOf BuildNamespacesUris( ArrayOf sources) { @@ -180,13 +189,9 @@ private static ArrayOf BuildNamespacesUris( for (int i = 0; i < sources.Count; i++) { - RuntimeNodeSetSource source = sources[i]; - - if (source is null) - { + RuntimeNodeSetSource source = sources[i] ?? throw new InvalidOperationException( $"Sources[{i}] is null."); - } ArrayOf modelUris = source.ModelNamespaceUris; if (modelUris.IsNull || modelUris.Count == 0) @@ -222,6 +227,7 @@ private static ArrayOf BuildNamespacesUris( /// Opens each source stream, parses the UANodeSet, validates it, and /// returns the documents sorted in topological dependency order. /// + /// private static async Task ParseAndSortAsync( ArrayOf sources, ILogger logger, @@ -239,13 +245,9 @@ private static async Task ParseAndSortAsync( logger.RuntimeNodeSetParsingSourceSource(sourceName); Stream stream = await source.OpenReadAsync(cancellationToken) - .ConfigureAwait(false); - - if (stream is null) - { + .ConfigureAwait(false) ?? throw new InvalidOperationException( $"The NodeSet2 source '{sourceName}' returned a null stream."); - } UANodeSet? nodeSet; try @@ -301,6 +303,7 @@ private static async Task ParseAndSortAsync( /// File sources declare URIs from their initial metadata scan; stream /// sources declare them explicitly when the source is created. /// + /// private static void ValidateOwnedUris( ArrayOf parsedUris, ArrayOf declaredUris, @@ -337,6 +340,7 @@ private static void ValidateOwnedUris( /// silently ignored (external dependencies). Cycles among the /// included sources raise . /// + /// private static ParsedNodeSetDocument[] TopologicalSort( ParsedNodeSetDocument[] documents, Dictionary modelUriToIndex) @@ -441,14 +445,14 @@ private static ParsedNodeSetDocument[] TopologicalSort( cycleNames.Append(", "); } - cycleNames.Append('\''); - cycleNames.Append(documents[i].SourceName); - cycleNames.Append('\''); + cycleNames.Append('\'') + .Append(documents[i].SourceName) + .Append('\''); } } throw new InvalidOperationException( - $"A circular dependency was detected among the following included " + + "A circular dependency was detected among the following included " + $"NodeSet2 sources: {cycleNames}. Verify the RequiredModel declarations " + "in each source and ensure there are no cycles."); } @@ -458,9 +462,10 @@ private static ParsedNodeSetDocument[] TopologicalSort( /// /// Determines the default namespace URI for the fluent builder. - /// Returns null when no Configure callback is set - /// (the builder is not used). + /// Returns null when neither Configure nor + /// ConfigureAsync is set (the builder is not used). /// + /// private static string? ResolveDefaultNamespace( ParsedNodeSetDocument[] sorted, string? explicitUri, @@ -555,12 +560,19 @@ private static string GetSourceName(RuntimeNodeSetSource source, int index) private readonly ArrayOf m_sources; private readonly string? m_defaultNamespaceUri; private readonly Action? m_configure; + private readonly Func>? m_configureAsync; /// /// Internal representation of a parsed NodeSet2 document and its metadata. /// internal sealed class ParsedNodeSetDocument { + /// + /// Initializes a parsed RuntimeNodeSet source and the namespace models it owns. + /// + /// The parsed UANodeSet document. + /// The model URIs owned by the source. + /// The name used for diagnostics that mention the source. public ParsedNodeSetDocument( UANodeSet nodeSet, ArrayOf ownedModelUris, @@ -571,20 +583,45 @@ public ParsedNodeSetDocument( SourceName = sourceName; } + /// + /// Gets the parsed UANodeSet document. + /// public UANodeSet NodeSet { get; } + + /// + /// Gets the namespace model URIs contributed by the document. + /// public ArrayOf OwnedModelUris { get; } + + /// + /// Gets the source name used in parser and lifecycle diagnostics. + /// public string SourceName { get; } } } + /// + /// Marks a RuntimeNodeSet factory whose lifecycle entry points can safely run while a request + /// callback is suspended. + /// + internal interface IRequestCallbackSafeNodeManagerFactory + { + /// + /// Gets whether request callbacks may enter lifecycle work without deadlocking request drains. + /// + bool AllowLifecycleFromRequestCallback { get; } + } + /// /// Source-generated log messages for RuntimeNodeSetNodeManagerFactory. /// internal static partial class RuntimeNodeSetNodeManagerFactoryLog { + /// + /// Logs that a RuntimeNodeSet source is about to be parsed. + /// [LoggerMessage(EventId = ServerEventIds.RuntimeNodeSetNodeManagerFactory + 0, Level = LogLevel.Information, Message = "RuntimeNodeSet: parsing source '{Source}'.")] public static partial void RuntimeNodeSetParsingSourceSource(this ILogger logger, string? source); } - } diff --git a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetOptions.cs b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetOptions.cs index d625982985..74236761ee 100644 --- a/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetOptions.cs +++ b/src/Opc.Ua.Server/RuntimeNodeSet/RuntimeNodeSetOptions.cs @@ -28,6 +28,8 @@ * ======================================================================*/ using System; +using System.Threading; +using System.Threading.Tasks; using Opc.Ua.Server.Fluent; namespace Opc.Ua.Server.RuntimeNodeSet @@ -81,6 +83,18 @@ public sealed class RuntimeNodeSetOptions /// public string? DefaultNamespaceUri { get; set; } + /// + /// Gets or sets whether lifecycle operations for this runtime NodeSet + /// may be initiated from an OPC UA request callback. + /// + /// + /// Leave this disabled unless the initiating request is handled by a + /// different, stable NodeManager. When enabled, the lifecycle excludes + /// only that initiating request from its request-drain wait while the + /// runtime NodeSet generation is added, replaced, or removed. + /// + public bool AllowLifecycleFromRequestCallback { get; set; } + /// /// Gets or sets an optional callback invoked with the fluent /// after all NodeSet2 nodes @@ -92,5 +106,39 @@ public sealed class RuntimeNodeSetOptions /// statically defined address-space nodes. /// public Action? Configure { get; set; } + + /// + /// Gets or sets an optional asynchronous callback invoked with the + /// fluent after all NodeSet2 + /// nodes have been added to the address space and after + /// (if also set) has run, and before the + /// node manager is published. + /// + /// + /// + /// Use this hook for wiring that requires asynchronous work, such + /// as resolving DataType-typed variables, awaiting an external + /// configuration source, or starting a background loop that must + /// be torn down when the node manager's generation is retired. + /// + /// + /// The callback may return an that + /// represents resources owned by this node manager generation + /// (for example, a running background loop). When non-null, + /// the returned instance is retained for the lifetime of the + /// generation and disposed asynchronously when the generation is + /// torn down (normal removal, reload, shadow-reload retirement, or + /// a failed activation). Returning null is valid when no + /// disposable resource needs to be tracked. + /// + /// + /// Both and + /// operate on the same unsealed builder: when both are set, + /// runs first, then + /// , and the builder is sealed once + /// after both have completed. + /// + /// + public Func>? ConfigureAsync { get; set; } } } diff --git a/src/Opc.Ua.Server/Server/RequestManager.cs b/src/Opc.Ua.Server/Server/RequestManager.cs index 3d23b0955e..6d737e187f 100644 --- a/src/Opc.Ua.Server/Server/RequestManager.cs +++ b/src/Opc.Ua.Server/Server/RequestManager.cs @@ -90,10 +90,18 @@ protected virtual void Dispose(bool disposing) List? requestDrains; lock (m_requestsLock) { + if (m_disposed) + { + return; + } + + m_disposed = true; operations = [.. m_requests.Values]; m_requests.Clear(); requestDrains = [.. m_requestDrains]; m_requestDrains.Clear(); + m_activeValidationScopes.Clear(); + m_lifecycleExtension?.DisposeLocked(); } foreach (OperationContext operation in operations) @@ -138,6 +146,10 @@ public event RequestCancelledEventHandler RequestCancelled /// /// A different request with the same request id is already active. /// + /// + /// A registered request lifecycle extension closed request admission because the server + /// is shutting down. + /// public void RequestReceived(OperationContext context) { if (context == null) @@ -153,12 +165,20 @@ public void RequestReceived(OperationContext context) { if (ReferenceEquals(existingContext, context)) { + m_currentServiceDispatchScope.Value? + .RegisterRequest(context.RequestId); return; } throw new InvalidOperationException( $"A different request with id {context.RequestId} is already active."); } + RequestValidationScope? validationScope = + m_currentValidationScope.Value; + m_lifecycleExtension?.ValidateRequestAdmissionLocked( + validationScope?.ValidationId, + m_activeValidationScopes); m_requests.Add(context.RequestId, context); + m_currentServiceDispatchScope.Value?.RegisterRequest(context.RequestId); if (context.OperationDeadline < DateTime.MaxValue && m_requestTimer == null) { @@ -256,8 +276,48 @@ private void CompleteRequest(OperationContext context) internal IDisposable EnterServiceDispatchScope() { bool previous = m_inServiceDispatch.Value; + ServiceDispatchScope? previousScope = m_currentServiceDispatchScope.Value; + var scope = new ServiceDispatchScope(this, previous, previousScope); m_inServiceDispatch.Value = true; - return new ServiceDispatchScope(this, previous); + m_currentServiceDispatchScope.Value = scope; + return scope; + } + + /// + /// Gets the optional request lifecycle extension registered for server shutdown and + /// NodeManager lifecycle coordination. + /// + internal RequestManagerLifecycleExtension? LifecycleExtension + { + get + { + lock (m_requestsLock) + { + return m_lifecycleExtension; + } + } + } + + /// + /// Registers the optional request lifecycle extension. Calling this method more than once + /// returns the extension that is already registered. + /// + /// The registered request lifecycle extension. + /// + /// The request manager has already been disposed. + /// + internal RequestManagerLifecycleExtension RegisterLifecycleExtension() + { + lock (m_requestsLock) + { + if (m_disposed) + { + throw new ObjectDisposedException(nameof(RequestManager)); + } + + m_lifecycleExtension ??= new RequestManagerLifecycleExtension(this); + return m_lifecycleExtension; + } } /// @@ -277,16 +337,26 @@ internal IDisposable EnterServiceDispatchScope() /// /// /// The scope to dispose once validation has finished. + /// + /// Request admission has been closed because the server is shutting down. + /// internal IDisposable EnterValidationScope() { long validationId = Interlocked.Increment( ref m_lastValidationScopeId); lock (m_requestsLock) { + m_lifecycleExtension?.ValidateValidationAdmissionLocked(); m_activeValidationScopes.Add(validationId); } - return new RequestValidationScope(this, validationId); + RequestValidationScope? previousScope = m_currentValidationScope.Value; + var scope = new RequestValidationScope( + this, + validationId, + previousScope); + m_currentValidationScope.Value = scope; + return scope; } /// @@ -305,17 +375,21 @@ internal IDisposable EnterRequestScope(OperationContext context) } RequestReceived(context); - return new RequestExecutionScope(this, context); + uint? previousRequestId = m_currentRequestId.Value; + m_currentRequestId.Value = context.RequestId; + return new RequestExecutionScope(this, context, previousRequestId); } - /// /// Waits until every request that is currently executing or being validated has finished. /// A lifecycle operation calls this before it retires a NodeManager, so that no request /// can still be dispatching to it once it is torn down. /// - /// Only the requests present when the call starts are awaited. Requests that arrive later - /// already observe the new routing table, so they never reach the retired NodeManager. + /// For a lifecycle drain, only the requests present when the call starts are awaited. + /// Requests that arrive later already observe the new routing table, so they never reach + /// the retired NodeManager. Once shutdown closes request admission, the drain repeats its + /// snapshot until every request admitted before closure has transitioned out of validation + /// and completed. /// /// /// The token used to stop waiting. @@ -326,56 +400,138 @@ internal IDisposable EnterRequestScope(OperationContext context) internal async ValueTask WaitForCurrentRequestsAsync( CancellationToken ct = default) { - RequestDrain requestDrain; + bool repeatUntilIdle; + RequestDrain? requestDrain; TimeSpan budget; lock (m_requestsLock) { - if (m_requests.Count == 0 && - m_activeValidationScopes.Count == 0) + repeatUntilIdle = m_lifecycleExtension?.RepeatDrainUntilIdleLocked == true; + requestDrain = CreateRequestDrainLocked(out budget); + } + + while (requestDrain is not null) + { + using CancellationTokenRegistration registration = ct.Register( + static state => ((RequestDrain)state!).Cancel(), + requestDrain); + try { - return; + Task completion = requestDrain.Completion; + Task expiry = m_timeProvider.Delay(budget, ct); + if (await Task.WhenAny(completion, expiry).ConfigureAwait(false) != completion) + { + ct.ThrowIfCancellationRequested(); + throw new TimeoutException( + $"Timed out after {budget} waiting for the requests that were in flight to " + + "complete. A request that never completes blocks every NodeManager " + + "lifecycle operation, so the operation was abandoned instead of waiting " + + "indefinitely."); + } + + await completion.ConfigureAwait(false); + } + finally + { + lock (m_requestsLock) + { + m_requestDrains.Remove(requestDrain); + } } - List awaited = CollectRequestsToAwait(out budget); - if (awaited.Count == 0 && m_activeValidationScopes.Count == 0) + if (!repeatUntilIdle) { return; } - requestDrain = new RequestDrain( - awaited, - m_activeValidationScopes); - m_requestDrains.Add(requestDrain); + lock (m_requestsLock) + { + requestDrain = CreateRequestDrainLocked(out budget); + } } + } + + private RequestDrain? CreateRequestDrainLocked(out TimeSpan budget) + { + List requestIds = CollectRequestsToAwait(out budget); - using CancellationTokenRegistration registration = ct.Register( - static state => ((RequestDrain)state!).Cancel(), - requestDrain); - try + if (requestIds.Count == 0 && + m_activeValidationScopes.Count == 0) { - Task completion = requestDrain.Completion; - Task expiry = m_timeProvider.Delay(budget, ct); - if (await Task.WhenAny(completion, expiry).ConfigureAwait(false) != completion) - { - ct.ThrowIfCancellationRequested(); - throw new TimeoutException( - $"Timed out after {budget} waiting for the requests that were in flight to " + - "complete. A request that never completes blocks every NodeManager " + - "lifecycle operation, so the operation was abandoned instead of waiting " + - "indefinitely."); - } + return null; + } - await completion.ConfigureAwait(false); + var requestDrain = new RequestDrain( + requestIds, + m_activeValidationScopes); + m_requestDrains.Add(requestDrain); + return requestDrain; + } + + internal uint? GetCurrentRequestIdForLifecycleExtension() + { + return m_currentServiceDispatchScope.Value?.RequestId ?? + m_currentRequestId.Value; + } + + internal void EnterLifecycleWaiter( + RequestManagerLifecycleExtension extension, + uint requestId) + { + lock (m_requestsLock) + { + EnsureLifecycleExtensionRegisteredLocked(extension); + extension.EnterWaiterLocked(requestId, m_requests); } - finally + } + + internal void CloseAdmission(RequestManagerLifecycleExtension extension) + { + lock (m_requestsLock) { - lock (m_requestsLock) + EnsureLifecycleExtensionRegisteredLocked(extension); + extension.CloseAdmissionLocked(); + } + } + + internal void MarkLifecycleWaiterWaiting( + RequestManagerLifecycleExtension extension, + uint requestId) + { + lock (m_requestsLock) + { + EnsureLifecycleExtensionRegisteredLocked(extension); + extension.MarkWaiterWaitingLocked(requestId, m_requestDrains); + } + } + + internal void ExitLifecycleWaiter( + RequestManagerLifecycleExtension extension, + uint requestId, + bool waiting) + { + lock (m_requestsLock) + { + if (ReferenceEquals(m_lifecycleExtension, extension)) { - m_requestDrains.Remove(requestDrain); + extension.ExitWaiterLocked(requestId, waiting); } } } + private void EnsureLifecycleExtensionRegisteredLocked( + RequestManagerLifecycleExtension extension) + { + if (m_disposed) + { + throw new ObjectDisposedException(nameof(RequestManager)); + } + if (!ReferenceEquals(m_lifecycleExtension, extension)) + { + throw new InvalidOperationException( + "The request lifecycle extension is not registered with this request manager."); + } + } + /// /// Returns the requests a drain starting now has to wait for, and how long it may wait. /// @@ -401,6 +557,11 @@ private List CollectRequestsToAwait(out TimeSpan budget) foreach (OperationContext request in m_requests.Values) { + if (m_lifecycleExtension?.ShouldExcludeRequestLocked(request.RequestId) == true) + { + continue; + } + if (request.OperationDeadline < DateTime.MaxValue) { if (request.OperationDeadline < abandoned) @@ -535,21 +696,24 @@ private void OnTimerExpired(object? state) private readonly IServerInternal m_server; private readonly TimeProvider m_timeProvider; private readonly AsyncLocal m_inServiceDispatch = new(); - - + private readonly AsyncLocal m_currentServiceDispatchScope = new(); + private readonly AsyncLocal m_currentRequestId = new(); + private readonly AsyncLocal m_currentValidationScope = new(); private readonly Dictionary m_requests; private readonly List m_requestDrains = []; private readonly Lock m_requestsLock = new(); private readonly HashSet m_activeValidationScopes = []; private long m_lastValidationScopeId; + private RequestManagerLifecycleExtension? m_lifecycleExtension; private ITimer? m_requestTimer; + private bool m_disposed; private event RequestCancelledEventHandler? m_RequestCancelled; /// /// Waits for a fixed set of executing requests and validation scopes to finish. The set is /// captured when the drain is created, so requests that start afterwards do not extend it. /// - private sealed class RequestDrain + internal sealed class RequestDrain { /// /// Initializes a new instance of the class. @@ -580,6 +744,17 @@ public bool Complete(uint requestId) return TryComplete(); } + /// + /// Stops waiting for a request after its lifecycle semaphore wait was queued. + /// + /// The lifecycle-waiting request. + /// true when nothing is left to wait for. + public bool Exclude(uint requestId) + { + m_requestIds.Remove(requestId); + return TryComplete(); + } + /// /// Reports that a validation scope closed. /// @@ -630,12 +805,15 @@ private sealed class RequestExecutionScope : IDisposable /// /// The owning request manager. /// The context of the request being executed. + /// The direct request id to restore on dispose. public RequestExecutionScope( RequestManager requestManager, - OperationContext context) + OperationContext context, + uint? previousRequestId) { m_requestManager = requestManager; m_context = context; + m_previousRequestId = previousRequestId; } /// @@ -647,11 +825,13 @@ public void Dispose() { m_disposed = true; m_requestManager.CompleteRequest(m_context); + m_requestManager.m_currentRequestId.Value = m_previousRequestId; } } private readonly RequestManager m_requestManager; private readonly OperationContext m_context; + private readonly uint? m_previousRequestId; private bool m_disposed; } @@ -660,44 +840,41 @@ public void Dispose() /// private sealed class ServiceDispatchScope : IDisposable { - /// - /// Initializes a new instance of the class. - /// - /// The owning request manager. - /// The value to restore on dispose. - public ServiceDispatchScope(RequestManager requestManager, bool previous) + public ServiceDispatchScope( + RequestManager requestManager, + bool previous, + ServiceDispatchScope? previousScope) { m_requestManager = requestManager; m_previous = previous; + m_previousScope = previousScope; + } + + public uint? RequestId { get; private set; } + + public void RegisterRequest(uint requestId) + { + RequestId ??= requestId; } - /// - /// Restores the value the calling flow had before the request was dispatched. - /// public void Dispose() { if (!m_disposed) { m_disposed = true; m_requestManager.m_inServiceDispatch.Value = m_previous; + m_requestManager.m_currentServiceDispatchScope.Value = m_previousScope; } } private readonly RequestManager m_requestManager; private readonly bool m_previous; + private readonly ServiceDispatchScope? m_previousScope; private bool m_disposed; } /// - /// Tracks the window in which a request is being validated, so that a lifecycle operation - /// cannot retire a NodeManager between the moment validation starts and the moment the - /// validated request starts executing. - /// - /// The scope carries an id of its own rather than the request id, because it opens before - /// the exists and therefore before a request id has been - /// assigned. It tracks no contexts: a validated request is handed over explicitly, by - /// attaching its execution scope to the context that ValidateRequestAsync returns. - /// + /// Tracks request validation admission while no OperationContext exists yet. /// private sealed class RequestValidationScope : IDisposable { @@ -706,14 +883,19 @@ private sealed class RequestValidationScope : IDisposable /// /// The owning request manager. /// The id the drain waits for. + /// The validation scope to restore on dispose. public RequestValidationScope( RequestManager requestManager, - long validationId) + long validationId, + RequestValidationScope? previousScope) { m_requestManager = requestManager; m_validationId = validationId; + m_previousScope = previousScope; } + public long ValidationId => m_validationId; + /// /// Releases the drain that waits for this scope. /// @@ -738,11 +920,13 @@ public void Dispose() } } } + m_requestManager.m_currentValidationScope.Value = m_previousScope; } } private readonly RequestManager m_requestManager; private readonly long m_validationId; + private readonly RequestValidationScope? m_previousScope; private bool m_disposed; } } @@ -764,5 +948,4 @@ internal static partial class RequestManagerLog Message = "Unexpected error reporting RequestCancelled event.")] public static partial void UnexpectedErrorReportingRequestCancelledEvent(this ILogger logger, Exception ex); } - } diff --git a/src/Opc.Ua.Server/Server/RequestManagerLifecycleExtension.cs b/src/Opc.Ua.Server/Server/RequestManagerLifecycleExtension.cs new file mode 100644 index 0000000000..727cddecc7 --- /dev/null +++ b/src/Opc.Ua.Server/Server/RequestManagerLifecycleExtension.cs @@ -0,0 +1,332 @@ +/* ======================================================================== + * Copyright (c) 2005-2025 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; + +namespace Opc.Ua.Server +{ + /// + /// Optional request lifecycle coordination used by server shutdown and NodeManager lifecycle + /// operations. + /// + internal sealed class RequestManagerLifecycleExtension + { + /// + /// Creates coordination state for the request manager that owns the request table lock. + /// + /// The request manager whose lock protects this extension. + /// is null. + internal RequestManagerLifecycleExtension(RequestManager requestManager) + { + m_requestManager = requestManager ?? + throw new ArgumentNullException(nameof(requestManager)); + } + + /// + /// Gets whether a drain that just reached an idle snapshot must repeat because admission + /// is closed and another waiter may have stopped dispatching. + /// + internal bool RepeatDrainUntilIdleLocked => m_admissionClosed; + + /// + /// Atomically prevents admission of new Client requests. Validation scopes admitted + /// before this call remain tracked and may still register and execute their request. + /// + internal void CloseAdmission() + { + m_requestManager.CloseAdmission(this); + } + + /// + /// Registers the current request for an opted-in NodeManager lifecycle operation. + /// The returned scope marks the request as non-dispatching only after its lifecycle + /// semaphore wait has been queued. + /// + /// A scope that unregisters the request when the lifecycle operation exits. + internal RequestLifecycleWaiterScope EnterLifecycleWaiter() + { + uint? currentRequestId = m_requestManager.GetCurrentRequestIdForLifecycleExtension(); + if (!currentRequestId.HasValue || + currentRequestId.Value == uint.MaxValue) + { + throw new InvalidOperationException( + "A lifecycle waiter can only be registered by an executing request."); + } + + uint requestId = currentRequestId.Value; + m_requestManager.EnterLifecycleWaiter(this, requestId); + return new RequestLifecycleWaiterScope(this, requestId); + } + + /// + /// Closes admission while the request manager lock is held. + /// + internal void CloseAdmissionLocked() + { + m_admissionClosed = true; + } + + /// + /// Marks lifecycle coordination disposed and forgets every waiter while the request + /// manager lock is held. + /// + internal void DisposeLocked() + { + m_admissionClosed = true; + m_lifecycleWaiters.Clear(); + } + + /// + /// Rejects a new validation scope after admission has closed. + /// + /// Request admission has already closed. + internal void ValidateValidationAdmissionLocked() + { + if (m_admissionClosed) + { + throw new ServiceResultException(StatusCodes.BadServerHalted); + } + } + + /// + /// Rejects a request unless it belongs to a validation scope admitted before admission + /// closed. + /// + /// The validation scope that admitted the request. + /// The validation scopes still allowed to register requests. + /// The request was not admitted before lifecycle shutdown. + internal void ValidateRequestAdmissionLocked( + long? validationId, + HashSet activeValidationScopes) + { + if (m_admissionClosed && + (!validationId.HasValue || + !activeValidationScopes.Contains(validationId.Value))) + { + throw new ServiceResultException(StatusCodes.BadServerHalted); + } + } + + /// + /// Registers an executing request as a lifecycle waiter while the request manager lock is + /// held. + /// + /// The request that will wait for lifecycle serialization. + /// The active request table used to prove the request is still executing. + /// The request is no longer active. + internal void EnterWaiterLocked( + uint requestId, + IReadOnlyDictionary requests) + { + if (!requests.ContainsKey(requestId)) + { + throw new InvalidOperationException( + "The lifecycle waiter request is no longer active."); + } + + if (m_lifecycleWaiters.TryGetValue( + requestId, + out LifecycleWaiterState? state)) + { + state.RegisteredCount++; + } + else + { + m_lifecycleWaiters.Add(requestId, new LifecycleWaiterState()); + } + } + + /// + /// Determines whether a request should be excluded from an in-progress drain because it + /// has already started waiting on the lifecycle semaphore. + /// + /// The request to test against the waiter table. + /// true when the request is a lifecycle waiter that no longer dispatches. + internal bool ShouldExcludeRequestLocked(uint requestId) + { + return m_lifecycleWaiters.TryGetValue( + requestId, + out LifecycleWaiterState? waiterState) && + waiterState.WaitingCount > 0; + } + + /// + /// Marks a registered waiter as blocked on the lifecycle semaphore and removes it from + /// pending drains. + /// + /// The request whose lifecycle wait has started. + /// The active drain snapshots to update. + /// The request was not registered as a waiter. + internal void MarkWaiterWaitingLocked( + uint requestId, + List requestDrains) + { + if (!m_lifecycleWaiters.TryGetValue( + requestId, + out LifecycleWaiterState? state)) + { + throw new InvalidOperationException( + "The lifecycle waiter is no longer registered."); + } + + state.WaitingCount++; + if (state.WaitingCount == 1) + { + for (int ii = requestDrains.Count - 1; ii >= 0; ii--) + { + if (requestDrains[ii].Exclude(requestId)) + { + requestDrains.RemoveAt(ii); + } + } + } + } + + /// + /// Unregisters a lifecycle waiter and removes its state when the last nested scope exits. + /// + /// The request that is leaving lifecycle coordination. + /// Whether the scope had started waiting on the lifecycle semaphore. + internal void ExitWaiterLocked(uint requestId, bool waiting) + { + if (!m_lifecycleWaiters.TryGetValue( + requestId, + out LifecycleWaiterState? state)) + { + return; + } + + if (waiting) + { + state.WaitingCount--; + } + state.RegisteredCount--; + if (state.RegisteredCount == 0) + { + m_lifecycleWaiters.Remove(requestId); + } + } + + private readonly RequestManager m_requestManager; + private readonly Dictionary m_lifecycleWaiters = []; + private bool m_admissionClosed; + + /// + /// Unregisters one lifecycle-waiting request. + /// + internal sealed class RequestLifecycleWaiterScope : IDisposable + { + /// + /// Creates a scope that unregisters the request from lifecycle coordination. + /// + /// The extension that owns the waiter state. + /// The request registered by the scope. + public RequestLifecycleWaiterScope( + RequestManagerLifecycleExtension extension, + uint requestId) + { + m_extension = extension; + m_requestId = requestId; + } + + /// + /// Records the point where the request has stopped dispatching and is waiting on the + /// lifecycle semaphore. + /// + /// The scope has already been disposed. + internal void MarkSemaphoreWaitStarted() + { + lock (m_lock) + { + if (m_extension is null) + { + throw new ObjectDisposedException( + nameof(RequestLifecycleWaiterScope)); + } + if (!m_waiting) + { + m_extension.MarkLifecycleWaiterWaiting(m_requestId); + m_waiting = true; + } + } + } + + /// + /// Leaves lifecycle coordination and re-includes the request in future drains when it + /// had started waiting. + /// + public void Dispose() + { + RequestManagerLifecycleExtension? extension; + bool waiting; + lock (m_lock) + { + extension = m_extension; + m_extension = null; + waiting = m_waiting; + } + extension?.ExitLifecycleWaiter(m_requestId, waiting); + } + + private RequestManagerLifecycleExtension? m_extension; + private readonly uint m_requestId; + private readonly Lock m_lock = new(); + private bool m_waiting; + } + + private void MarkLifecycleWaiterWaiting(uint requestId) + { + m_requestManager.MarkLifecycleWaiterWaiting(this, requestId); + } + + private void ExitLifecycleWaiter(uint requestId, bool waiting) + { + m_requestManager.ExitLifecycleWaiter(this, requestId, waiting); + } + + /// + /// Counts the nested lifecycle waiter scopes for a single request. The request is excluded + /// from drains while at least one scope has started waiting. + /// + private sealed class LifecycleWaiterState + { + /// + /// Gets or sets the number of active scopes registered for the request. + /// + public int RegisteredCount { get; set; } = 1; + + /// + /// Gets or sets the number of registered scopes that have started waiting. + /// + public int WaitingCount { get; set; } + } + } +} diff --git a/src/Opc.Ua.Server/Server/ServerInternalData.cs b/src/Opc.Ua.Server/Server/ServerInternalData.cs index 5d7d7da6f4..c4734b365f 100644 --- a/src/Opc.Ua.Server/Server/ServerInternalData.cs +++ b/src/Opc.Ua.Server/Server/ServerInternalData.cs @@ -66,7 +66,7 @@ public class ServerInternalData : Historian.IHistorianRegistryProvider, ITransportListenerRegistryProvider, IServerEndpointRegistryProvider, - + IAsyncDisposable, ITimeProviderProvider { /// @@ -138,13 +138,22 @@ public void Dispose() GC.SuppressFinalize(this); } + /// + /// Frees managed resources that require asynchronous shutdown. + /// + public async ValueTask DisposeAsync() + { + await DisposeAsyncCore().ConfigureAwait(false); + GC.SuppressFinalize(this); + } + /// /// An overrideable version of the Dispose. /// /// true to release both managed and unmanaged resources; false to release only unmanaged resources. protected virtual void Dispose(bool disposing) { - if (disposing) + if (disposing && Interlocked.Exchange(ref m_disposed, 1) == 0) { m_roleStateBinding?.Dispose(); m_roleStateBinding = null; @@ -163,6 +172,39 @@ protected virtual void Dispose(bool disposing) } } + /// + /// An overrideable version of asynchronous dispose. + /// + protected virtual async ValueTask DisposeAsyncCore() + { + if (Interlocked.Exchange(ref m_disposed, 1) != 0) + { + return; + } + + m_roleStateBinding?.Dispose(); + m_roleStateBinding = null; + (RoleManager as IDisposable)?.Dispose(); + ResourceManager?.Dispose(); + RequestManager?.Dispose(); + AggregateManager?.Dispose(); + ModellingRulesManager?.Dispose(); + ConformanceUnitsManager?.Dispose(); + (NodeManager as IDisposable)?.Dispose(); + SessionManager?.Dispose(); + if (SubscriptionManager is IAsyncDisposable asyncSubscriptionManager) + { + await asyncSubscriptionManager.DisposeAsync().ConfigureAwait(false); + } + else + { + SubscriptionManager?.Dispose(); + } + MonitoredItemQueueFactory?.Dispose(); + (AliasNameStoreRegistry as IDisposable)?.Dispose(); + (HistorianRegistry as IDisposable)?.Dispose(); + } + /// /// The server-wide registry of OPC UA Part 17 alias-name stores. /// Surfaces through the optional @@ -702,7 +744,8 @@ public async ValueTask CloseSessionAsync( { await NodeManager.SessionClosingAsync(context, sessionId, deleteSubscriptions, cancellationToken) .ConfigureAwait(false); - await SubscriptionManager.SessionClosingAsync(context, sessionId, deleteSubscriptions, cancellationToken) + await SubscriptionManager + .SessionClosingAsync(context, sessionId, deleteSubscriptions, cancellationToken) .ConfigureAwait(false); } finally @@ -1280,5 +1323,6 @@ private ServiceResult OnUpdateDiagnostics( private RoleStateBinding? m_roleStateBinding; private volatile IReadOnlyList? m_transportListeners; private ArrayOf m_serverEndpoints; + private int m_disposed; } } diff --git a/src/Opc.Ua.Server/Server/StandardServer.cs b/src/Opc.Ua.Server/Server/StandardServer.cs index 8333c72c5e..d8434087dc 100644 --- a/src/Opc.Ua.Server/Server/StandardServer.cs +++ b/src/Opc.Ua.Server/Server/StandardServer.cs @@ -183,7 +183,41 @@ public IServerRateLimiterProvider? RateLimiterProvider /// protected override void Dispose(bool disposing) { - if (disposing) + if (!disposing) + { + base.Dispose(false); + return; + } + + ServerInternalData? serverInternal; + ServerShutdownState? activeShutdownState = null; + bool disposeWithoutShutdown = false; + bool firstDisposeRequest; + lock (m_shutdownCoordinationLock) + { + // Dispose must initiate the same orderly shutdown path as StopAsync when the + // server is still running, because server resources are released only after + // request admission closes and admitted requests drain. Repeat Dispose calls are + // safe: m_disposeRequested lets them observe the already-published shutdown task + // or repeat only null-safe cleanup after disposal has completed. + firstDisposeRequest = !m_disposeRequested; + m_disposeRequested = true; + serverInternal = m_serverInternal; + if (serverInternal is null) + { + if (m_serverShutdownState is + { ActiveTask.IsCompleted: false } shutdownState) + { + activeShutdownState = shutdownState; + } + else + { + disposeWithoutShutdown = true; + } + } + } + + if (firstDisposeRequest) { // halt any outstanding timer. m_registrationTimer?.Dispose(); @@ -192,26 +226,26 @@ protected override void Dispose(bool disposing) // close the watcher. m_configurationWatcher?.Dispose(); m_configurationWatcher = null; - - // close the server. - m_serverInternal?.Dispose(); - m_serverInternal = null; - - // dispose the admission-control provider if we created it. - if (m_ownsRateLimiterProvider) - { - m_rateLimiterProvider?.Dispose(); - } - m_rateLimiterProvider = null; - - m_certManagerSubscription?.Dispose(); - - (NodeManagerLifecycle as IDisposable)?.Dispose(); - - m_semaphoreSlim.Dispose(); } - base.Dispose(disposing); + if (serverInternal is not null) + { + // The retained shutdown observer owns provider, subscription, base-class, + // and semaphore disposal after every admitted request has drained. + _ = GetOrStartServerInternalShutdown( + serverInternal, + CancellationToken.None); + } + else if (disposeWithoutShutdown) + { + CompleteBaseResourceDisposal(disposeLifecycle: true); + } + else + { + EnsureDeferredServerInternalShutdownObserved( + activeShutdownState!, + activeShutdownState!.ActiveTask!); + } } /// @@ -988,7 +1022,7 @@ await ServerInternal.NodeManager.SessionActivatedAsync( /// /// The error. /// - /// true if the error is one of the security errors, otherwise false. + /// true if the error is one of the security errors, otherwise false. /// protected bool IsSecurityError(StatusCode error) { @@ -3607,6 +3641,7 @@ await base.StartApplicationAsync(configuration, cancellationToken) RequestManager requestManager = CreateRequestManager( m_serverInternal, configuration); + requestManager.RegisterLifecycleExtension(); //create the main node manager factory IMainNodeManagerFactory mainNodeManagerFactory = CreateMainNodeManagerFactory(m_serverInternal, configuration); @@ -3859,62 +3894,675 @@ protected override async ValueTask OnServerStoppingAsync(CancellationToken cance m_registrationTimer = null; } - // attempt graceful shutdown the server. + if (m_maxRegistrationInterval > 0 && m_registeredWithDiscoveryServer) + { + // unregister from Discovery Server if registered before + m_registrationInfo!.IsOnline = false; + await RegisterWithDiscoveryServerAsync(cancellationToken).ConfigureAwait(false); + } + + ServerInternalData? serverInternal = m_serverInternal; + if (serverInternal is not null) + { + await GetOrStartServerInternalShutdown( + serverInternal, + cancellationToken) + .ConfigureAwait(false); + } + } + + private Task GetOrStartServerInternalShutdown( + ServerInternalData serverInternal, + CancellationToken cancellationToken) + { + ServerShutdownState shutdownState; + Task shutdown; + TaskCompletionSource? reservedShutdown = null; + bool joiningActiveShutdown = false; + lock (m_shutdownCoordinationLock) + { + if (m_serverShutdownState is null || + !ReferenceEquals(m_serverShutdownState.Server, serverInternal)) + { + m_serverShutdownState = new ServerShutdownState(serverInternal); + m_serverShutdownState.LastDeferredRetryProgress = + GetServerShutdownProgress(m_serverShutdownState); + } + shutdownState = m_serverShutdownState; + + if (shutdownState.Completed) + { + shutdown = Task.CompletedTask; + } + else if (shutdownState.ActiveTask is { IsCompleted: false } activeTask) + { + shutdown = activeTask; + joiningActiveShutdown = true; + } + else + { + shutdownState.TerminalError = null; + shutdownState.AttemptCount++; + reservedShutdown = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + shutdown = reservedShutdown.Task; + shutdownState.ActiveTask = shutdown; + } + } + + if (reservedShutdown is not null) + { + _ = CompleteReservedServerInternalShutdownAsync( + shutdownState, + reservedShutdown, + cancellationToken); + } + + EnsureDeferredServerInternalShutdownObserved(shutdownState, shutdown); + if (joiningActiveShutdown && + serverInternal.RequestManager.IsExecutingRequest) + { + // The shared shutdown drains requests. A request joining that task must + // become an excluded lifecycle waiter before it awaits the drain owner. + return JoinActiveServerInternalShutdownFromRequest( + serverInternal.RequestManager, + shutdown); + } + return shutdown; + } + + private async Task CompleteReservedServerInternalShutdownAsync( + ServerShutdownState shutdown, + TaskCompletionSource reservedShutdown, + CancellationToken cancellationToken) + { + try + { + await ShutdownServerInternalAsync(shutdown, cancellationToken) + .ConfigureAwait(false); + reservedShutdown.TrySetResult(null); + } + catch (OperationCanceledException ex) + { + reservedShutdown.TrySetCanceled( + ex.CancellationToken.CanBeCanceled + ? ex.CancellationToken + : cancellationToken); + } + catch (Exception ex) + { + reservedShutdown.TrySetException(ex); + } + } + + private async Task JoinActiveServerInternalShutdownFromRequest( + RequestManager requestManager, + Task shutdown) + { + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope shutdownWaiter = + requestManager.RegisterLifecycleExtension().EnterLifecycleWaiter(); + shutdownWaiter.MarkSemaphoreWaitStarted(); + AfterServerShutdownJoinerRegisteredForTest?.Invoke(); + await shutdown.ConfigureAwait(false); + } + + private async Task ShutdownServerInternalAsync( + ServerShutdownState shutdown, + CancellationToken cancellationToken) + { + RequestManagerLifecycleExtension.RequestLifecycleWaiterScope? shutdownWaiter = null; + if (shutdown.Server.RequestManager.IsExecutingRequest) + { + shutdownWaiter = shutdown.Server.RequestManager.RegisterLifecycleExtension() + .EnterLifecycleWaiter(); + shutdownWaiter.MarkSemaphoreWaitStarted(); + } try { - if (m_maxRegistrationInterval > 0 && m_registeredWithDiscoveryServer) + await ShutdownServerInternalCoreAsync(shutdown, cancellationToken) + .ConfigureAwait(false); + } + finally + { + shutdownWaiter?.Dispose(); + } + } + + private async Task ShutdownServerInternalCoreAsync( + ServerShutdownState shutdown, + CancellationToken cancellationToken) + { + if (!shutdown.RequestAdmissionClosed) + { + shutdown.Server.RequestManager.RegisterLifecycleExtension().CloseAdmission(); + shutdown.RequestAdmissionClosed = true; + Func? afterAdmissionClosed = + AfterServerRequestAdmissionClosedForTest; + if (afterAdmissionClosed is not null) { - // unregister from Discovery Server if registered before - m_registrationInfo!.IsOnline = false; - await RegisterWithDiscoveryServerAsync(cancellationToken).ConfigureAwait(false); + await afterAdmissionClosed().ConfigureAwait(false); } + } + + var lifecycle = NodeManagerLifecycle as NodeManagerLifecycle; + ValueTask lifecyclePreparation = default; + bool prepareLifecycle = lifecycle is not null && + !shutdown.LifecyclePrepared; + if (prepareLifecycle) + { + // BeginShutdownAsync records shutdown intent synchronously before its first + // incomplete await, which closes lifecycle admission before Dispose returns. + lifecyclePreparation = lifecycle!.BeginShutdownAsync( + shutdown.Server, + cancellationToken); + AfterNodeManagerLifecycleShutdownStartedForTest?.Invoke(); + } + + // Ensure GetOrStartServerInternalShutdown can publish the task before final cleanup + // re-enters the shutdown coordination lock. + await Task.Yield(); + + if (prepareLifecycle) + { + await lifecyclePreparation.ConfigureAwait(false); + shutdown.LifecyclePrepared = true; + } + else if (lifecycle is null) + { + shutdown.LifecyclePrepared = true; + } - var lifecycle = - NodeManagerLifecycle as NodeManagerLifecycle; - IServerInternal? lifecycleServer = m_serverInternal; - if (lifecycle is not null && - lifecycleServer is not null) + await m_semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + if (!ReferenceEquals(m_serverInternal, shutdown.Server)) { - await lifecycle.BeginShutdownAsync( - lifecycleServer, - cancellationToken) + lock (m_shutdownCoordinationLock) + { + shutdown.Completed = true; + } + return; + } + } + finally + { + m_semaphoreSlim.Release(); + } + + if (!shutdown.SubscriptionsStopped) + { + await shutdown.Server.SubscriptionManager + .ShutdownAsync(cancellationToken) + .ConfigureAwait(false); + shutdown.SubscriptionsStopped = true; + } + + if (!shutdown.RequestsDrained) + { + Func? beforeRequestDrain = BeforeServerRequestDrainForTest; + if (beforeRequestDrain is not null) + { + await beforeRequestDrain().ConfigureAwait(false); + } + ValueTask requestDrain = shutdown.Server.RequestManager + .WaitForCurrentRequestsAsync(cancellationToken); + AfterServerRequestDrainStartedForTest?.Invoke(); + await requestDrain.ConfigureAwait(false); + shutdown.RequestsDrained = true; + } + + if (!shutdown.SessionsStopped) + { + shutdown.Server.SessionManager.SessionChannelKeepAlive + -= SessionChannelKeepAliveEvent; + shutdown.Server.SessionManager.Shutdown(); + shutdown.SessionsStopped = true; + } + + if (!shutdown.NodeManagersStopped) + { + // Final node-manager cleanup owns retained resources and must finish even + // if the caller abandons the shutdown request. + await shutdown.Server.NodeManager + .ShutdownAsync(CancellationToken.None) + .ConfigureAwait(false); + shutdown.NodeManagersStopped = true; + } + + if (!shutdown.LifecycleCompleted) + { + if (lifecycle is not null) + { + // CompleteShutdownAsync disposes retired lifecycle state; cancelling it + // would leak managers that are no longer reachable for a later retry. + await lifecycle.CompleteShutdownAsync( + shutdown.Server, + CancellationToken.None) .ConfigureAwait(false); } + shutdown.LifecycleCompleted = true; + } + + // The final disposal stage owns the server semaphore. It must not be cancelled + // after earlier cleanup stages have permanently stopped request admission. + await m_semaphoreSlim.WaitAsync(CancellationToken.None).ConfigureAwait(false); + try + { + if (ReferenceEquals(m_serverInternal, shutdown.Server)) + { + if (!shutdown.LifecycleDisposed) + { + (NodeManagerLifecycle as IDisposable)?.Dispose(); + shutdown.LifecycleDisposed = true; + } + if (!shutdown.InternalsDisposed) + { + shutdown.Server.Dispose(); + shutdown.InternalsDisposed = true; + } + lock (m_shutdownCoordinationLock) + { + if (ReferenceEquals(m_serverInternal, shutdown.Server)) + { + m_serverInternal = null; + } + } + Func? beforeRelease = + BeforeServerShutdownSemaphoreReleaseForTest; + if (beforeRelease is not null) + { + await beforeRelease().ConfigureAwait(false); + } + } + } + finally + { + m_semaphoreSlim.Release(); + } + + lock (m_shutdownCoordinationLock) + { + shutdown.Completed = true; + } + } + + private void EnsureDeferredServerInternalShutdownObserved( + ServerShutdownState shutdownState, + Task shutdown) + { + bool observe = false; + bool completeDisposal = false; + lock (m_shutdownCoordinationLock) + { + if (m_disposeRequested && + ReferenceEquals(m_serverShutdownState, shutdownState)) + { + if (shutdownState.Completed && + shutdown.IsCompleted && + m_serverInternal is null) + { + completeDisposal = true; + } + else if (!shutdownState.DeferredObserverActive) + { + shutdownState.DeferredObserverActive = true; + observe = true; + } + } + } + if (completeDisposal) + { + CompleteBaseResourceDisposal(disposeLifecycle: false); + } + else if (observe) + { + _ = ObserveDeferredServerInternalShutdownSafelyAsync( + shutdownState, + shutdown); + } + } + + private async Task ObserveDeferredServerInternalShutdownSafelyAsync( + ServerShutdownState shutdownState, + Task shutdown) + { + try + { + await ObserveDeferredServerInternalShutdownAsync( + shutdownState, + shutdown) + .ConfigureAwait(false); + } + catch (Exception ex) + { + var terminalError = new AggregateException( + "Deferred server shutdown observer failed. Server internals and synchronization resources " + + "remain retained for an explicit retry.", + ex); + RecordDeferredServerShutdownTerminalError(shutdownState, terminalError); + } + } - await m_semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + [SuppressMessage( + "Maintainability", + "CA1508:Avoid dead conditional code", + Justification = "ActiveTask can be replaced concurrently by an explicit shutdown retry.")] + private async Task ObserveDeferredServerInternalShutdownAsync( + ServerShutdownState shutdownState, + Task shutdown) + { + var failures = new List(); + Task activeShutdown = shutdown; + while (true) + { try { - if (m_serverInternal != null) + await activeShutdown.ConfigureAwait(false); + break; + } + catch (Exception ex) + { + failures.Add(ex); + ServerError = new ServiceResult(ex); + } + + ServerInternalData? serverInternal = null; + Task? concurrentShutdown = null; + int retryCount = 0; + Exception? terminalError = null; + lock (m_shutdownCoordinationLock) + { + if (m_disposeRequested && + ReferenceEquals(m_serverShutdownState, shutdownState) && + ReferenceEquals(m_serverInternal, shutdownState.Server)) { - ServerInternal.SessionManager.SessionChannelKeepAlive - -= SessionChannelKeepAliveEvent; - await ServerInternal.SubscriptionManager.ShutdownAsync(cancellationToken).ConfigureAwait(false); - ServerInternal.SessionManager.Shutdown(); - await ServerInternal.NodeManager.ShutdownAsync(cancellationToken).ConfigureAwait(false); - if (lifecycle is not null) + if (shutdownState.ActiveTask is { } latestShutdown && + !ReferenceEquals(latestShutdown, activeShutdown)) + { + concurrentShutdown = latestShutdown; + } + else { - await lifecycle.CompleteShutdownAsync( - m_serverInternal, - CancellationToken.None) - .ConfigureAwait(false); + long progress = GetServerShutdownProgress(shutdownState); + terminalError = TryCreateDeferredServerShutdownTerminalError( + shutdownState, + failures); + if (terminalError is null && + (shutdownState.DeferredRetryCount == 0 || + progress > shutdownState.LastDeferredRetryProgress)) + { + shutdownState.LastDeferredRetryProgress = progress; + retryCount = ++shutdownState.DeferredRetryCount; + serverInternal = shutdownState.Server; + } + else + { + terminalError ??= new AggregateException( + $"Deferred server shutdown stopped after {shutdownState.AttemptCount} attempt(s) " + + "because the latest attempt made no cleanup progress. Server internals and " + + "synchronization resources remain retained for an explicit retry.", + failures); + shutdownState.TerminalError = terminalError; + shutdownState.DeferredObserverActive = false; + ServerError = new ServiceResult(terminalError); + } } } + else if (ReferenceEquals(m_serverShutdownState, shutdownState)) + { + shutdownState.DeferredObserverActive = false; + } } - finally + if (terminalError is not null) { - m_semaphoreSlim.Release(); + m_logger.DeferredServerShutdownTerminated( + terminalError, + terminalError.Message); + } + + if (concurrentShutdown is not null) + { + activeShutdown = concurrentShutdown; + continue; } + if (serverInternal is null) + { + return; + } + + await Task.Delay(GetDeferredShutdownRetryDelay(retryCount)) + .ConfigureAwait(false); + + lock (m_shutdownCoordinationLock) + { + if (shutdownState.Completed) + { + break; + } + if (!m_disposeRequested || + !ReferenceEquals(m_serverShutdownState, shutdownState) || + !ReferenceEquals(m_serverInternal, shutdownState.Server)) + { + shutdownState.DeferredObserverActive = false; + return; + } + } + + activeShutdown = GetOrStartServerInternalShutdown( + serverInternal, + CancellationToken.None); } - catch (Exception e) + + bool completeDisposal; + lock (m_shutdownCoordinationLock) + { + if (ReferenceEquals(m_serverShutdownState, shutdownState)) + { + shutdownState.TerminalError = null; + shutdownState.DeferredObserverActive = false; + } + completeDisposal = m_disposeRequested && + m_serverInternal is null && + shutdownState.Completed; + } + if (completeDisposal) + { + CompleteBaseResourceDisposal(disposeLifecycle: false); + } + } + + private AggregateException? TryCreateDeferredServerShutdownTerminalError( + ServerShutdownState shutdownState, + List failures) + { + int maxRetryCount = Math.Max(DeferredServerShutdownMaxRetryCount, 0); + if (shutdownState.DeferredRetryCount >= maxRetryCount) + { + return new AggregateException( + $"Deferred server shutdown stopped after {shutdownState.AttemptCount} attempt(s) because it " + + $"exceeded the deferred retry limit of {maxRetryCount} retry attempt(s). Server internals and " + + "synchronization resources remain retained for an explicit retry.", + failures); + } + + DateTimeOffset now = TimeProvider.GetUtcNow(); + shutdownState.DeferredRetryStartedAt ??= now; + TimeSpan retryBudget = DeferredServerShutdownRetryBudget; + if (retryBudget <= TimeSpan.Zero || + now - shutdownState.DeferredRetryStartedAt.Value >= retryBudget) + { + return new AggregateException( + $"Deferred server shutdown stopped after {shutdownState.AttemptCount} attempt(s) because it " + + $"exceeded the deferred retry time budget of {retryBudget}. Server internals and " + + "synchronization resources remain retained for an explicit retry.", + failures); + } + + return null; + } + + private void RecordDeferredServerShutdownTerminalError( + ServerShutdownState shutdownState, + Exception terminalError) + { + lock (m_shutdownCoordinationLock) + { + if (ReferenceEquals(m_serverShutdownState, shutdownState)) + { + shutdownState.TerminalError = terminalError; + shutdownState.DeferredObserverActive = false; + ServerError = new ServiceResult(terminalError); + } + } + m_logger.DeferredServerShutdownTerminated( + terminalError, + terminalError.Message); + } + + private long GetServerShutdownProgress(ServerShutdownState shutdown) + { + long progress = 0; + progress += shutdown.LifecyclePrepared ? 1 : 0; + progress += shutdown.SubscriptionsStopped ? 1 : 0; + progress += shutdown.RequestAdmissionClosed ? 1 : 0; + progress += shutdown.RequestsDrained ? 1 : 0; + progress += shutdown.SessionsStopped ? 1 : 0; + progress += shutdown.NodeManagersStopped ? 1 : 0; + progress += shutdown.LifecycleCompleted ? 1 : 0; + progress += shutdown.LifecycleDisposed ? 1 : 0; + progress += shutdown.InternalsDisposed ? 1 : 0; + if (shutdown.Server.NodeManager is MasterNodeManager masterNodeManager) + { + progress += masterNodeManager.ShutdownCompletedNodeManagerCount; + } + if (NodeManagerLifecycle is NodeManagerLifecycle lifecycle) { - ServerError = new ServiceResult(e); + progress += lifecycle.ShutdownCleanupProgress; + } + Func? additionalProgress = AdditionalServerShutdownProgressForTest; + if (additionalProgress is not null) + { + progress += additionalProgress(); + } + return progress; + } + + private static TimeSpan GetDeferredShutdownRetryDelay(int retryCount) + { + int exponent = Math.Min(Math.Max(retryCount - 1, 0), 6); + return TimeSpan.FromMilliseconds(10 * (1 << exponent)); + } + + private const int kDefaultDeferredServerShutdownMaxRetryCount = 64; + private static readonly TimeSpan kDefaultDeferredServerShutdownRetryBudget = + TimeSpan.FromMinutes(1); + + private void CompleteBaseResourceDisposal(bool disposeLifecycle) + { + lock (m_shutdownCoordinationLock) + { + if (m_baseResourceDisposalStarted) + { + return; + } + m_baseResourceDisposalStarted = true; + m_baseResourceDisposalCount++; + } + + var failures = new List(); + if (disposeLifecycle) + { + try + { + (NodeManagerLifecycle as IDisposable)?.Dispose(); + } + catch (Exception ex) + { + failures.Add(ex); + } + } + + try + { + if (m_ownsRateLimiterProvider) + { + m_rateLimiterProvider?.Dispose(); + } + } + catch (Exception ex) + { + failures.Add(ex); } finally { - // ensure that everything is cleaned up. - m_serverInternal?.Dispose(); - m_serverInternal = null; + m_rateLimiterProvider = null; + } + + try + { + m_certManagerSubscription?.Dispose(); + } + catch (Exception ex) + { + failures.Add(ex); + } + finally + { + m_certManagerSubscription = null; + } + + try + { + base.Dispose(true); } + catch (Exception ex) + { + failures.Add(ex); + } + + try + { + DisposeServerSemaphore(); + } + catch (Exception ex) + { + failures.Add(ex); + } + + Exception? terminalError = failures.Count > 0 + ? new AggregateException( + "One or more base server resources could not be disposed.", + failures) + : null; + lock (m_shutdownCoordinationLock) + { + m_baseResourceDisposalCompleted = true; + m_baseResourceDisposalError = terminalError; + if (m_serverShutdownState is { } shutdownState) + { + shutdownState.TerminalError = terminalError; + } + } + if (terminalError is not null) + { + ServerError = new ServiceResult(terminalError); + m_logger.ServerShutdownResourceDisposalFailed( + terminalError, + terminalError.Message); + } + } + + private void DisposeServerSemaphore() + { + lock (m_shutdownCoordinationLock) + { + if (m_serverSemaphoreDisposed) + { + return; + } + m_serverSemaphoreDisposed = true; + } + m_semaphoreSlim.Dispose(); } /// @@ -4616,8 +5264,90 @@ private OperationLimitsState OperationLimits => ServerInternal.ServerObject.ServerCapabilities!.OperationLimits!; private readonly Lock m_registrationLock = new(); + private readonly Lock m_shutdownCoordinationLock = new(); private readonly SemaphoreSlim m_semaphoreSlim = new(1, 1); + [SuppressMessage( + "Usage", + "CA2213:Disposable fields should be disposed", + Justification = "Disposed by the coordinated asynchronous server shutdown task.")] private ServerInternalData? m_serverInternal; + private ServerShutdownState? m_serverShutdownState; + private bool m_disposeRequested; + private bool m_baseResourceDisposalStarted; + private bool m_baseResourceDisposalCompleted; + private int m_baseResourceDisposalCount; + private Exception? m_baseResourceDisposalError; + private bool m_serverSemaphoreDisposed; + internal Action? AfterNodeManagerLifecycleShutdownStartedForTest { get; set; } + internal Action? AfterServerShutdownJoinerRegisteredForTest { get; set; } + internal Func? AfterServerRequestAdmissionClosedForTest { get; set; } + internal Action? AfterServerRequestDrainStartedForTest { get; set; } + internal Func? BeforeServerRequestDrainForTest { get; set; } + internal Func? BeforeServerShutdownSemaphoreReleaseForTest { get; set; } + internal int DeferredServerShutdownMaxRetryCount { get; set; } = + kDefaultDeferredServerShutdownMaxRetryCount; + + internal TimeSpan DeferredServerShutdownRetryBudget { get; set; } = + kDefaultDeferredServerShutdownRetryBudget; + + internal Func? AdditionalServerShutdownProgressForTest { get; set; } + + internal bool ServerSemaphoreDisposedForTest + { + get + { + lock (m_shutdownCoordinationLock) + { + return m_serverSemaphoreDisposed; + } + } + } + + internal int ServerShutdownAttemptCountForTest + { + get + { + lock (m_shutdownCoordinationLock) + { + return m_serverShutdownState?.AttemptCount ?? 0; + } + } + } + + internal bool BaseResourcesDisposedForTest + { + get + { + lock (m_shutdownCoordinationLock) + { + return m_baseResourceDisposalCompleted; + } + } + } + + internal int BaseResourceDisposalCountForTest + { + get + { + lock (m_shutdownCoordinationLock) + { + return m_baseResourceDisposalCount; + } + } + } + + internal Exception? DeferredServerShutdownTerminalErrorForTest + { + get + { + lock (m_shutdownCoordinationLock) + { + return m_serverShutdownState?.TerminalError ?? + m_baseResourceDisposalError; + } + } + } + private ConfigurationWatcher? m_configurationWatcher; private ConfiguredEndpointCollection? m_registrationEndpoints; private RegisteredServer? m_registrationInfo; @@ -4636,6 +5366,50 @@ private OperationLimitsState OperationLimits private bool m_ownsRateLimiterProvider; private readonly ILogger m_eventLogger; + private sealed class ServerShutdownState + { + public ServerShutdownState(ServerInternalData server) + { + Server = server; + } + + public ServerInternalData Server { get; } + + public Task? ActiveTask { get; set; } + + public int AttemptCount { get; set; } + + public int DeferredRetryCount { get; set; } + + public long LastDeferredRetryProgress { get; set; } + + public DateTimeOffset? DeferredRetryStartedAt { get; set; } + + public bool DeferredObserverActive { get; set; } + + public Exception? TerminalError { get; set; } + + public bool LifecyclePrepared { get; set; } + + public bool SubscriptionsStopped { get; set; } + + public bool RequestAdmissionClosed { get; set; } + + public bool RequestsDrained { get; set; } + + public bool SessionsStopped { get; set; } + + public bool NodeManagersStopped { get; set; } + + public bool LifecycleCompleted { get; set; } + + public bool LifecycleDisposed { get; set; } + + public bool InternalsDisposed { get; set; } + + public bool Completed { get; set; } + } + /// /// The interval at which the /// re-evaluates the certificate-expiration and TrustList-staleness @@ -4718,7 +5492,6 @@ public static partial void ServerClientConnectsWithAnEndpointUrlEndpointUrl( Message = "Server - SESSION ACTIVATE failed. {ErrorMessage}")] public static partial void ServerSESSIONACTIVATEFailedErrorMessage(this ILogger logger, string? errorMessage); - [LoggerMessage(EventId = ServerEventIds.StandardServer + 5, Level = LogLevel.Trace, Message = "PUBLISH #{RequestHandle} RECEIVED. TIME={Timestamp:hh:mm:ss.fff}")] public static partial void PUBLISHRequestHandleRECEIVEDTIMETimestampHhMm( @@ -4726,7 +5499,6 @@ public static partial void PUBLISHRequestHandleRECEIVEDTIMETimestampHhMm( uint requestHandle, DateTimeUtc timestamp); - [LoggerMessage(EventId = ServerEventIds.StandardServer + 6, Level = LogLevel.Warning, Message = "RegisterServer{Api} failed for {EndpointUrl}. Exception={ErrorMessage}")] public static partial void RegisterServerApiFailedForEndpointUrlException( @@ -4860,6 +5632,19 @@ public static partial void CertificateManagerApplicationCertificateUpdated( [LoggerMessage(EventId = ServerEventIds.StandardServer + 33, Level = LogLevel.Error, Message = "CertificateManager change observer failed to fan-out cert update.")] public static partial void CertificateManagerChangeObserverFailedToFanOut(this ILogger logger, Exception ex); - } + [LoggerMessage(EventId = ServerEventIds.StandardServer + 34, Level = LogLevel.Error, + Message = "Deferred server shutdown terminated. {ErrorMessage}")] + public static partial void DeferredServerShutdownTerminated( + this ILogger logger, + Exception ex, + string? errorMessage); + + [LoggerMessage(EventId = ServerEventIds.StandardServer + 35, Level = LogLevel.Error, + Message = "Server shutdown resource disposal failed. {ErrorMessage}")] + public static partial void ServerShutdownResourceDisposalFailed( + this ILogger logger, + Exception ex, + string? errorMessage); + } } diff --git a/src/Opc.Ua.Server/Subscription/MonitoredItem/IMonitoredItem.cs b/src/Opc.Ua.Server/Subscription/MonitoredItem/IMonitoredItem.cs index 3e3d2d8a5c..f583e606be 100644 --- a/src/Opc.Ua.Server/Subscription/MonitoredItem/IMonitoredItem.cs +++ b/src/Opc.Ua.Server/Subscription/MonitoredItem/IMonitoredItem.cs @@ -151,6 +151,30 @@ public interface IMonitoredItem : IDisposable MonitoringMode SetMonitoringMode(MonitoringMode monitoringMode); } + /// + /// Internal lifecycle contract used to invalidate a monitored item when its + /// owning NodeManager generation is retired immediately. + /// + internal interface IRetirableMonitoredItem + { + /// Gets whether the item has been retired. + bool IsRetired { get; } + + /// Gets the error reported for the retired item. + ServiceResult? RetirementError { get; } + + /// + /// Marks the item retired and queues its terminal status when the monitored + /// item kind supports status values. + /// + void Retire(ServiceResult error); + + /// + /// Releases references to the disposed owner after retirement is final. + /// + void DetachOwner(); + } + /// /// A monitored item that can be triggered. /// @@ -346,6 +370,18 @@ public interface ISampledDataChangeMonitoredItem : IDataChangeMonitoredItem2 void SetSamplingInterval(double samplingInterval); } + /// + /// Restores monitored item transient state when a prepared subscription transfer is rolled back. + /// + internal interface IMonitoredItemTransferState + { + /// + /// Restores the resend-data trigger to the value captured before transfer preparation. + /// + /// The original resend-data trigger state. + void RestoreResendDataTrigger(bool resendData); + } + /// /// Defines constants for the monitored item type. /// diff --git a/src/Opc.Ua.Server/Subscription/MonitoredItem/MonitoredItem.cs b/src/Opc.Ua.Server/Subscription/MonitoredItem/MonitoredItem.cs index 6cfb00ee21..05a0f37950 100644 --- a/src/Opc.Ua.Server/Subscription/MonitoredItem/MonitoredItem.cs +++ b/src/Opc.Ua.Server/Subscription/MonitoredItem/MonitoredItem.cs @@ -42,7 +42,9 @@ public class MonitoredItem : IEventMonitoredItem, ISampledDataChangeMonitoredItem, ITriggeredMonitoredItem, - IDetachableMonitoredItem + IDetachableMonitoredItem, + IRetirableMonitoredItem, + IMonitoredItemTransferState { /// /// Initializes the object with its node type. @@ -432,6 +434,11 @@ public bool IsReadyToPublish { get { + if (m_retirementNotificationPending) + { + return true; + } + // check if aggregate interval has passed. if (m_calculator != null && m_calculator.HasEndTimePassed(DateTime.UtcNow)) { @@ -502,7 +509,8 @@ public void SetupResendDataTrigger() { lock (m_lock) { - if (MonitoringMode == MonitoringMode.Reporting && + if (m_retirementError is null && + MonitoringMode == MonitoringMode.Reporting && (MonitoredItemType & MonitoredItemTypeMask.DataChange) != 0) { m_resendData = true; @@ -510,6 +518,14 @@ public void SetupResendDataTrigger() } } + void IMonitoredItemTransferState.RestoreResendDataTrigger(bool resendData) + { + lock (m_lock) + { + m_resendData = resendData; + } + } + /// /// Sets a flag indicating that the item has been triggered and should publish. /// @@ -1085,6 +1101,11 @@ public virtual void QueueValue(in DataValue value, ServiceResult? error, bool ig { lock (m_lock) { + if (m_retirementError is not null) + { + return; + } + // this method should only be called for variables. if ((MonitoredItemType & MonitoredItemTypeMask.DataChange) == 0) { @@ -1165,6 +1186,92 @@ public virtual void QueueValue(in DataValue value, ServiceResult? error, bool ig } } + bool IRetirableMonitoredItem.IsRetired + { + get + { + lock (m_lock) + { + return m_retirementError is not null; + } + } + } + + ServiceResult? IRetirableMonitoredItem.RetirementError + { + get + { + lock (m_lock) + { + return m_retirementError; + } + } + } + + void IRetirableMonitoredItem.Retire(ServiceResult error) + { + if (error is null) + { + throw new ArgumentNullException(nameof(error)); + } + + ISubscription? subscription = null; + lock (m_lock) + { + if (m_retirementError is not null) + { + return; + } + + m_retirementError = error; + if ((MonitoredItemType & MonitoredItemTypeMask.DataChange) != 0) + { + m_calculator = null; + m_dataChangeQueueHandler?.Dispose(); + m_dataChangeQueueHandler = null; + m_retirementNotificationPending = true; + DateTime utcNow = m_timeProvider.GetUtcNow().UtcDateTime; + var value = new DataValue( + Variant.Null, + error.StatusCode, + utcNow, + utcNow); + if (!m_lastValue.IsNull) + { + m_readyToTrigger = true; + } + m_lastValue = value; + m_lastError = error; + m_readyToPublish = true; + subscription = m_subscription; + } + else if ((MonitoredItemType & MonitoredItemTypeMask.Events) != 0) + { + m_eventQueueHandler?.Dispose(); + m_eventQueueHandler = null; + m_readyToPublish = false; + m_readyToTrigger = false; + m_triggered = false; + } + } + + subscription?.ItemReadyToPublish(this); + } + + void IRetirableMonitoredItem.DetachOwner() + { + lock (m_lock) + { + if (m_retirementError is null) + { + throw new InvalidOperationException( + "A monitored item must be retired before its owner is detached."); + } + NodeManager = null!; + ManagerHandle = null!; + } + } + /// /// Adds a value to the queue. /// @@ -1265,6 +1372,11 @@ public virtual void QueueEvent(IFilterTarget instance, bool bypassFilter) lock (m_lock) { + if (m_retirementError is not null) + { + return; + } + // this method should only be called for objects or views. if ((MonitoredItemType & MonitoredItemTypeMask.Events) == 0) { @@ -1321,6 +1433,11 @@ public virtual void QueueEvent(EventFieldList fields) { lock (m_lock) { + if (m_retirementError is not null) + { + return; + } + m_eventQueueHandler!.QueueEvent(fields); m_readyToPublish = true; m_readyToTrigger = true; @@ -1591,7 +1708,9 @@ public virtual bool Publish( else { // pull any unprocessed data. - if (m_calculator != null && m_calculator.HasEndTimePassed(DateTime.UtcNow)) + if (!m_retirementNotificationPending && + m_calculator != null && + m_calculator.HasEndTimePassed(DateTime.UtcNow)) { while (m_calculator.TryGetProcessedValue(false, out DataValue processedValue)) { @@ -1643,6 +1762,7 @@ public virtual bool Publish( // reset state variables. m_readyToPublish = moreValuesToPublish; m_readyToTrigger = moreValuesToPublish; + m_retirementNotificationPending = false; m_resendData = false; m_triggered = false; @@ -2281,6 +2401,8 @@ private void DisposeQueueHandlers() private bool m_structureChanged; private ISubscription? m_subscription; private ServiceResult? m_samplingError; + private ServiceResult? m_retirementError; + private bool m_retirementNotificationPending; private IAggregateCalculator? m_calculator; private bool m_triggered; private bool m_resendData; diff --git a/src/Opc.Ua.Server/Subscription/SessionPublishQueue.cs b/src/Opc.Ua.Server/Subscription/SessionPublishQueue.cs index b858988a39..44d93c06e3 100644 --- a/src/Opc.Ua.Server/Subscription/SessionPublishQueue.cs +++ b/src/Opc.Ua.Server/Subscription/SessionPublishQueue.cs @@ -63,6 +63,7 @@ public SessionPublishQueue( m_session = session ?? throw new ArgumentNullException(nameof(session)); m_queuedRequests = new LinkedList(); m_queuedSubscriptions = new ConcurrentDictionary(); + m_transferClaims = []; m_maxRequestCount = maxPublishRequests; m_timeProvider = timeProvider ?? (server as ITimeProviderProvider)?.TimeProvider @@ -104,6 +105,7 @@ protected virtual void Dispose(bool disposing) } m_queuedSubscriptions.Clear(); + m_transferClaims.Clear(); } } } @@ -193,6 +195,7 @@ public IList Close() // clear the queue. m_queuedSubscriptions.Clear(); + m_transferClaims.Clear(); } foreach (ISubscription subscription in queuedSubscriptions) @@ -257,19 +260,94 @@ internal bool ContainsSubscription(ISubscription subscription) } /// - /// Removes the exact subscription entry so a transfer can claim it. + /// Claims and removes the exact subscription entry before transfer callbacks run. /// - internal bool TryRemoveForTransfer(ISubscription subscription) + internal bool TryClaimForTransfer( + Subscription subscription, + ISession sourceSession, + out SubscriptionTransferClaim? claim) { - if (!m_queuedSubscriptions.TryGetValue( - subscription.Id, - out QueuedSubscription? queuedSubscription) || - !ReferenceEquals(queuedSubscription.Subscription, subscription)) + lock (m_lock) { - return false; + claim = null; + if (!m_queuedSubscriptions.TryGetValue( + subscription.Id, + out QueuedSubscription? queuedSubscription) || + !ReferenceEquals(queuedSubscription.Subscription, subscription) || + m_transferClaims.ContainsKey(subscription.Id)) + { + return false; + } + + if (!subscription.TryBeginTransfer(sourceSession)) + { + return false; + } + if (!TryRemoveExact(queuedSubscription)) + { + subscription.AbortTransfer(sourceSession); + return false; + } + + claim = new SubscriptionTransferClaim(queuedSubscription); + m_transferClaims.Add(subscription.Id, claim); + return true; + } + } + + /// + /// Restores a previously claimed subscription entry when transfer preparation fails before ownership changes. + /// + /// The queue entry claim to return to active publishing. + /// true when the claim was current and the entry was restored. + internal bool RestoreTransferClaim(SubscriptionTransferClaim claim) + { + lock (m_lock) + { + uint subscriptionId = claim.Entry.Subscription.Id; + if (!m_transferClaims.TryGetValue( + subscriptionId, + out SubscriptionTransferClaim? currentClaim) || + !ReferenceEquals(currentClaim, claim) || + !m_queuedSubscriptions.TryAdd(subscriptionId, claim.Entry)) + { + return false; + } + + m_transferClaims.Remove(subscriptionId); + return true; + } + } + + /// + /// Removes a transfer claim after the destination session has accepted the subscription. + /// + /// The queue entry claim that completed. + internal void CompleteTransferClaim(SubscriptionTransferClaim claim) + { + lock (m_lock) + { + uint subscriptionId = claim.Entry.Subscription.Id; + if (m_transferClaims.TryGetValue( + subscriptionId, + out SubscriptionTransferClaim? currentClaim) && + ReferenceEquals(currentClaim, claim)) + { + m_transferClaims.Remove(subscriptionId); + } } + } - return TryRemoveExact(queuedSubscription); + internal bool TryRemoveForTransfer(ISubscription subscription) + { + lock (m_lock) + { + return m_queuedSubscriptions.TryGetValue( + subscription.Id, + out QueuedSubscription? queuedSubscription) && + ReferenceEquals(queuedSubscription.Subscription, subscription) && + TryRemoveExact(queuedSubscription); + } } /// @@ -380,12 +458,11 @@ public void Acknowledge( if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { - DiagnosticInfo? diagnosticInfo = ServerUtils - .CreateDiagnosticInfo( - m_server, - context, - result, - m_logger); + DiagnosticInfo? diagnosticInfo = ServerUtils.CreateDiagnosticInfo( + m_server, + context, + result, + m_logger); acknowledgeDiagnosticInfoList.Add(diagnosticInfo!); diagnosticsExist = true; } @@ -422,13 +499,25 @@ public void Acknowledge( /// public void PublishCompleted(ISubscription subscription, bool moreNotifications) { - if (m_queuedSubscriptions.TryGetValue(subscription.Id, - out QueuedSubscription? queuedSubscription)) + if (!m_queuedSubscriptions.TryGetValue( + subscription.Id, + out QueuedSubscription? queuedSubscription)) { lock (m_lock) { - queuedSubscription.Publishing = false; + PublishCompletedTransferClaimNoLock(subscription, moreNotifications); + } + return; + } + lock (m_lock) + { + if (m_queuedSubscriptions.TryGetValue( + subscription.Id, + out QueuedSubscription? currentSubscription) && + ReferenceEquals(currentSubscription, queuedSubscription)) + { + queuedSubscription.Publishing = false; if (moreNotifications) { AssignSubscriptionToRequest(queuedSubscription); @@ -438,7 +527,10 @@ public void PublishCompleted(ISubscription subscription, bool moreNotifications) queuedSubscription.ReadyToPublish = false; queuedSubscription.Timestamp = DateTime.UtcNow; } + return; } + + PublishCompletedTransferClaimNoLock(subscription, moreNotifications); } } @@ -447,13 +539,30 @@ public void PublishCompleted(ISubscription subscription, bool moreNotifications) /// public void Requeue(ISubscription subscription) { - if (m_queuedSubscriptions.TryGetValue(subscription.Id, out QueuedSubscription? queuedSubscription)) + if (!m_queuedSubscriptions.TryGetValue( + subscription.Id, + out QueuedSubscription? queuedSubscription)) { lock (m_lock) + { + RequeueTransferClaimNoLock(subscription); + } + return; + } + + lock (m_lock) + { + if (m_queuedSubscriptions.TryGetValue( + subscription.Id, + out QueuedSubscription? currentSubscription) && + ReferenceEquals(currentSubscription, queuedSubscription)) { queuedSubscription.Publishing = false; queuedSubscription.ReadyToPublish = true; + return; } + + RequeueTransferClaimNoLock(subscription); } } @@ -489,6 +598,11 @@ internal void PublishTimerExpired(IReadOnlyList queuedSubscr for (int ii = 0; ii < queuedSubscriptions.Count; ii++) { QueuedSubscription subscription = queuedSubscriptions[ii]; + if (!IsCurrentSubscription(subscription)) + { + continue; + } + PublishingState state = subscription.Subscription.PublishTimerExpired(); // check for expired subscription. @@ -511,7 +625,13 @@ internal void PublishTimerExpired(IReadOnlyList queuedSubscr // check if idle. if (state == PublishingState.Idle) { - subscription.ReadyToPublish = false; + lock (m_lock) + { + if (IsCurrentSubscriptionNoLock(subscription)) + { + subscription.ReadyToPublish = false; + } + } continue; } @@ -526,7 +646,8 @@ internal void PublishTimerExpired(IReadOnlyList queuedSubscr { lock (m_lock) { - if (!subscription.Publishing) + if (IsCurrentSubscriptionNoLock(subscription) && + !subscription.Publishing) { AssignSubscriptionToRequest(subscription); } @@ -543,7 +664,49 @@ internal void PublishTimerExpired(IReadOnlyList queuedSubscr /// internal bool TryRemoveForExpiration(QueuedSubscription queuedSubscription) { - return TryRemoveExact(queuedSubscription); + lock (m_lock) + { + return TryRemoveExact(queuedSubscription); + } + } + + private bool IsCurrentSubscription(QueuedSubscription queuedSubscription) + { + return IsCurrentSubscriptionNoLock(queuedSubscription); + } + + private void PublishCompletedTransferClaimNoLock( + ISubscription subscription, + bool moreNotifications) + { + if (m_transferClaims.TryGetValue( + subscription.Id, + out SubscriptionTransferClaim? transferClaim) && + ReferenceEquals(transferClaim.Entry.Subscription, subscription)) + { + transferClaim.Entry.Publishing = false; + transferClaim.Entry.ReadyToPublish = moreNotifications; + } + } + + private void RequeueTransferClaimNoLock(ISubscription subscription) + { + if (m_transferClaims.TryGetValue( + subscription.Id, + out SubscriptionTransferClaim? transferClaim) && + ReferenceEquals(transferClaim.Entry.Subscription, subscription)) + { + transferClaim.Entry.Publishing = false; + transferClaim.Entry.ReadyToPublish = true; + } + } + + private bool IsCurrentSubscriptionNoLock(QueuedSubscription queuedSubscription) + { + return m_queuedSubscriptions.TryGetValue( + queuedSubscription.Subscription.Id, + out QueuedSubscription? currentSubscription) && + ReferenceEquals(currentSubscription, queuedSubscription); } private bool TryRemoveExact(QueuedSubscription queuedSubscription) @@ -696,6 +859,10 @@ public void Dispose() /// internal sealed class QueuedSubscription { + /// + /// Initializes the queue entry for a subscription owned by this session. + /// + /// The subscription tracked by the publish queue. public QueuedSubscription(ISubscription subscription) { Subscription = subscription; @@ -703,12 +870,47 @@ public QueuedSubscription(ISubscription subscription) Timestamp = DateTime.UtcNow; } + /// + /// Gets the subscription associated with the queue entry. + /// public ISubscription Subscription { get; } + + /// + /// Gets or sets the UTC timestamp used for publish scheduling and timeout decisions. + /// public DateTime Timestamp { get; set; } + + /// + /// Gets or sets whether the subscription has notifications ready for a publish response. + /// public bool ReadyToPublish { get; set; } + + /// + /// Gets or sets whether the queue entry is currently assigned to an outstanding publish request. + /// public bool Publishing { get; set; } } + /// + /// Holds the exact queue entry removed while a subscription is being transferred to another session. + /// + internal sealed class SubscriptionTransferClaim + { + /// + /// Initializes a transfer claim for the removed queue entry. + /// + /// The queue entry held outside active publishing during transfer. + public SubscriptionTransferClaim(QueuedSubscription entry) + { + Entry = entry; + } + + /// + /// Gets the queue entry that must be restored or completed exactly once. + /// + public QueuedSubscription Entry { get; } + } + /// /// Dumps the current state of the session queue. /// @@ -773,6 +975,7 @@ internal void TraceState(string context, params object[] args) private readonly ISession m_session; private readonly LinkedList m_queuedRequests; private readonly ConcurrentDictionary m_queuedSubscriptions; + private readonly Dictionary m_transferClaims; private readonly int m_maxRequestCount; private readonly TimeProvider m_timeProvider; } @@ -782,10 +985,16 @@ internal void TraceState(string context, params object[] args) /// internal static partial class SessionPublishQueueLog { + /// + /// Logs that a publish request was abandoned because its secure channel no longer matches the queued request. + /// [LoggerMessage(EventId = ServerEventIds.SessionPublishQueue + 0, Level = LogLevel.Warning, Message = "Publish abandoned because the secure channel changed.")] public static partial void PublishAbandonedBecauseTheSecureChannelChanged(this ILogger logger); + /// + /// Logs the trace-level assignment of a queued publish request to a subscription. + /// [LoggerMessage(EventId = ServerEventIds.SessionPublishQueue + 1, Level = LogLevel.Trace, Message = "PUBLISH: #{Id} Assigned To Subscription({SubscriptionId}).")] public static partial void PUBLISHIdAssignedToSubscriptionSubscriptionId( @@ -793,6 +1002,9 @@ public static partial void PUBLISHIdAssignedToSubscriptionSubscriptionId( string id, uint subscriptionId); + /// + /// Logs a trace-level snapshot of the publish queue counters for diagnostics. + /// [LoggerMessage(EventId = ServerEventIds.SessionPublishQueue + 2, Level = LogLevel.Trace, Message = "PublishQueue {Context}, SessionId={SessionId}, SubscriptionCount={SubscriptionCount}, " + "RequestCount={RequestCount}, ReadyToPublishCount={ReadyToPublishCount}, " + diff --git a/src/Opc.Ua.Server/Subscription/Subscription.cs b/src/Opc.Ua.Server/Subscription/Subscription.cs index 2e4940de9d..8ba072b099 100644 --- a/src/Opc.Ua.Server/Subscription/Subscription.cs +++ b/src/Opc.Ua.Server/Subscription/Subscription.cs @@ -42,7 +42,8 @@ namespace Opc.Ua.Server /// public class Subscription : ISubscription, - ISubscriptionMonitoredItemLifecycle + ISubscriptionMonitoredItemLifecycle, + INodeManagerMonitoredItemRetirementTracker { /// /// Initializes the object. @@ -483,7 +484,8 @@ monitoredItem.Value is not IDetachableMonitoredItem { IsDetached: true } && - AreSameNodeManager(monitoredItem.Value.NodeManager, nodeManager)); + !IsRetired(monitoredItem.Value) && + IsOwnedBy(monitoredItem.Value, nodeManager)); } } @@ -503,7 +505,8 @@ monitoredItem is not IDetachableMonitoredItem { IsDetached: true } && - AreSameNodeManager(monitoredItem.NodeManager, nodeManager)) + !IsRetired(monitoredItem) && + IsOwnedBy(monitoredItem, nodeManager)) ]; } } @@ -547,6 +550,29 @@ monitoredItem is IDetachableMonitoredItem lifecycle && } } + /// + bool INodeManagerMonitoredItemRetirementTracker.CanRetireMonitoredItems( + IAsyncNodeManager nodeManager) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + lock (m_lock) + { + if (IsDurable) + { + return false; + } + return m_monitoredItems.Values + .Where(monitoredItem => IsOwnedBy(monitoredItem.Value, nodeManager)) + .All(monitoredItem => + !monitoredItem.Value.IsDurable && + monitoredItem.Value is IRetirableMonitoredItem); + } + } + /// bool ISubscriptionMonitoredItemLifecycle.ContainsMonitoredItem( IMonitoredItem monitoredItem) @@ -560,12 +586,103 @@ bool ISubscriptionMonitoredItemLifecycle.ContainsMonitoredItem( } } - private static bool AreSameNodeManager( - IAsyncNodeManager first, - IAsyncNodeManager second) + /// + void INodeManagerMonitoredItemRetirementTracker.RetireMonitoredItems( + IAsyncNodeManager nodeManager, + ServiceResult error) { - return ReferenceEquals(first, second) || - ReferenceEquals(first.SyncNodeManager, second.SyncNodeManager); + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + if (error is null) + { + throw new ArgumentNullException(nameof(error)); + } + + IRetirableMonitoredItem[] ownedItems; + lock (m_lock) + { + if (IsDurable) + { + throw new NotSupportedException( + "Durable subscriptions cannot be retired immediately."); + } + IMonitoredItem[] candidates = + [ + .. m_monitoredItems.Values + .Select(monitoredItem => monitoredItem.Value) + .Where(monitoredItem => IsOwnedBy(monitoredItem, nodeManager)) + ]; + if (candidates.Any(monitoredItem => + monitoredItem.IsDurable || + monitoredItem is not IRetirableMonitoredItem)) + { + throw new NotSupportedException( + "Durable or unsupported monitored items cannot be retired immediately."); + } + ownedItems = [.. candidates.Cast()]; + } + + foreach (IRetirableMonitoredItem monitoredItem in ownedItems) + { + monitoredItem.Retire(error); + } + } + + /// + void INodeManagerMonitoredItemRetirementTracker.DetachRetiredMonitoredItems( + IAsyncNodeManager nodeManager) + { + if (nodeManager is null) + { + throw new ArgumentNullException(nameof(nodeManager)); + } + + IRetirableMonitoredItem[] retiredItems; + lock (m_lock) + { + retiredItems = + [ + .. m_monitoredItems.Values + .Select(monitoredItem => monitoredItem.Value) + .Where(monitoredItem => + IsRetired(monitoredItem) && + IsOwnedBy(monitoredItem, nodeManager)) + .Cast() + ]; + } + + foreach (IRetirableMonitoredItem monitoredItem in retiredItems) + { + monitoredItem.DetachOwner(); + } + } + + private static bool IsRetired(IMonitoredItem monitoredItem) + { + return monitoredItem is IRetirableMonitoredItem { IsRetired: true }; + } + + private static bool IsOwnedBy( + IMonitoredItem monitoredItem, + IAsyncNodeManager nodeManager) + { + IAsyncNodeManager? monitoredItemOwner = monitoredItem.NodeManager; + if (monitoredItemOwner is null) + { + return false; + } + if (ReferenceEquals(monitoredItemOwner, nodeManager)) + { + return true; + } + + INodeManager? monitoredItemSync = monitoredItemOwner.SyncNodeManager; + INodeManager? nodeManagerSync = nodeManager.SyncNodeManager; + return monitoredItemSync is not null && + nodeManagerSync is not null && + ReferenceEquals(monitoredItemSync, nodeManagerSync); } /// @@ -619,6 +736,13 @@ public PublishingState PublishTimerExpired() { lock (m_lock) { + // OPC 10000-4 §5.14.1.2, Table 79 handles TransferSubscriptions as a single transition + // that sets the new Session, returns the response and issues Good_SubscriptionTransferred. + if (m_transferInProgress) + { + return PublishingState.Idle; + } + long currentTime = m_timeProvider.GetTimestampMilliseconds(); // check if publish interval has elapsed. @@ -782,8 +906,13 @@ public async ValueTask TransferSessionAsync(OperationContext context, bool sendI errors.Add(null!); } - await m_server.NodeManager - .TransferMonitoredItemsAsync(context, sendInitialValues, monitoredItems, errors, cancellationToken) + await m_server.NodeManager.TransferMonitoredItemsAsync( + context, + sendInitialValues, + monitoredItems, + errors, + null, + cancellationToken) .ConfigureAwait(false); int badTransfers = 0; @@ -821,6 +950,7 @@ await m_server.NodeManager } } + /// public bool IsTransferIdentityCompatible(ISession targetSession) { @@ -854,6 +984,376 @@ public bool IsTransferIdentityCompatible(ISession targetSession) StringComparison.Ordinal); } + /// + /// Reserves the subscription for transfer while it is still owned by the expected source session. + /// + /// The session that currently owns the subscription. + /// true when the transfer reservation was acquired. + internal bool TryBeginTransfer(ISession? sourceSession) + { + lock (m_lock) + { + if (m_transferInProgress || + m_expired || + !ReferenceEquals(Session, sourceSession)) + { + return false; + } + + m_transferInProgress = true; + return true; + } + } + + /// + /// Prepares monitored item state for a session transfer without making the new owner visible yet. + /// + /// The operation context for the destination session. + /// The session that currently owns the subscription. + /// Whether initial values should be sent after transfer commits. + /// The token that aborts transfer preparation. + /// A prepared transfer that can be committed or rolled back by the caller. + /// + /// The subscription is no longer reserved by the source session. + /// + internal async ValueTask PrepareSessionTransferAsync( + OperationContext context, + ISession? sourceSession, + bool sendInitialValues, + CancellationToken cancellationToken) + { + List monitoredItems; + lock (m_lock) + { + if (!m_transferInProgress || + !ReferenceEquals(Session, sourceSession)) + { + throw new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription source changed during transfer."); + } + monitoredItems = m_monitoredItems.Select(v => v.Value.Value).ToList(); + } + + var errors = new List(monitoredItems.Count); + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + errors.Add(null!); + } + + OperationContext? sourceContext = null; + IMonitoredItemTransferTransaction? monitoredItemTransaction = null; + try + { + if (m_server.NodeManager is IMonitoredItemTransferCoordinator coordinator) + { + sourceContext = sourceSession != null + ? new OperationContext(sourceSession, context.DiagnosticsMask) + : new OperationContext( + new RequestHeader(), + null!, + RequestType.Unknown, + RequestLifetime.None); + monitoredItemTransaction = await coordinator.PrepareMonitoredItemsTransferAsync( + context, + sourceContext, + sendInitialValues, + monitoredItems, + errors, + new MonitoredItemTransferOptions + { + DeferInitialValues = sendInitialValues + }, + cancellationToken) + .ConfigureAwait(false); + } + else + { + var fallbackTransaction = new ResendStateTransferTransaction( + monitoredItems); + try + { + // The non-coordinator contract has no commit callback. + // Keep legacy eager resend semantics instead of + // requesting deferral that cannot be committed here. + await m_server.NodeManager.TransferMonitoredItemsAsync( + context, + sendInitialValues, + monitoredItems, + errors, + transferOptions: null, + cancellationToken) + .ConfigureAwait(false); + } + catch + { + await fallbackTransaction.RollbackAsync(CancellationToken.None) + .ConfigureAwait(false); + throw; + } + monitoredItemTransaction = fallbackTransaction; + } + } + catch + { + sourceContext?.Dispose(); + throw; + } + + int badTransfers = 0; + for (int ii = 0; ii < errors.Count; ii++) + { + if (ServiceResult.IsBad(errors[ii])) + { + badTransfers++; + } + } + if (badTransfers > 0) + { + m_logger.FailedToTransferCountMonitoredItems(badTransfers); + } + + return new PreparedSessionTransfer( + this, + sourceSession, + context.Session, + monitoredItemTransaction, + sourceContext); + } + + /// + /// Releases the transfer reservation after the destination session is already the owner. + /// + /// The session that must currently own the subscription. + /// Ownership changed before transfer completion. + internal void CompleteTransfer(ISession destinationSession) + { + lock (m_lock) + { + if (!m_transferInProgress || + !ReferenceEquals(Session, destinationSession)) + { + throw new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription ownership changed while completing transfer."); + } + m_transferInProgress = false; + } + } + + /// + /// Releases a transfer reservation without changing ownership when preparation cannot continue. + /// + /// The source session that still owns the subscription. + internal void AbortTransfer(ISession? sourceSession) + { + lock (m_lock) + { + if (m_transferInProgress && + ReferenceEquals(Session, sourceSession)) + { + m_transferInProgress = false; + } + } + } + + /// + /// Represents a prepared subscription transfer whose ownership and monitored item effects can + /// still be committed or rolled back. + /// + internal sealed class PreparedSessionTransfer + { + /// + /// Initializes a prepared transfer with the source context and monitored item transaction to dispose. + /// + /// The subscription being transferred. + /// The session that owned the subscription when preparation started. + /// The session that will own the subscription after commit. + /// The prepared monitored item transfer, if one was needed. + /// The source operation context created for monitored item callbacks. + public PreparedSessionTransfer( + Subscription subscription, + ISession? sourceSession, + ISession destinationSession, + IMonitoredItemTransferTransaction? monitoredItemTransaction, + OperationContext? sourceContext) + { + m_subscription = subscription; + m_sourceSession = sourceSession; + m_destinationSession = destinationSession; + m_monitoredItemTransaction = monitoredItemTransaction; + m_sourceContext = sourceContext; + } + + /// + /// Moves subscription ownership and diagnostics to the destination session. + /// + /// + /// The subscription is no longer owned by the source session. + /// + public void CommitOwnership() + { + lock (m_subscription.m_lock) + { + if (!m_subscription.m_transferInProgress || + !ReferenceEquals(m_subscription.Session, m_sourceSession)) + { + throw new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription ownership changed during transfer."); + } + m_subscription.Session = m_destinationSession; + } + + lock (m_subscription.DiagnosticsWriteLock) + { + m_subscription.Diagnostics.SessionId = m_destinationSession.Id; + } + } + + /// + /// Makes the prepared monitored item transfer effects visible after ownership commits. + /// + public void CommitMonitoredItemEffects() + { + m_monitoredItemTransaction?.Commit(); + } + + /// + /// Restores source ownership and monitored item state when a later transfer step fails. + /// + /// The token that aborts monitored item rollback. + /// A task that completes when rollback has finished. + /// One or more rollback steps failed. + public async ValueTask RollbackAsync(CancellationToken cancellationToken) + { + var rollbackErrors = new List(); + try + { + try + { + lock (m_subscription.m_lock) + { + if (ReferenceEquals(m_subscription.Session, m_destinationSession)) + { + m_subscription.Session = m_sourceSession!; + } + else if (!ReferenceEquals(m_subscription.Session, m_sourceSession)) + { + throw new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription ownership changed while rolling back transfer."); + } + } + + lock (m_subscription.DiagnosticsWriteLock) + { + m_subscription.Diagnostics.SessionId = m_sourceSession?.Id ?? default; + } + } + catch (Exception error) + { + rollbackErrors.Add(error); + } + + if (m_monitoredItemTransaction != null) + { + try + { + await m_monitoredItemTransaction.RollbackAsync(cancellationToken) + .ConfigureAwait(false); + } + catch (Exception error) + { + rollbackErrors.Add(error); + } + } + } + finally + { + DisposeSourceContext(); + } + + if (rollbackErrors.Count > 0) + { + throw new AggregateException( + "The subscription transfer could not be fully rolled back.", + rollbackErrors); + } + } + + /// + /// Releases the source operation context after a successful transfer. + /// + public void Complete() + { + DisposeSourceContext(); + } + + private void DisposeSourceContext() + { + Interlocked.Exchange(ref m_sourceContext, null)?.Dispose(); + } + + private readonly Subscription m_subscription; + private readonly ISession? m_sourceSession; + private readonly ISession m_destinationSession; + private readonly IMonitoredItemTransferTransaction? m_monitoredItemTransaction; + private OperationContext? m_sourceContext; + } + + private sealed class ResendStateTransferTransaction : + IMonitoredItemTransferTransaction + { + /// + /// Captures resend-data state so the legacy transfer path can be rolled back. + /// + /// The monitored items whose resend state is captured. + public ResendStateTransferTransaction(IList monitoredItems) + { + m_monitoredItems = monitoredItems; + m_resendStates = new bool[monitoredItems.Count]; + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + m_resendStates[ii] = monitoredItems[ii]?.IsResendData ?? false; + } + } + + /// + /// Completes the legacy transfer transaction; no deferred work is required. + /// + public void Commit() + { + } + + /// + /// Restores each monitored item's resend-data trigger to the captured value. + /// + /// Unused token; rollback is synchronous and idempotent. + /// A completed task. + public ValueTask RollbackAsync(CancellationToken cancellationToken) + { + if (Interlocked.Exchange(ref m_rolledBack, 1) != 0) + { + return default; + } + + for (int ii = 0; ii < m_monitoredItems.Count; ii++) + { + if (m_monitoredItems[ii] is IMonitoredItemTransferState transferState) + { + transferState.RestoreResendDataTrigger(m_resendStates[ii]); + } + } + return default; + } + + private readonly IList m_monitoredItems; + private readonly bool[] m_resendStates; + private int m_rolledBack; + + } + /// /// Restores ownership if a transfer failed after assigning its destination. /// @@ -2931,6 +3431,13 @@ private void VerifySession(OperationContext context) throw new ServiceResultException(StatusCodes.BadSubscriptionIdInvalid); } + if (m_transferInProgress) + { + throw new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription transfer is in progress."); + } + if (!ReferenceEquals(context.Session, Session)) { throw new ServiceResultException( @@ -3069,6 +3576,7 @@ private void TraceState(LogLevel logLevel, TraceStateId id, string context) private readonly NodeId m_diagnosticsId; private bool m_refreshInProgress; private bool m_expired; + private bool m_transferInProgress; private readonly Dictionary> m_itemsToTrigger; private readonly bool m_supportsDurable; private readonly ILogger m_logger; @@ -3079,18 +3587,30 @@ private void TraceState(LogLevel logLevel, TraceStateId id, string context) /// internal static partial class SubscriptionLog { + /// + /// Logs that deleting monitored items for a subscription failed. + /// [LoggerMessage(EventId = ServerEventIds.Subscription + 0, Level = LogLevel.Error, Message = "Delete items for subscription failed.")] public static partial void DeleteItemsForSubscriptionFailed(this ILogger logger, Exception ex); + /// + /// Logs the number of monitored items that could not be transferred. + /// [LoggerMessage(EventId = ServerEventIds.Subscription + 1, Level = LogLevel.Trace, Message = "Failed to transfer {Count} Monitored Items")] public static partial void FailedToTransferCountMonitoredItems(this ILogger logger, int count); + /// + /// Logs an invariant violation where monitored items were queued without available notifications. + /// [LoggerMessage(EventId = ServerEventIds.Subscription + 2, Level = LogLevel.Error, Message = "Oops! MonitoredItems queued but no notifications available.")] public static partial void OopsMonitoredItemsQueuedButNoNotificationsAvailable(this ILogger logger); + /// + /// Logs that durable subscription setup was requested without a durable monitored item queue factory. + /// [LoggerMessage(EventId = ServerEventIds.Subscription + 3, Level = LogLevel.Error, Message = "SetSubscriptionDurable requested for subscription with id {SubscriptionId}, but no " + "IMonitoredItemQueueFactory that supports durable queues was registered")] diff --git a/src/Opc.Ua.Server/Subscription/SubscriptionManager.cs b/src/Opc.Ua.Server/Subscription/SubscriptionManager.cs index 6da7a2dadf..d3c8ff3f63 100644 --- a/src/Opc.Ua.Server/Subscription/SubscriptionManager.cs +++ b/src/Opc.Ua.Server/Subscription/SubscriptionManager.cs @@ -41,7 +41,7 @@ namespace Opc.Ua.Server /// /// A generic session manager object for a server. /// - public class SubscriptionManager : ISubscriptionManager + public class SubscriptionManager : ISubscriptionManager, IAsyncDisposable { /// /// Initializes the manager with its configuration. @@ -100,6 +100,7 @@ public SubscriptionManager( // create a event to signal shutdown. m_shutdownEvent = new ManualResetEvent(true); + m_workerShutdown = new CancellationTokenSource(); // create queue and event for condition refresh worker m_conditionRefreshEvent = new ManualResetEvent(false); @@ -115,45 +116,97 @@ public void Dispose() GC.SuppressFinalize(this); } + /// + /// Frees managed resources that require asynchronous shutdown. + /// + public async ValueTask DisposeAsync() + { + await DisposeAsyncCore().ConfigureAwait(false); + GC.SuppressFinalize(this); + } + /// /// An overrideable version of the Dispose. /// protected virtual void Dispose(bool disposing) { - if (disposing) + if (disposing && Interlocked.Exchange(ref m_disposed, 1) == 0) { - List? subscriptions = null; - List? publishQueues = null; + SignalConditionRefreshShutdown(); + CaptureManagedResources( + out List publishQueues, + out List subscriptions); + DisposeManagedResources(publishQueues, subscriptions); + DisposeSynchronizationResources(); + } + } - m_semaphoreSlim.Wait(); - try - { - publishQueues = [.. m_publishQueues.Values]; - m_publishQueues.Clear(); + /// + /// An overrideable version of the asynchronous dispose. + /// + protected virtual async ValueTask DisposeAsyncCore() + { + if (Interlocked.Exchange(ref m_disposed, 1) != 0) + { + return; + } - subscriptions = [.. m_subscriptions.Values]; - m_subscriptions.Clear(); - m_expiringSubscriptions.Clear(); - } - finally - { - m_semaphoreSlim.Release(); - } + SignalConditionRefreshShutdown(); - foreach (SessionPublishQueue publishQueue in publishQueues) - { - publishQueue?.Dispose(); - } + await Task.WhenAll( + m_publishSubscriptionsTask ?? Task.CompletedTask, + m_conditionRefreshTask ?? Task.CompletedTask) + .ConfigureAwait(false); - foreach (ISubscription subscription in subscriptions) - { - subscription?.Dispose(); - } + await m_semaphoreSlim.WaitAsync(CancellationToken.None).ConfigureAwait(false); + List publishQueues; + List subscriptions; + try + { + CaptureManagedResources(out publishQueues, out subscriptions); + } + finally + { + m_semaphoreSlim.Release(); + } + + DisposeManagedResources(publishQueues, subscriptions); + DisposeSynchronizationResources(); + } + + private void CaptureManagedResources( + out List publishQueues, + out List subscriptions) + { + publishQueues = [.. m_publishQueues.Values]; + m_publishQueues.Clear(); + + subscriptions = [.. m_subscriptions.Values]; + m_subscriptions.Clear(); + m_expiringSubscriptions.Clear(); + } - m_shutdownEvent.Dispose(); - m_conditionRefreshEvent.Dispose(); - m_semaphoreSlim.Dispose(); + private static void DisposeManagedResources( + List publishQueues, + List subscriptions) + { + foreach (SessionPublishQueue publishQueue in publishQueues) + { + publishQueue?.Dispose(); } + + foreach (ISubscription subscription in subscriptions) + { + subscription?.Dispose(); + } + } + + private void DisposeSynchronizationResources() + { + m_shutdownEvent.Dispose(); + m_conditionRefreshEvent.Dispose(); + m_workerShutdown.Dispose(); + m_semaphoreSlim.Dispose(); } /// @@ -251,23 +304,32 @@ public virtual async ValueTask StartupAsync(CancellationToken cancellationToken await RestoreSubscriptionsAsync(cancellationToken) .ConfigureAwait(false); + if (m_workerShutdown.IsCancellationRequested) + { + m_workerShutdown.Dispose(); + m_workerShutdown = new CancellationTokenSource(); + } + m_shutdownEvent.Reset(); + CancellationToken workerCancellationToken = m_workerShutdown.Token; - // TODO: Ensure shutdown awaits completion and a cancellation token is passed - _ = Task.Factory.StartNew( - () => PublishSubscriptionsAsync(m_publishingResolution), - default, - TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach, - TaskScheduler.Default); + m_publishSubscriptionsTask = Task.Factory.StartNew( + () => PublishSubscriptionsAsync( + m_publishingResolution, + workerCancellationToken).AsTask(), + default, + TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach, + TaskScheduler.Default) + .Unwrap(); m_conditionRefreshEvent.Reset(); - // TODO: Ensure shutdown awaits completion and a cancellation token is passed - _ = Task.Factory.StartNew( - ConditionRefreshWorkerAsync, - default, - TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach, - TaskScheduler.Default); + m_conditionRefreshTask = Task.Factory.StartNew( + ConditionRefreshWorkerAsync, + default, + TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach, + TaskScheduler.Default) + .Unwrap(); } finally { @@ -280,15 +342,30 @@ await RestoreSubscriptionsAsync(cancellationToken) /// public virtual async ValueTask ShutdownAsync(CancellationToken cancellationToken = default) { + Task publishSubscriptionsTask; + Task conditionRefreshTask; await m_semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); try { - // stop the publishing thread. - m_shutdownEvent.Set(); + // stop the publishing and condition refresh workers. + SignalConditionRefreshShutdown(); + publishSubscriptionsTask = + m_publishSubscriptionsTask ?? Task.CompletedTask; + conditionRefreshTask = + m_conditionRefreshTask ?? Task.CompletedTask; + } + finally + { + m_semaphoreSlim.Release(); + } - // trigger the condition refresh thread. - m_conditionRefreshEvent.Set(); + await Task.WhenAll(publishSubscriptionsTask, conditionRefreshTask) + .WaitAsync(cancellationToken) + .ConfigureAwait(false); + await m_semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { // dispose of publish queues. foreach (SessionPublishQueue queue in m_publishQueues.Values) { @@ -1503,10 +1580,15 @@ public async ValueTask TransferSubscriptionsAsync } ISession ownerSession = null!; + var concreteSubscription = subscription as Subscription; SessionPublishQueue? sourcePublishQueue = null; + SessionPublishQueue.SubscriptionTransferClaim? sourceQueueClaim = null; bool sourceIsAbandoned = false; bool sourceRemoved = false; - bool transferCompleted = false; + bool transferStarted = false; + Subscription.PreparedSessionTransfer? preparedTransfer = null; + SessionPublishQueue? destinationPublishQueue = null; + bool destinationAdded = false; await m_semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); try { @@ -1569,15 +1651,15 @@ is MessageSecurityMode.Sign continue; } - // Validate the exact current source while holding the same - // semaphore used by expiration claims. + // Claim the exact current source before any fallible monitored-item + // callback can run. Lock order is manager semaphore, then queue lock, + // then subscription lock; rollback follows the same order. if (ownerSession != null) { if (!m_publishQueues.TryGetValue( ownerSession.Id, out sourcePublishQueue) || - sourcePublishQueue == null || - !sourcePublishQueue.ContainsSubscription(subscription)) + sourcePublishQueue == null) { result.StatusCode = StatusCodes.BadSubscriptionIdInvalid; results.Add(result); @@ -1587,10 +1669,67 @@ is MessageSecurityMode.Sign } continue; } + + if (concreteSubscription != null) + { + if (!sourcePublishQueue.TryClaimForTransfer( + concreteSubscription, + ownerSession, + out sourceQueueClaim)) + { + result.StatusCode = StatusCodes.BadSubscriptionIdInvalid; + results.Add(result); + if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) + { + diagnosticInfos.Add(null!); + } + continue; + } + sourceRemoved = true; + transferStarted = true; + } + else + { + sourceRemoved = sourcePublishQueue.TryRemoveForTransfer(subscription); + if (!sourceRemoved) + { + result.StatusCode = StatusCodes.BadSubscriptionIdInvalid; + results.Add(result); + if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) + { + diagnosticInfos.Add(null!); + } + continue; + } + } } else if (ContainsAbandonedSubscription(subscription)) { sourceIsAbandoned = true; + if (concreteSubscription != null && + !concreteSubscription.TryBeginTransfer(null)) + { + result.StatusCode = StatusCodes.BadSubscriptionIdInvalid; + results.Add(result); + if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) + { + diagnosticInfos.Add(null!); + } + continue; + } + transferStarted = concreteSubscription != null; + sourceRemoved = TryRemoveAbandonedSubscription(subscription); + if (!sourceRemoved) + { + concreteSubscription?.AbortTransfer(null); + result.StatusCode = StatusCodes.BadSubscriptionIdInvalid; + results.Add(result); + if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) + { + diagnosticInfos.Add(null!); + } + continue; + } } else if (m_abandonedSubscriptions.ContainsKey(subscription.Id)) { @@ -1602,85 +1741,138 @@ is MessageSecurityMode.Sign } continue; } - - try + else if (concreteSubscription != null) { - // transfer session, add subscription to publish queue - await subscription.TransferSessionAsync( - context, - sendInitialValues, - cancellationToken) - .ConfigureAwait(false); - - if (sourcePublishQueue != null) + if (!concreteSubscription.TryBeginTransfer(null)) { - sourceRemoved = - sourcePublishQueue.TryRemoveForTransfer(subscription); + result.StatusCode = StatusCodes.BadSubscriptionIdInvalid; + results.Add(result); + if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) + { + diagnosticInfos.Add(null!); + } + continue; } - else if (sourceIsAbandoned) + transferStarted = true; + } + + try + { + if (concreteSubscription != null) { - sourceRemoved = - TryRemoveAbandonedSubscription(subscription); + preparedTransfer = await concreteSubscription + .PrepareSessionTransferAsync( + context, + ownerSession, + sendInitialValues, + cancellationToken) + .ConfigureAwait(false); + preparedTransfer.CommitOwnership(); } - - if ((sourcePublishQueue != null || sourceIsAbandoned) && - !sourceRemoved) + else { - throw new ServiceResultException( - StatusCodes.BadSubscriptionIdInvalid, - "Subscription source changed during transfer."); + await subscription.TransferSessionAsync( + context, + sendInitialValues, + cancellationToken) + .ConfigureAwait(false); } // add to queue in new session, create queue if necessary if (!m_publishQueues.TryGetValue( context.SessionId, - out SessionPublishQueue? publishQueue) || - publishQueue == null) + out destinationPublishQueue) || + destinationPublishQueue == null) { m_publishQueues[context.SessionId] - = publishQueue = new SessionPublishQueue( + = destinationPublishQueue = new SessionPublishQueue( m_server, context.Session, m_maxPublishRequestCount, m_timeProvider); } - publishQueue.Add(subscription); - transferCompleted = true; + destinationPublishQueue.Add(subscription); + destinationAdded = true; + preparedTransfer?.CommitMonitoredItemEffects(); + if (concreteSubscription != null) + { + concreteSubscription.CompleteTransfer(context.Session); + } + if (sourceQueueClaim != null) + { + sourcePublishQueue!.CompleteTransferClaim(sourceQueueClaim); + } + preparedTransfer?.Complete(); } - finally + catch (Exception transferError) { - if (!transferCompleted) + var rollbackErrors = new List(); + if (destinationAdded && destinationPublishQueue != null) { - bool ownershipRestored = - ReferenceEquals(subscription.Session, ownerSession); - if (!ownershipRestored && subscription is Subscription concrete) + destinationPublishQueue.TryRemoveForTransfer(subscription); + destinationPublishQueue.RemoveQueuedRequests(); + } + + if (preparedTransfer != null) + { + try { - ownershipRestored = - concrete.TryRestoreSessionAfterFailedTransfer( - context.Session, - ownerSession); + await preparedTransfer.RollbackAsync(CancellationToken.None) + .ConfigureAwait(false); } - - if (ownershipRestored) + catch (Exception rollbackError) { - if (sourceRemoved && - sourcePublishQueue != null && - ownerSession != null && - m_publishQueues.TryGetValue( - ownerSession.Id, - out SessionPublishQueue? currentOwnerQueue) && - ReferenceEquals(currentOwnerQueue, sourcePublishQueue)) - { - sourcePublishQueue.Add(subscription); - } - else if (sourceRemoved && sourceIsAbandoned) - { - m_abandonedSubscriptions.TryAdd( - subscription.Id, - subscription); - } + rollbackErrors.Add(rollbackError); } } + else if (!ReferenceEquals(subscription.Session, ownerSession) && + concreteSubscription != null && + !concreteSubscription.TryRestoreSessionAfterFailedTransfer( + context.Session, + ownerSession)) + { + rollbackErrors.Add( + new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription ownership could not be restored.")); + } + + if (sourceQueueClaim != null && + !sourcePublishQueue!.RestoreTransferClaim(sourceQueueClaim)) + { + rollbackErrors.Add( + new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Subscription source queue could not be restored.")); + } + else if (sourceQueueClaim == null && + sourceRemoved && + sourcePublishQueue != null) + { + sourcePublishQueue.Add(subscription); + } + else if (sourceRemoved && sourceIsAbandoned && + !m_abandonedSubscriptions.TryAdd( + subscription.Id, + subscription)) + { + rollbackErrors.Add( + new ServiceResultException( + StatusCodes.BadSubscriptionIdInvalid, + "Abandoned subscription source could not be restored.")); + } + + if (transferStarted) + { + concreteSubscription!.AbortTransfer(ownerSession); + } + + if (rollbackErrors.Count > 0) + { + rollbackErrors.Insert(0, transferError); + throw new AggregateException(rollbackErrors); + } + throw; } } finally @@ -2318,6 +2510,10 @@ private async ValueTask PublishSubscriptionsAsync(int sleepCycle, CancellationTo { m_logger.SubscriptionPublishTaskTaskIdX8ExitedNormally2(Task.CurrentId); } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + m_logger.SubscriptionPublishTaskTaskIdX8ExitedNormally2(Task.CurrentId); + } catch (Exception e) { m_logger.SubscriptionPublishTaskTaskIdX8ExitedUnexpectedly(e, Task.CurrentId); @@ -2347,7 +2543,8 @@ internal void ProcessAbandonedPublishTimers( for (int ii = 0; ii < abandonedSubscriptions.Count; ii++) { ISubscription subscription = abandonedSubscriptions[ii]; - if (subscription.PublishTimerExpired() != PublishingState.Expired || + if (!ContainsAbandonedSubscription(subscription) || + subscription.PublishTimerExpired() != PublishingState.Expired || !TryClaimAbandonedSubscriptionExpiration(subscription)) { continue; @@ -2369,28 +2566,48 @@ private async Task ConditionRefreshWorkerAsync() try { m_logger.SubscriptionConditionRefreshTaskTaskIdX8Started(Task.CurrentId); + WaitHandle[] waitHandles = [m_conditionRefreshEvent, m_shutdownEvent]; while (true) { ConditionRefreshTask? conditionRefreshTask = null; + bool shutdown; lock (m_conditionRefreshLock) { - if (m_conditionRefreshQueue.Count > 0) + shutdown = m_shutdownEvent.WaitOne(0); + if (!shutdown && m_conditionRefreshQueue.Count > 0) { conditionRefreshTask = m_conditionRefreshQueue.Dequeue(); } - else + else if (!shutdown) { - m_conditionRefreshEvent.Reset(); + BeforeConditionRefreshResetForTest?.Invoke(); + shutdown = m_shutdownEvent.WaitOne(0); + if (!shutdown) + { + m_conditionRefreshEvent.Reset(); + } } } + if (shutdown) + { + m_logger.SubscriptionConditionRefreshTaskTaskIdX8Exited(Task.CurrentId); + break; + } + if (conditionRefreshTask == null) { - m_conditionRefreshEvent.WaitOne(); + if (WaitHandle.WaitAny(waitHandles) == 1) + { + m_logger.SubscriptionConditionRefreshTaskTaskIdX8Exited(Task.CurrentId); + break; + } + continue; } - else if (conditionRefreshTask.MonitoredItemId == 0) + + if (conditionRefreshTask.MonitoredItemId == 0) { await DoConditionRefreshAsync(conditionRefreshTask.Subscription) .ConfigureAwait(false); @@ -2403,12 +2620,6 @@ await DoConditionRefresh2Async( .ConfigureAwait(false); } - // use shutdown event to end loop - if (m_shutdownEvent.WaitOne(0)) - { - m_logger.SubscriptionConditionRefreshTaskTaskIdX8Exited(Task.CurrentId); - break; - } } } catch (ObjectDisposedException) @@ -2421,6 +2632,17 @@ await DoConditionRefresh2Async( } } + private void SignalConditionRefreshShutdown() + { + BeforeConditionRefreshShutdownSignalForTest?.Invoke(); + lock (m_conditionRefreshLock) + { + m_shutdownEvent.Set(); + m_workerShutdown.Cancel(); + m_conditionRefreshEvent.Set(); + } + } + /// /// Cleanups the subscriptions. /// @@ -2534,6 +2756,30 @@ public override int GetHashCode() private readonly ManualResetEvent m_shutdownEvent; private readonly Queue m_conditionRefreshQueue; private readonly ManualResetEvent m_conditionRefreshEvent; + private CancellationTokenSource m_workerShutdown; + private Task? m_publishSubscriptionsTask; + private Task? m_conditionRefreshTask; + private int m_disposed; + internal Action? BeforeConditionRefreshResetForTest { get; set; } + internal Action? BeforeConditionRefreshShutdownSignalForTest { get; set; } + + internal void WakeConditionRefreshWorkerForTest() + { + m_conditionRefreshEvent.Set(); + } + + internal void StartConditionRefreshWorkerForTest() + { + m_shutdownEvent.Reset(); + m_conditionRefreshEvent.Reset(); + m_conditionRefreshTask = Task.Factory.StartNew( + ConditionRefreshWorkerAsync, + default, + TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach, + TaskScheduler.Default) + .Unwrap(); + } + private readonly ISubscriptionStore m_subscriptionStore; private readonly Lock m_statusMessagesLock = new(); diff --git a/src/Opc.Ua.Types/BuiltIn/ExtensionObject.cs b/src/Opc.Ua.Types/BuiltIn/ExtensionObject.cs index 2decf2612d..aa613cfbc2 100644 --- a/src/Opc.Ua.Types/BuiltIn/ExtensionObject.cs +++ b/src/Opc.Ua.Types/BuiltIn/ExtensionObject.cs @@ -31,6 +31,8 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; +using System.IO; +using System.Text.Json; using System.Text.Json.Serialization; using Opc.Ua.Types; @@ -54,7 +56,6 @@ namespace Opc.Ua /// how it is encoded. /// /// - // [Union] public readonly struct ExtensionObject : IFormattable, INullable, @@ -312,6 +313,133 @@ private static bool TypeIdMatches(ExpandedNodeId typeId, IEncodeable encodeable) typeId == encodeable.XmlEncodingId; } + private bool TryDecodeValue( + IServiceMessageContext messageContext, + [NotNullWhen(true)] out IEncodeable? encodeable) + { + try + { + encodeable = m_body switch + { + ByteString binary when !binary.IsNull => + DecodeBinary(binary, messageContext), + XmlElement xml => + DecodeXml(xml, messageContext), + string json => + DecodeJson(json, messageContext), + _ => default + }; + return encodeable != null && + IsMatchingStructureIdentifier( + TypeId, + encodeable, + messageContext.NamespaceUris); + } + catch (Exception ex) when ( + ex is ServiceResultException or + FormatException or + InvalidOperationException or + EndOfStreamException or + JsonException) + { + encodeable = default; + return false; + } + } + + private IEncodeable? DecodeBinary(ByteString binary, IServiceMessageContext messageContext) + { + if (!messageContext.Factory.TryGetEncodeableType(TypeId, out IEncodeableType? activator)) + { + return default; + } + + IEncodeable encodeable = activator.CreateInstance(); + using var decoder = new BinaryDecoder(binary.ToArray(), messageContext); + encodeable.Decode(decoder); + return encodeable; + } + + private IEncodeable? DecodeXml(XmlElement xml, IServiceMessageContext messageContext) + { + if (!messageContext.Factory.TryGetEncodeableType(TypeId, out _)) + { + return default; + } + + System.Xml.XmlElement? xmlElement = xml.AsXmlElement(); + if (xmlElement == null) + { + return default; + } + + using var decoder = new XmlDecoder(xmlElement, messageContext); + decoder.PushNamespace(xmlElement.NamespaceURI); + try + { + return decoder.ReadEncodeable( + xmlElement.LocalName, + TypeId); + } + finally + { + decoder.PopNamespace(); + } + } + + private IEncodeable? DecodeJson(string json, IServiceMessageContext messageContext) + { + if (!messageContext.Factory.TryGetEncodeableType(TypeId, out _)) + { + return default; + } + + using var decoder = new JsonDecoder( + "{\"" + JsonProperties.UaBody + "\":" + json + "}", + messageContext); + return decoder.ReadEncodeable(JsonProperties.UaBody, TypeId); + } + + private static bool IsMatchingStructureIdentifier( + ExpandedNodeId actual, + IEncodeable expected, + NamespaceTable namespaceUris) + { + return AreEquivalentStructureIdentifiers( + actual, + expected.TypeId, + namespaceUris) || + AreEquivalentStructureIdentifiers( + actual, + expected.BinaryEncodingId, + namespaceUris) || + AreEquivalentStructureIdentifiers( + actual, + expected.XmlEncodingId, + namespaceUris); + } + + private static bool AreEquivalentStructureIdentifiers( + ExpandedNodeId first, + ExpandedNodeId second, + NamespaceTable namespaceUris) + { + if (first.IsNull || second.IsNull) + { + return false; + } + if (first == second) + { + return true; + } + + var firstLocal = ExpandedNodeId.ToNodeId(first, namespaceUris); + var secondLocal = ExpandedNodeId.ToNodeId(second, namespaceUris); + return !firstLocal.IsNull && + !secondLocal.IsNull && + firstLocal == secondLocal; + } + /// public static bool operator ==(ExtensionObject left, ExtensionObject right) { @@ -403,7 +531,11 @@ public bool TryGetValue( return false; } - // TODO: Decode if possible + if (TryDecodeValue(messageContext, out encodeable)) + { + return true; + } + encodeable = default; return false; } diff --git a/src/Opc.Ua.Types/BuiltIn/TypeInfo.cs b/src/Opc.Ua.Types/BuiltIn/TypeInfo.cs index 09773e2006..74403f6dbb 100644 --- a/src/Opc.Ua.Types/BuiltIn/TypeInfo.cs +++ b/src/Opc.Ua.Types/BuiltIn/TypeInfo.cs @@ -1530,6 +1530,14 @@ public NodeId GetDataTypeId(Variant value, NamespaceTable namespaceUris, ITypeTa return ExpandedNodeId.ToNodeId(encodeable!.TypeId, namespaceUris); } + var extensionTypeId = ExpandedNodeId.ToNodeId( + extension.TypeId, + namespaceUris); + if (typeTree.IsKnown(extensionTypeId)) + { + return extensionTypeId; + } + return typeTree.FindDataTypeId(extension.TypeId); } diff --git a/src/Opc.Ua.Types/BuiltIn/Variant.cs b/src/Opc.Ua.Types/BuiltIn/Variant.cs index 60b3da9846..d8694b32a3 100644 --- a/src/Opc.Ua.Types/BuiltIn/Variant.cs +++ b/src/Opc.Ua.Types/BuiltIn/Variant.cs @@ -57,7 +57,6 @@ namespace Opc.Ua /// OPC UA data-types. ///
/// - // [Union] public readonly struct Variant : INullable, IFormattable, @@ -1886,6 +1885,40 @@ public bool TryGetStructure([MaybeNullWhen(false)] out T value) where T : IEn return TryGetValue(out value, null); } + /// + /// Tries to get a structure value, converting a dynamically decoded + /// structure to the requested generated type when necessary. + /// + /// The requested structure type. + /// The message context used for binary conversion. + /// The converted structure value. + /// true when the structure could be converted. + /// is null. + public bool TryGetStructure( + IServiceMessageContext context, + [MaybeNullWhen(false)] out T value) + where T : class, IEncodeable, new() + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (TryGetStructure(out value)) + { + return true; + } + + if (TryGetValue(out ExtensionObject extension) && + extension.TryGetValue(out value, context)) + { + return true; + } + + value = default; + return false; + } + /// /// Try convert the variant to a value. /// @@ -2306,6 +2339,51 @@ public bool TryGetStructure(out ArrayOf value) where T : IEncodeable return TryGetValue(out value, null); } + /// + /// Tries to get an array of structure values, converting dynamically + /// decoded structures to the requested generated type when necessary. + /// + /// The requested structure element type. + /// The message context used for binary conversion. + /// The converted structure values. + /// true when every structure could be converted. + /// is null. + public bool TryGetStructure( + IServiceMessageContext context, + out ArrayOf value) + where T : class, IEncodeable, new() + { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (TryGetStructure(out value)) + { + return true; + } + + if (!TryGetValue(out ArrayOf extensions)) + { + value = default; + return false; + } + + var structures = new T[extensions.Count]; + for (int ii = 0; ii < extensions.Count; ii++) + { + if (!extensions[ii].TryGetValue(out T? structure, context)) + { + value = default; + return false; + } + structures[ii] = structure; + } + + value = new ArrayOf(structures); + return true; + } + /// /// Get a enumeration value from the Variant. /// @@ -8207,42 +8285,81 @@ private static InvalidCastException CannotCast() typeof(T).Name)); } + /// + /// Stores the primitive Variant payload or array slice metadata without allocating boxed values. + /// [StructLayout(LayoutKind.Explicit, Size = 8)] internal struct Union { + /// + /// Stores a Boolean payload. + /// [FieldOffset(0)] public bool Boolean; + /// + /// Stores a signed byte payload. + /// [FieldOffset(0)] public sbyte SByte; + /// + /// Stores an unsigned byte payload. + /// [FieldOffset(0)] public byte Byte; + /// + /// Stores a 16-bit signed integer payload. + /// [FieldOffset(0)] public short Int16; + /// + /// Stores a 16-bit unsigned integer payload. + /// [FieldOffset(0)] public ushort UInt16; + /// + /// Stores a 32-bit signed integer payload. + /// [FieldOffset(0)] public int Int32; + /// + /// Stores a 32-bit unsigned integer payload. + /// [FieldOffset(0)] public uint UInt32; + /// + /// Stores a 64-bit signed integer payload. + /// [FieldOffset(0)] public long Int64; + /// + /// Stores a 64-bit unsigned integer payload. + /// [FieldOffset(0)] public ulong UInt64; + /// + /// Stores a single-precision floating-point payload. + /// [FieldOffset(0)] public float Float; + /// + /// Stores a double-precision floating-point payload. + /// [FieldOffset(0)] public double Double; + /// + /// Stores a DateTime payload. + /// [FieldOffset(0)] public DateTimeUtc DateTime; diff --git a/src/Opc.Ua.Types/Nodes/TypeTable.cs b/src/Opc.Ua.Types/Nodes/TypeTable.cs index e4f9ca5009..2824385fbf 100644 --- a/src/Opc.Ua.Types/Nodes/TypeTable.cs +++ b/src/Opc.Ua.Types/Nodes/TypeTable.cs @@ -214,6 +214,11 @@ public bool IsTypeOf(ExpandedNodeId subTypeId, ExpandedNodeId superTypeId) return false; } + if (startId == targetId) + { + return true; + } + lock (m_lock) { if (!m_nodes.TryGetValue(startId, out TypeInfo? typeInfo)) @@ -350,6 +355,15 @@ public bool IsEncodingFor(NodeId expectedTypeId, ExtensionObject value) return false; } + // In-memory encodeable bodies carry their DataTypeId directly, + // while decoded binary/xml bodies carry the encoding NodeId. + // Accept the direct DataTypeId (or one of its subtypes) before + // consulting the encoding map. + if (IsTypeOf(value.TypeId, expectedTypeId)) + { + return true; + } + // may still match if the extension type is an encoding for the expected type. if (IsEncodingOf(value.TypeId, expectedTypeId)) { @@ -778,7 +792,7 @@ private class TypeInfo ///
/// The node identifier. /// - /// true if this node is type of the specified NodeId otherwise, false. + /// true if this node is type of the specified NodeId otherwise, false. /// public bool IsTypeOf(NodeId nodeId) { diff --git a/src/Opc.Ua.Types/NugetREADME.md b/src/Opc.Ua.Types/NugetREADME.md index 86e8f4fade..6ab837500c 100644 --- a/src/Opc.Ua.Types/NugetREADME.md +++ b/src/Opc.Ua.Types/NugetREADME.md @@ -18,6 +18,35 @@ standard address-space proxies on the client side. The classes in this package are emitted from the standard XML NodeSet by the OPC UA source generators (`Opc.Ua.SourceGeneration.Stack`). +## WoT / NodeSet conversion + +The package also exposes the dependency-light `Opc.Ua.Wot` +conversion surface used by the WoT source generator and WoT Connectivity +runtime. `WotNodeSetConverter` converts `UANodeSet` models to and from +Thing Models / Thing Descriptions. + +The default output is semantic-first: the converter omits `uav:nodes` when +the readable vocabulary reconstructs equivalently and adds that complete +structured projection only for source facts not yet expressible. No +`uav:nodeSet` envelope is emitted when the structured path is complete. +Configure +`WotNodeSetConverterOptions.PreservationMode` as: + +* `WhenRequired` (default) — use the envelope only for a demonstrated + unsupported/future construct; +* `Always` — include an explicit byte-exact archival envelope; +* `Never` — reject any conversion that cannot be proven without the + envelope (recommended for conformance tests). + +Unmapped WoT JSON-LD members are retained individually as +pointer-addressed, digest-protected residue in standard NodeSet +`Extensions`; mapped OPC UA facts are never duplicated there. + +Typed-reference links also use NamespaceUri-qualified model names such as +`ua:HasOrderedComponent` directly in `rel`, alongside a definitive +`uav:refId` ExpandedNodeId when needed. These names improve model +semantics without replacing ExpandedNodeIds for instance identity. + ## Target frameworks `net472`, `net48`, `netstandard2.0`, `netstandard2.1`, `net8.0`, diff --git a/src/Opc.Ua.Types/Schema/NodeSetComparer.cs b/src/Opc.Ua.Types/Schema/NodeSetComparer.cs new file mode 100644 index 0000000000..c7626ab7e7 --- /dev/null +++ b/src/Opc.Ua.Types/Schema/NodeSetComparer.cs @@ -0,0 +1,375 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using System.Xml.Linq; +using Opc.Ua.Wot; + +namespace Opc.Ua.Export +{ + /// + /// The result of comparing two NodeSet2 documents after normalizing + /// insignificant XML serialization differences. + /// + public sealed class NodeSetComparisonResult + { + internal NodeSetComparisonResult(bool equivalent, IReadOnlyList differences) + { + AreEquivalent = equivalent; + Differences = differences; + } + + /// Gets a value indicating whether the documents are semantically equivalent. + public bool AreEquivalent { get; } + + /// Gets the human-readable differences, empty when equivalent. + public IReadOnlyList Differences { get; } + } + + /// + /// The result of a NodeSet2 to WoT to NodeSet2 round trip. + /// + public sealed class NodeSetRoundtripReport + { + internal NodeSetRoundtripReport( + bool nativeProjectionPreserved, + bool envelopePreserved, + bool usedPreservationEnvelope, + NodeSetComparisonResult comparison, + IReadOnlyList diagnostics) + { + NativeProjectionPreserved = nativeProjectionPreserved; + EnvelopePreserved = envelopePreserved; + UsedPreservationEnvelope = usedPreservationEnvelope; + Comparison = comparison; + Diagnostics = diagnostics; + } + + /// + /// Gets a value indicating whether the structured native projection, + /// without an envelope, reproduced an equivalent NodeSet2. + /// + public bool NativeProjectionPreserved { get; } + + /// + /// Gets a value indicating whether the envelope reproduced a byte-identical NodeSet2. + /// + public bool EnvelopePreserved { get; } + + /// + /// Gets a value indicating whether the conversion used a + /// uav:nodeSet preservation envelope. + /// + public bool UsedPreservationEnvelope { get; } + + /// Gets the canonical comparison of the source and restored NodeSet2. + public NodeSetComparisonResult Comparison { get; } + + /// Gets the diagnostics produced during the round trip. + public IReadOnlyList Diagnostics { get; } + } + + /// + /// Compares NodeSet2 documents on a canonical basis and reports round trips. + /// The canonical form ignores indentation, line endings and attribute order + /// while preserving element structure, attribute values and text so that + /// semantic changes are detected. + /// + public static class NodeSetComparer + { + /// + /// Compares two NodeSet2 documents on a canonical basis. + /// + /// The first document. + /// The second document. + /// Optional resource limits used during comparison. + /// The comparison result. + public static NodeSetComparisonResult Compare( + UANodeSet left, + UANodeSet right, + WotNodeSetConverterOptions? options = null) + { + if (left is null) + { + throw new ArgumentNullException(nameof(left)); + } + if (right is null) + { + throw new ArgumentNullException(nameof(right)); + } + return CompareXml(Serialize(left), Serialize(right), options); + } + + /// + /// Compares two serialized NodeSet2 documents on a canonical basis. + /// + /// The first serialized document. + /// The second serialized document. + /// Optional resource limits used during comparison. + /// The comparison result. + public static NodeSetComparisonResult CompareXml( + ReadOnlySpan left, + ReadOnlySpan right, + WotNodeSetConverterOptions? options = null) + { + options ??= new WotNodeSetConverterOptions(); + options.Validate(); + + string canonicalLeft; + string canonicalRight; + try + { + canonicalLeft = Canonicalize( + Encoding.UTF8.GetString(StripPreamble(left).ToArray()), + options.MaxXmlDepth); + canonicalRight = Canonicalize( + Encoding.UTF8.GetString(StripPreamble(right).ToArray()), + options.MaxXmlDepth); + } + catch (FormatException ex) + { + return new NodeSetComparisonResult(false, [ex.Message]); + } + return BuildResult(canonicalLeft, canonicalRight); + } + + /// + /// Converts a NodeSet2 document to a WoT document and back. By default, + /// the report uses native-only mode so completeness is never proved by + /// the preservation envelope. + /// + /// The NodeSet2 document to round trip. + /// Resource limits; defaults are used when omitted. + /// The round-trip report. + public static NodeSetRoundtripReport Roundtrip( + UANodeSet source, + WotNodeSetConverterOptions? options = null) + { + if (source is null) + { + throw new ArgumentNullException(nameof(source)); + } + + var diagnostics = new List(); + byte[] sourceBytes = Serialize(source); + WotNodeSetConverterOptions effectiveOptions = options ?? + new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }; + + WotConversionResult forward = + WotNodeSetConverter.FromNodeSetResult(source, null, effectiveOptions); + AddRange(diagnostics, forward.Diagnostics); + if (forward.Value is null) + { + return new NodeSetRoundtripReport( + false, + false, + false, + new NodeSetComparisonResult(false, ["The NodeSet could not be converted to a WoT document."]), + diagnostics); + } + + using WotDocument document = forward.Value; + bool usedEnvelope = document.TryGetEnvelope(out _); + WotConversionResult backward = + WotNodeSetConverter.ToNodeSetResult(document, effectiveOptions); + AddRange(diagnostics, backward.Diagnostics); + if (backward.Value is null) + { + return new NodeSetRoundtripReport( + false, + false, + usedEnvelope, + new NodeSetComparisonResult(false, ["The WoT document could not be converted back to a NodeSet."]), + diagnostics); + } + + byte[] restoredBytes = Serialize(backward.Value); + NodeSetComparisonResult comparison = CompareXml(sourceBytes, restoredBytes, effectiveOptions); + bool byteIdentical = ByteEquals(sourceBytes, restoredBytes); + return new NodeSetRoundtripReport( + !usedEnvelope && comparison.AreEquivalent, + usedEnvelope && byteIdentical, + usedEnvelope, + comparison, + diagnostics); + } + + private static NodeSetComparisonResult BuildResult(string left, string right) + { + if (string.Equals(left, right, StringComparison.Ordinal)) + { + return new NodeSetComparisonResult(true, []); + } + return new NodeSetComparisonResult(false, [DescribeDifference(left, right)]); + } + + private static string DescribeDifference(string left, string right) + { + int limit = Math.Min(left.Length, right.Length); + int index = 0; + while (index < limit && left[index] == right[index]) + { + index++; + } + int start = Math.Max(0, index - 24); + string leftContext = Excerpt(left, start, index); + string rightContext = Excerpt(right, start, index); + return string.Format( + System.Globalization.CultureInfo.InvariantCulture, + "Canonical NodeSet documents differ at position {0}: '{1}' vs '{2}'.", + index, + leftContext, + rightContext); + } + + private static string Excerpt(string text, int start, int index) + { + int end = Math.Min(text.Length, index + 24); + return text.Substring(start, end - start); + } + + private static string Canonicalize(string xml, int maxXmlDepth) + { + var settings = new XmlReaderSettings + { + DtdProcessing = DtdProcessing.Prohibit, + XmlResolver = null, + IgnoreWhitespace = true, + IgnoreComments = true, + IgnoreProcessingInstructions = true + }; + XDocument document; + using (var stringReader = new StringReader(xml)) + using (XmlReader reader = XmlReader.Create(stringReader, settings)) + { + document = XDocument.Load(reader); + } + var builder = new StringBuilder(); + if (document.Root is not null) + { + WriteElement(builder, document.Root, 1, maxXmlDepth); + } + return builder.ToString(); + } + + private static void WriteElement( + StringBuilder builder, + XElement element, + int depth, + int maxXmlDepth) + { + if (depth > maxXmlDepth) + { + throw new FormatException( + string.Format( + System.Globalization.CultureInfo.InvariantCulture, + "NodeSet XML exceeds the configured maximum depth of {0}.", + maxXmlDepth)); + } + + builder.Append('<').Append(element.Name.ToString()); + + var attributes = new List(element.Attributes()); + attributes.Sort(static (left, right) => + string.CompareOrdinal(left.Name.ToString(), right.Name.ToString())); + foreach (XAttribute attribute in attributes) + { + builder.Append(' ') + .Append(attribute.Name.ToString()) + .Append("=\"") + .Append(attribute.Value) + .Append('"'); + } + builder.Append('>'); + + foreach (XNode node in element.Nodes()) + { + switch (node) + { + case XElement child: + WriteElement(builder, child, depth + 1, maxXmlDepth); + break; + case XText text: + builder.Append(text.Value); + break; + } + } + + builder.Append("'); + } + + private static byte[] Serialize(UANodeSet nodeSet) + { + using var stream = new MemoryStream(); + nodeSet.Write(stream); + return stream.ToArray(); + } + + private static ReadOnlySpan StripPreamble(ReadOnlySpan bytes) + { + if (bytes.Length >= 3 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) + { + return bytes[3..]; + } + return bytes; + } + + private static bool ByteEquals(ReadOnlySpan left, ReadOnlySpan right) + { + if (left.Length != right.Length) + { + return false; + } + for (int ii = 0; ii < left.Length; ii++) + { + if (left[ii] != right[ii]) + { + return false; + } + } + return true; + } + + private static void AddRange(List target, IReadOnlyList source) + { + for (int ii = 0; ii < source.Count; ii++) + { + target.Add(source[ii]); + } + } + } +} diff --git a/src/Opc.Ua.Types/Utils/FileSystem/IAtomicFileReplace.cs b/src/Opc.Ua.Types/Utils/FileSystem/IAtomicFileReplace.cs new file mode 100644 index 0000000000..052c2b4e5e --- /dev/null +++ b/src/Opc.Ua.Types/Utils/FileSystem/IAtomicFileReplace.cs @@ -0,0 +1,64 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace Opc.Ua +{ + /// + /// Optional capability that publishes a fully written + /// file under its final name in a single indivisible step. + /// + /// Durable writers stage content under a temporary name and then publish it, so + /// that an interrupted write can never leave a partially written file visible at + /// the destination. Expressing that as a separate capability keeps + /// itself unchanged, which matters because that + /// interface is implemented outside this repository and the library targets + /// frameworks without default interface members. + /// + /// + /// A file system that cannot publish indivisibly simply does not implement this + /// interface. Callers that require durability must detect its absence and decide + /// explicitly what to do, rather than silently degrading to a destructive write. + /// + /// + public interface IAtomicFileReplace + { + /// + /// Publishes as + /// in a single indivisible step, overwriting any existing destination. + /// + /// The source is consumed by the operation. Observers of + /// only ever see the complete previous + /// content or the complete new content, never an intermediate state. + /// + /// + /// The staged file to publish. + /// The final name to publish it under. + void Replace(string sourcePath, string destinationPath); + } +} diff --git a/src/Opc.Ua.Types/Utils/FileSystem/LocalFileSystem.cs b/src/Opc.Ua.Types/Utils/FileSystem/LocalFileSystem.cs index 72f319d119..c828a23bb3 100644 --- a/src/Opc.Ua.Types/Utils/FileSystem/LocalFileSystem.cs +++ b/src/Opc.Ua.Types/Utils/FileSystem/LocalFileSystem.cs @@ -35,7 +35,7 @@ namespace Opc.Ua /// /// Default file system implementation that uses System.IO /// - public class LocalFileSystem : IFileSystem + public class LocalFileSystem : IFileSystem, IAtomicFileReplace { /// /// Get singleton instance @@ -92,5 +92,25 @@ public long GetLength(string path) { return new FileInfo(path).Length; } + + /// + public void Replace(string sourcePath, string destinationPath) + { + string? directoryName = Path.GetDirectoryName(destinationPath); + if (directoryName != null && !Directory.Exists(directoryName)) + { + Directory.CreateDirectory(directoryName); + } + + if (File.Exists(destinationPath)) + { + // Replace keeps the destination's identity and discards the source, but + // it refuses to run when the two paths sit on different volumes. + File.Replace(sourcePath, destinationPath, null); + return; + } + + File.Move(sourcePath, destinationPath); + } } } diff --git a/src/Opc.Ua.Types/Utils/FileSystem/VirtualFileSystem.cs b/src/Opc.Ua.Types/Utils/FileSystem/VirtualFileSystem.cs index 07233ab644..92188291c7 100644 --- a/src/Opc.Ua.Types/Utils/FileSystem/VirtualFileSystem.cs +++ b/src/Opc.Ua.Types/Utils/FileSystem/VirtualFileSystem.cs @@ -40,7 +40,7 @@ namespace Opc.Ua /// /// Virtual file system /// - public class VirtualFileSystem : IFileSystem, IDisposable + public class VirtualFileSystem : IFileSystem, IAtomicFileReplace, IDisposable { /// /// Get created files in this file system @@ -162,6 +162,30 @@ public bool Exists(string path, bool isDirectory = false) return m_files.ContainsKey(path) || SafeExists(path); } + /// + public void Replace(string sourcePath, string destinationPath) + { + if (!m_files.TryRemove(sourcePath, out VirtualFile? staged)) + { + throw new FileNotFoundException( + "The staged file to publish does not exist.", + sourcePath); + } + + // Re-keying the whole entry publishes the file in one step, so a reader sees + // either the previous content or the new content and never a partial write. + VirtualFile? replaced = null; + m_files.AddOrUpdate( + destinationPath, + staged, + (_, existing) => + { + replaced = existing; + return staged; + }); + replaced?.Dispose(); + } + /// public DateTime GetLastWriteTime(string path) { diff --git a/src/Opc.Ua.Types/Wot/WotDiagnostics.cs b/src/Opc.Ua.Types/Wot/WotDiagnostics.cs new file mode 100644 index 0000000000..192ea8838b --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotDiagnostics.cs @@ -0,0 +1,360 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace Opc.Ua.Wot +{ + /// + /// Severity of a . + /// + public enum WotDiagnosticSeverity + { + /// An informational note; conversion succeeded. + Info, + + /// A recoverable concern; conversion succeeded with caveats. + Warning, + + /// A fatal problem; the associated conversion did not succeed. + Error + } + + /// + /// Stable diagnostic codes emitted by the WoT/NodeSet conversion. + /// + public enum WotDiagnosticCode + { + /// No specific code. + None = 0, + + /// The JSON document exceeded the configured byte limit. + JsonDocumentTooLarge = 1000, + + /// The NodeSet2 payload exceeded the configured byte limit. + NodeSetTooLarge = 1001, + + /// A nesting depth limit was exceeded. + DepthExceeded = 1002, + + /// The node count limit was exceeded. + NodeCountExceeded = 1003, + + /// The affordance count limit was exceeded. + AffordanceCountExceeded = 1004, + + /// The JSON document was malformed. + MalformedJson = 1005, + + /// The NodeSet2 XML was malformed. + MalformedNodeSet = 1006, + + /// The preservation envelope is missing. + EnvelopeMissing = 2000, + + /// The preservation envelope is structurally invalid. + EnvelopeInvalid = 2001, + + /// The envelope content type is not supported. + UnsupportedContentType = 2002, + + /// The envelope encoding is not supported. + UnsupportedEncoding = 2003, + + /// The envelope data was not valid base64. + InvalidBase64 = 2004, + + /// The envelope digest was not a valid SHA-256 value. + InvalidDigest = 2005, + + /// The envelope digest did not match the decoded payload. + DigestMismatch = 2006, + + /// A native member restated a baseline fact inconsistently. + NativeProjectionConflict = 3000, + + /// Neither an envelope nor a native projection was present. + NoConvertibleContent = 3001, + + /// A native projection record was structurally invalid. + NativeProjectionInvalid = 3002, + + /// + /// The structured native projection could not reproduce the source + /// NodeSet and required an explicit preservation-envelope fallback. + /// + NativeProjectionIncomplete = 3003, + + /// + /// Pointer-addressed WoT JSON residue in a NodeSet Extension was invalid. + /// + ResidueInvalid = 3004, + + /// + /// Preserved WoT JSON residue conflicted with a value reconstructed from + /// OPC UA model facts. + /// + ResidueConflict = 3005, + + /// A referenced target could not be resolved to a NodeId. + UnresolvedReference = 4000, + + /// A NodeId was generated deterministically because none was supplied. + GeneratedNodeId = 4001, + + /// A WoT construct had no faithful NodeSet2 representation. + LossySynthesis = 4002, + + /// A required BrowseName or title was missing. + MissingBrowseName = 4003, + + /// A DataSchema could not be mapped to an OPC UA DataType. + UnsupportedSchema = 4004, + + /// External resolution detected a cycle. + ResolverCycle = 5000, + + /// External resolution exceeded the configured depth. + ResolverDepthExceeded = 5001, + + /// External resolution exceeded a configured resource limit. + ResolverLimitExceeded = 5002, + + /// An external document could not be resolved. + ResolverNotFound = 5003, + + /// A document validation rule was violated. + ValidationError = 6000, + + /// + /// A portable identity term used the session-local ns=<index> + /// form instead of an OPC 10000-6 ExpandedNodeId (WoT Binding Section 5.1.1). + /// + NonPortableIdentity = 6001, + + /// + /// An event affordance annotated @type: uav:eventType also set + /// uav:isEvent: false, contradicting the event mapping + /// (WoT Binding Section 5.2). + /// + EventAnnotationConflict = 6002, + + /// + /// A NamespaceUri-qualified model-name hint could not be resolved and + /// no definitive ExpandedNodeId fallback was available. + /// + ModelConceptUnresolved = 6003, + + /// + /// A model-name hint and its definitive ExpandedNodeId resolved to + /// different OPC UA model Nodes. + /// + ModelConceptConflict = 6004, + + /// + /// A readable QualifiedName or BrowsePath persisted a numeric namespace + /// index instead of a NamespaceUri-qualified form. + /// + NonPortableQualifiedName = 6005 + } + + /// + /// Locates a diagnostic within a WoT document and/or a NodeSet2 document. + /// + public sealed class WotLocation + { + /// + /// Initializes a new instance of the class. + /// + /// An RFC 6901 JSON Pointer into the WoT document. + /// An OPC UA NodeId string. + /// An OPC UA attribute name. + /// A reference descriptor (type and target). + public WotLocation( + string? jsonPointer = null, + string? nodeId = null, + string? attribute = null, + string? reference = null) + { + JsonPointer = jsonPointer; + NodeId = nodeId; + Attribute = attribute; + Reference = reference; + } + + /// Gets the RFC 6901 JSON Pointer of the location, if any. + public string? JsonPointer { get; } + + /// Gets the OPC UA NodeId of the location, if any. + public string? NodeId { get; } + + /// Gets the OPC UA attribute name of the location, if any. + public string? Attribute { get; } + + /// Gets the reference descriptor of the location, if any. + public string? Reference { get; } + + /// Creates a location from a JSON Pointer. + public static WotLocation FromPointer(string jsonPointer) + { + return new WotLocation(jsonPointer: jsonPointer); + } + + /// Creates a location from a NodeId and optional attribute. + public static WotLocation FromNode(string nodeId, string? attribute = null) + { + return new WotLocation(nodeId: nodeId, attribute: attribute); + } + + /// + public override string ToString() + { + var builder = new StringBuilder(); + Append(builder, nameof(JsonPointer), JsonPointer); + Append(builder, nameof(NodeId), NodeId); + Append(builder, nameof(Attribute), Attribute); + Append(builder, nameof(Reference), Reference); + return builder.Length == 0 ? "(document)" : builder.ToString(); + + static void Append(StringBuilder builder, string name, string? value) + { + if (string.IsNullOrEmpty(value)) + { + return; + } + if (builder.Length > 0) + { + builder.Append(", "); + } + builder.Append(name).Append('=').Append(value); + } + } + } + + /// + /// A single structured conversion diagnostic. + /// + public sealed class WotDiagnostic + { + /// + /// Initializes a new instance of the class. + /// + /// The severity of the diagnostic. + /// The stable diagnostic code. + /// A human-readable message. + /// The optional location of the diagnostic. + public WotDiagnostic( + WotDiagnosticSeverity severity, + WotDiagnosticCode code, + string message, + WotLocation? location = null) + { + Severity = severity; + Code = code; + Message = message ?? throw new ArgumentNullException(nameof(message)); + Location = location; + } + + /// Gets the severity of the diagnostic. + public WotDiagnosticSeverity Severity { get; } + + /// Gets the stable diagnostic code. + public WotDiagnosticCode Code { get; } + + /// Gets the human-readable message. + public string Message { get; } + + /// Gets the optional location of the diagnostic. + public WotLocation? Location { get; } + + /// + public override string ToString() + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} WOT{1:D4}: {2}{3}", + Severity, + (int)Code, + Message, + Location is null ? string.Empty : " [" + Location + "]"); + } + } + + /// + /// The outcome of a WoT/NodeSet conversion: an optional value together + /// with the structured diagnostics that describe how it was produced. + /// + /// The type of the produced value. + public sealed class WotConversionResult + where T : class + { + /// + /// Initializes a new instance of the class. + /// + /// The produced value, or null on failure. + /// The diagnostics produced. + public WotConversionResult(T? value, IReadOnlyList diagnostics) + { + Value = value; + Diagnostics = diagnostics ?? throw new ArgumentNullException(nameof(diagnostics)); + } + + /// Gets the produced value, or null when conversion failed. + public T? Value { get; } + + /// Gets the diagnostics produced during conversion. + public IReadOnlyList Diagnostics { get; } + + /// Gets a value indicating whether any error diagnostic was produced. + public bool HasErrors + { + get + { + for (int ii = 0; ii < Diagnostics.Count; ii++) + { + if (Diagnostics[ii].Severity == WotDiagnosticSeverity.Error) + { + return true; + } + } + return false; + } + } + + /// + /// Gets a value indicating whether conversion produced a usable value + /// without any error diagnostic. + /// + public bool Success => Value is not null && !HasErrors; + } +} diff --git a/src/Opc.Ua.Types/Wot/WotDocument.cs b/src/Opc.Ua.Types/Wot/WotDocument.cs new file mode 100644 index 0000000000..d76e7ccca9 --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotDocument.cs @@ -0,0 +1,630 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Text.Json; + +namespace Opc.Ua.Wot +{ + /// + /// The kind of WoT document, derived from its @type. + /// + public enum WotDocumentKind + { + /// The document kind could not be determined. + Unknown, + + /// A class-level Thing Model (an OPC UA type projection). + ThingModel, + + /// An instance-level Thing Description (an OPC UA Object projection). + ThingDescription + } + + /// + /// A losslessly retained Web of Things JSON document with a lexical + /// access surface over the W3C Thing Description / Thing Model model. + /// + /// + /// The original UTF-8 representation is retained so unknown JSON-LD terms + /// can be written back byte-for-byte without a lossy object-model + /// projection. Typed access is exposed over the parsed + /// tree rather than one POCO per + /// W3C class, so members the binding does not model are still reachable and + /// preserved. A separate deterministic canonical writer is provided. + /// + public sealed class WotDocument : IDisposable + { + /// The JSON-LD prefix bound to the OPC UA WoT Binding namespace. + public const string UavPrefix = "uav:"; + + private WotDocument(byte[] utf8Json, JsonDocument document) + { + m_utf8Json = utf8Json; + m_document = document; + } + + /// + /// Gets the parsed document root. + /// + public JsonElement RootElement => m_document.RootElement; + + /// + /// Gets the original UTF-8 document bytes. + /// + public ReadOnlyMemory Utf8Json => m_utf8Json; + + /// + /// Gets the document kind derived from @type. + /// + public WotDocumentKind Kind + { + get + { + foreach (string token in TypeTokens) + { + if (string.Equals(token, "tm:ThingModel", StringComparison.Ordinal) || + string.Equals(token, UavPrefix + "objectType", StringComparison.Ordinal) || + string.Equals(token, UavPrefix + "variableType", StringComparison.Ordinal)) + { + return WotDocumentKind.ThingModel; + } + } + foreach (string token in TypeTokens) + { + if (string.Equals(token, UavPrefix + "object", StringComparison.Ordinal) || + string.Equals(token, UavPrefix + "variable", StringComparison.Ordinal) || + string.Equals(token, UavPrefix + "method", StringComparison.Ordinal)) + { + return WotDocumentKind.ThingDescription; + } + } + return WotDocumentKind.Unknown; + } + } + + /// + /// Gets the @type tokens of the document. + /// + public IReadOnlyList TypeTokens + { + get + { + m_typeTokens ??= ReadStringTokens("@type"); + return m_typeTokens; + } + } + + /// Gets the document title, if present. + public string? Title => GetRootString("title"); + + /// Gets the document id, if present. + public string? Id => GetRootString("id"); + + /// + /// Attempts to get the @context element. + /// + /// The context element on success. + /// true when a @context member is present. + public bool TryGetContext(out JsonElement context) + { + return TryGetRootProperty("@context", out context); + } + + /// Gets the properties affordance map (name to schema). + public IReadOnlyDictionary Properties + { + get + { + m_properties ??= ReadObjectMap("properties"); + return m_properties; + } + } + + /// Gets the actions affordance map (name to affordance). + public IReadOnlyDictionary Actions + { + get + { + m_actions ??= ReadObjectMap("actions"); + return m_actions; + } + } + + /// Gets the events affordance map (name to affordance). + public IReadOnlyDictionary Events + { + get + { + m_events ??= ReadObjectMap("events"); + return m_events; + } + } + + /// Gets the securityDefinitions map, if present. + public IReadOnlyDictionary SecurityDefinitions + { + get + { + m_securityDefinitions ??= ReadObjectMap("securityDefinitions"); + return m_securityDefinitions; + } + } + + /// Gets the schemaDefinitions map, if present. + public IReadOnlyDictionary SchemaDefinitions + { + get + { + m_schemaDefinitions ??= ReadObjectMap("schemaDefinitions"); + return m_schemaDefinitions; + } + } + + /// Gets the top-level links array elements. + public IReadOnlyList Links + { + get + { + m_links ??= ReadArray("links"); + return m_links; + } + } + + /// Gets the top-level forms array elements. + public IReadOnlyList Forms + { + get + { + m_forms ??= ReadArray("forms"); + return m_forms; + } + } + + /// + /// Attempts to get the uav:nodeSet preservation envelope. + /// + /// The envelope element on success. + /// true when the envelope is present as an object. + public bool TryGetEnvelope(out JsonElement envelope) + { + return TryGetUav("nodeSet", out envelope) && + envelope.ValueKind == JsonValueKind.Object; + } + + /// + /// Attempts to get the native uav:nodes projection. + /// + /// The projection element on success. + /// true when the projection is present as an object. + public bool TryGetNativeProjection(out JsonElement projection) + { + return TryGetUav("nodes", out projection) && + projection.ValueKind == JsonValueKind.Object; + } + + /// + /// Attempts to get a uav:-prefixed member of the document root. + /// + /// The local term name without the prefix. + /// The member value on success. + /// true when the member is present. + public bool TryGetUav(string localName, out JsonElement value) + { + if (localName is null) + { + throw new ArgumentNullException(nameof(localName)); + } + return TryGetRootProperty(UavPrefix + localName, out value); + } + + /// + /// Evaluates an RFC 6901 JSON Pointer against the document root. + /// + /// The JSON Pointer (empty string addresses the root). + /// The addressed element on success. + /// true when the pointer resolves. + public bool TryEvaluatePointer(string pointer, out JsonElement value) + { + if (pointer is null) + { + throw new ArgumentNullException(nameof(pointer)); + } + return TryEvaluatePointer(RootElement, pointer, out value); + } + + /// + /// Evaluates an RFC 6901 JSON Pointer against a given element. + /// + /// The element to evaluate the pointer against. + /// The JSON Pointer (empty string addresses ). + /// The addressed element on success. + /// true when the pointer resolves. + public static bool TryEvaluatePointer(JsonElement root, string pointer, out JsonElement value) + { + if (pointer is null) + { + throw new ArgumentNullException(nameof(pointer)); + } + + value = root; + if (pointer.Length == 0) + { + return true; + } + if (pointer[0] != '/') + { + value = default; + return false; + } + + JsonElement current = root; + int index = 1; + while (index <= pointer.Length) + { + int next = pointer.IndexOf('/', index); + if (next < 0) + { + next = pointer.Length; + } + string token = UnescapePointerToken(pointer.Substring(index, next - index)); + index = next + 1; + + switch (current.ValueKind) + { + case JsonValueKind.Object: + if (!current.TryGetProperty(token, out current)) + { + value = default; + return false; + } + break; + case JsonValueKind.Array: + if (!TryGetArrayElement(current, token, out current)) + { + value = default; + return false; + } + break; + default: + value = default; + return false; + } + } + + value = current; + return true; + } + + /// + /// Parses a UTF-8 WoT document while preserving its original bytes. + /// + /// The UTF-8 encoded document. + /// Resource limits; defaults are used when omitted. + /// The parsed, byte-preserving document. + /// Thrown when the document exceeds the configured byte limit. + public static WotDocument Parse( + ReadOnlyMemory utf8Json, + WotNodeSetConverterOptions? options = null) + { + options ??= new WotNodeSetConverterOptions(); + options.Validate(); + if (utf8Json.Length > options.MaxJsonDocumentSize) + { + throw new FormatException( + $"WoT document exceeds the configured {options.MaxJsonDocumentSize} byte limit."); + } + + byte[] copy = utf8Json.ToArray(); + JsonDocument document = JsonDocument.Parse( + copy, + new JsonDocumentOptions + { + AllowTrailingCommas = false, + CommentHandling = JsonCommentHandling.Disallow, + MaxDepth = options.MaxJsonDepth + }); + return new WotDocument(copy, document); + } + + /// + /// Writes the original UTF-8 document bytes to . + /// + /// The destination stream. + public void Write(Stream stream) + { + if (stream is null) + { + throw new ArgumentNullException(nameof(stream)); + } + stream.Write(m_utf8Json, 0, m_utf8Json.Length); + } + + /// + /// Writes a deterministic canonical serialization of the document to + /// . Object members are ordered by name and + /// insignificant whitespace is removed so equivalent documents produce + /// byte-identical output. Unlike this does + /// not preserve the original byte layout. + /// + /// The destination stream. + public void WriteCanonical(Stream stream) + { + if (stream is null) + { + throw new ArgumentNullException(nameof(stream)); + } + using var writer = new Utf8JsonWriter( + stream, + new JsonWriterOptions { Indented = false, SkipValidation = false }); + WriteCanonical(writer, RootElement); + writer.Flush(); + } + + /// + /// Returns the deterministic canonical serialization of the document. + /// + /// The canonical UTF-8 bytes. + public byte[] ToCanonicalUtf8() + { + using var stream = new MemoryStream(); + WriteCanonical(stream); + return stream.ToArray(); + } + + /// + public void Dispose() + { + m_document.Dispose(); + } + + internal static WotDocument FromOwnedBytes( + byte[] utf8Json, + WotNodeSetConverterOptions options) + { + JsonDocument document = JsonDocument.Parse( + utf8Json, + new JsonDocumentOptions + { + AllowTrailingCommas = false, + CommentHandling = JsonCommentHandling.Disallow, + MaxDepth = options.MaxJsonDepth + }); + return new WotDocument(utf8Json, document); + } + + private static void WriteCanonical(Utf8JsonWriter writer, JsonElement element) + { + switch (element.ValueKind) + { + case JsonValueKind.Object: + writer.WriteStartObject(); + var members = new List>(); + foreach (JsonProperty property in element.EnumerateObject()) + { + members.Add(new KeyValuePair(property.Name, property.Value)); + } + members.Sort(static (left, right) => + string.CompareOrdinal(left.Key, right.Key)); + foreach (KeyValuePair member in members) + { + writer.WritePropertyName(member.Key); + WriteCanonical(writer, member.Value); + } + writer.WriteEndObject(); + break; + case JsonValueKind.Array: + writer.WriteStartArray(); + foreach (JsonElement item in element.EnumerateArray()) + { + WriteCanonical(writer, item); + } + writer.WriteEndArray(); + break; + case JsonValueKind.String: + writer.WriteStringValue(element.GetString()); + break; + case JsonValueKind.Number: + writer.WriteRawValue(element.GetRawText(), skipInputValidation: true); + break; + case JsonValueKind.True: + case JsonValueKind.False: + writer.WriteBooleanValue(element.GetBoolean()); + break; + case JsonValueKind.Null: + writer.WriteNullValue(); + break; + default: + writer.WriteNullValue(); + break; + } + } + + private static bool TryGetArrayElement(JsonElement array, string token, out JsonElement value) + { + value = default; + if (token.Length == 0 || + (token.Length > 1 && token[0] == '0')) + { + return false; + } + if (!int.TryParse( + token, + NumberStyles.None, + CultureInfo.InvariantCulture, + out int arrayIndex)) + { + return false; + } + if (arrayIndex < 0 || arrayIndex >= array.GetArrayLength()) + { + return false; + } + value = array[arrayIndex]; + return true; + } + + private static string UnescapePointerToken(string token) + { + int tilde = -1; + for (int ii = 0; ii < token.Length; ii++) + { + if (token[ii] == '~') + { + tilde = ii; + break; + } + } + if (tilde < 0) + { + return token; + } + + var builder = new StringBuilder(token.Length); + builder.Append(token, 0, tilde); + for (int ii = tilde; ii < token.Length; ii++) + { + char current = token[ii]; + if (current == '~' && ii + 1 < token.Length) + { + char next = token[ii + 1]; + if (next == '1') + { + builder.Append('/'); + ii++; + continue; + } + if (next == '0') + { + builder.Append('~'); + ii++; + continue; + } + } + builder.Append(current); + } + return builder.ToString(); + } + + private bool TryGetRootProperty(string name, out JsonElement value) + { + JsonElement root = RootElement; + if (root.ValueKind == JsonValueKind.Object && + root.TryGetProperty(name, out value)) + { + return true; + } + value = default; + return false; + } + + private string? GetRootString(string name) + { + return TryGetRootProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private List ReadStringTokens(string name) + { + var tokens = new List(); + if (TryGetRootProperty(name, out JsonElement value)) + { + if (value.ValueKind == JsonValueKind.String) + { + string? token = value.GetString(); + if (token is not null) + { + tokens.Add(token); + } + } + else if (value.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement item in value.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String) + { + string? token = item.GetString(); + if (token is not null) + { + tokens.Add(token); + } + } + } + } + } + return tokens; + } + + private Dictionary ReadObjectMap(string name) + { + var map = new Dictionary(StringComparer.Ordinal); + if (TryGetRootProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.Object) + { + foreach (JsonProperty property in value.EnumerateObject()) + { + map[property.Name] = property.Value; + } + } + return map; + } + + private List ReadArray(string name) + { + var items = new List(); + if (TryGetRootProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement item in value.EnumerateArray()) + { + items.Add(item); + } + } + return items; + } + + private readonly byte[] m_utf8Json; + private readonly JsonDocument m_document; + private IReadOnlyList? m_typeTokens; + private IReadOnlyDictionary? m_properties; + private IReadOnlyDictionary? m_actions; + private IReadOnlyDictionary? m_events; + private IReadOnlyDictionary? m_securityDefinitions; + private IReadOnlyDictionary? m_schemaDefinitions; + private IReadOnlyList? m_links; + private IReadOnlyList? m_forms; + } +} diff --git a/src/Opc.Ua.Types/Wot/WotJsonResidue.cs b/src/Opc.Ua.Types/Wot/WotJsonResidue.cs new file mode 100644 index 0000000000..74854be8af --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotJsonResidue.cs @@ -0,0 +1,1114 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Xml; +using Opc.Ua.Export; + +namespace Opc.Ua.Wot +{ + /// + /// Preserves only WoT members that have no OPC UA model representation as + /// pointer-addressed JSON values in a standard NodeSet Extension. + /// + internal static class WotJsonResidue + { + private const string ResidueElement = "WoTJsonResidue"; + private const string MemberElement = "Member"; + private const string Version = "1.0"; + + private sealed class Entry + { + public required string Pointer { get; init; } + + public required string Json { get; init; } + + public string? LinkRel { get; init; } + + public string? LinkHref { get; init; } + + public string? LinkRefId { get; init; } + + public string? LinkRefName { get; init; } + } + + public static void Replace( + UANodeSet nodeSet, + WotDocument document, + WotNodeSetConverterOptions options, + List diagnostics) + { + List entries = Capture(document.RootElement); + var extensions = new List(); + if (nodeSet.Extensions is not null) + { + foreach (System.Xml.XmlElement extension in nodeSet.Extensions) + { + if (!IsResidue(extension)) + { + extensions.Add(extension); + } + } + } + + if (entries.Count > 0) + { + int total = 0; + foreach (Entry entry in entries) + { + total += Encoding.UTF8.GetByteCount(entry.Json); + if (total > options.MaxJsonDocumentSize) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.JsonDocumentTooLarge, + $"Unmapped WoT residue exceeds the configured " + + $"{options.MaxJsonDocumentSize} byte limit.")); + return; + } + } + extensions.Add(CreateExtension(entries)); + } + + nodeSet.Extensions = extensions.Count == 0 ? null : [.. extensions]; + } + + public static byte[] Apply( + byte[] generatedJson, + UANodeSet nodeSet, + WotNodeSetConverterOptions options, + List diagnostics) + { + List entries = ReadEntries(nodeSet, options, diagnostics); + if (entries.Count == 0) + { + return generatedJson; + } + + JsonNode? root; + try + { + root = JsonNode.Parse( + Encoding.UTF8.GetString(generatedJson), + nodeOptions: null, + documentOptions: new JsonDocumentOptions + { + MaxDepth = options.MaxJsonDepth, + CommentHandling = JsonCommentHandling.Disallow + }); + } + catch (JsonException ex) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"The generated WoT document could not be parsed before " + + $"applying residue: {ex.Message}")); + return generatedJson; + } + if (root is null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + "The generated WoT document could not be parsed before applying residue.")); + return generatedJson; + } + + foreach (Entry entry in entries) + { + JsonNode? value; + try + { + value = JsonNode.Parse( + entry.Json, + nodeOptions: null, + documentOptions: new JsonDocumentOptions + { + MaxDepth = options.MaxJsonDepth, + CommentHandling = JsonCommentHandling.Disallow + }); + } + catch (JsonException ex) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue at '{entry.Pointer}' is not valid JSON: {ex.Message}", + WotLocation.FromPointer(entry.Pointer))); + continue; + } + if (value is null && !string.Equals(entry.Json, "null", StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue at '{entry.Pointer}' could not be parsed.", + WotLocation.FromPointer(entry.Pointer))); + continue; + } + if (entry.LinkRel is not null) + { + ApplyLinkEntry(root, entry, value, diagnostics); + } + else + { + ApplyEntry(root, entry.Pointer, value, diagnostics); + } + } + + try + { + return Encoding.UTF8.GetBytes(root.ToJsonString( + new JsonSerializerOptions + { + WriteIndented = true, + MaxDepth = options.MaxJsonDepth + })); + } + catch (Exception ex) when (ex is JsonException or InvalidOperationException) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"The WoT residue exceeds the configured JSON depth: {ex.Message}")); + return generatedJson; + } + } + + private static List Capture(JsonElement root) + { + var entries = new List(); + if (root.ValueKind != JsonValueKind.Object) + { + return entries; + } + foreach (JsonProperty property in root.EnumerateObject()) + { + string pointer = "/" + Escape(property.Name); + switch (property.Name) + { + case "@context": + CaptureContext(property.Value, pointer, entries); + break; + case "properties": + case "actions": + case "events": + CaptureAffordanceMap(property.Value, pointer, entries); + break; + case "links": + CaptureLinks(property.Value, pointer, entries); + break; + case "@type": + case "title": + case "description": + case "uav:browseName": + case "uav:id": + case "uav:isEvent": + case "uav:hasComponent": + case "uav:componentOf": + case "uav:nodeSet": + case "uav:nodes": + break; + default: + Add(entries, pointer, property.Value); + break; + } + } + return entries; + } + + private static void CaptureContext( + JsonElement context, + string pointer, + List entries) + { + if (context.ValueKind != JsonValueKind.Array) + { + Add(entries, pointer, context); + return; + } + + foreach (JsonElement item in context.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String && + string.Equals( + item.GetString(), + WotVocabulary.WotContext, + StringComparison.Ordinal)) + { + continue; + } + if (item.ValueKind == JsonValueKind.Object && + item.TryGetProperty("uav", out JsonElement uav) && + uav.ValueKind == JsonValueKind.String && + string.Equals( + uav.GetString(), + WotVocabulary.VocabularyNamespace, + StringComparison.Ordinal)) + { + foreach (JsonProperty property in item.EnumerateObject()) + { + if (!IsGeneratedContextBinding(property)) + { + Add( + entries, + pointer + "/1/" + Escape(property.Name), + property.Value); + } + } + continue; + } + Add(entries, pointer + "/-", item); + } + } + + private static bool IsGeneratedContextBinding(JsonProperty property) + { + if (property.Name is "uav" or "ua") + { + return true; + } + if (!property.Name.StartsWith("ns", StringComparison.Ordinal) || + property.Name.Length == 2) + { + return false; + } + for (int ii = 2; ii < property.Name.Length; ii++) + { + if (!char.IsDigit(property.Name[ii])) + { + return false; + } + } + return property.Value.ValueKind == JsonValueKind.String; + } + + private static void CaptureAffordanceMap( + JsonElement map, + string pointer, + List entries) + { + if (map.ValueKind != JsonValueKind.Object) + { + Add(entries, pointer, map); + return; + } + var used = new HashSet(StringComparer.Ordinal); + foreach (JsonProperty affordance in map.EnumerateObject()) + { + string projectedName = affordance.Name; + if (affordance.Value.ValueKind == JsonValueKind.Object && + affordance.Value.TryGetProperty( + "uav:browseName", + out JsonElement browseName) && + browseName.ValueKind == JsonValueKind.String && + LocalName(browseName.GetString()) is { Length: > 0 } localName) + { + projectedName = localName; + } + projectedName = UniqueKey(projectedName, used); + string affordancePointer = pointer + "/" + Escape(projectedName); + if (affordance.Value.ValueKind != JsonValueKind.Object) + { + Add(entries, affordancePointer, affordance.Value); + continue; + } + foreach (JsonProperty property in affordance.Value.EnumerateObject()) + { + switch (property.Name) + { + case "@type": + case "title": + case "description": + case "uav:browseName": + case "uav:id": + case "uav:isEvent": + case "uav:modellingRule": + case "type": + case "readOnly": + case "writeOnly": + case "observable": + break; + default: + Add( + entries, + affordancePointer + "/" + Escape(property.Name), + property.Value); + break; + } + } + } + } + + private static string UniqueKey(string candidate, HashSet used) + { + if (used.Add(candidate)) + { + return candidate; + } + int suffix = 2; + string unique = candidate + "_" + + suffix.ToString(CultureInfo.InvariantCulture); + while (!used.Add(unique)) + { + suffix++; + unique = candidate + "_" + + suffix.ToString(CultureInfo.InvariantCulture); + } + return unique; + } + + private static void CaptureLinks( + JsonElement links, + string pointer, + List entries) + { + if (links.ValueKind != JsonValueKind.Array) + { + Add(entries, pointer, links); + return; + } + foreach (JsonElement link in links.EnumerateArray()) + { + string? rel = link.ValueKind == JsonValueKind.Object && + link.TryGetProperty("rel", out JsonElement relElement) && + relElement.ValueKind == JsonValueKind.String + ? relElement.GetString() + : null; + if (!IsMappedLink(rel, link)) + { + Add(entries, pointer + "/-", link); + continue; + } + string extras = GetLinkExtras(link, out bool hasExtras); + if (hasExtras) + { + entries.Add(new Entry + { + Pointer = pointer + "/-", + Json = extras, + LinkRel = rel, + LinkHref = GetString(link, "href"), + LinkRefId = GetString(link, "uav:refId"), + LinkRefName = GetString(link, "uav:refName") + }); + } + } + } + + private static string GetLinkExtras(JsonElement link, out bool hasExtras) + { + using var stream = new System.IO.MemoryStream(); + using (var writer = new Utf8JsonWriter(stream)) + { + writer.WriteStartObject(); + hasExtras = false; + foreach (JsonProperty property in link.EnumerateObject()) + { + if (property.Name is "rel" or "href" or "uav:refId" or + "uav:refName") + { + continue; + } + hasExtras = true; + writer.WritePropertyName(property.Name); + property.Value.WriteTo(writer); + } + writer.WriteEndObject(); + } + return Encoding.UTF8.GetString(stream.ToArray()); + } + + private static bool IsMappedLink(string? rel, JsonElement link) + { + if (rel is "tm:extends" or + "uav:reference" or + "uav:componentModel" or + "uav:capability") + { + return true; + } + if (rel is null || rel.StartsWith("uav:", StringComparison.Ordinal)) + { + return false; + } + return rel.StartsWith("ua:", StringComparison.Ordinal) || + StartsWithGeneratedNamespacePrefix(rel) || + link.TryGetProperty("uav:refId", out _); + } + + private static bool StartsWithGeneratedNamespacePrefix(string rel) + { + if (!rel.StartsWith("ns", StringComparison.Ordinal)) + { + return false; + } + int ii = 2; + while (ii < rel.Length && char.IsDigit(rel[ii])) + { + ii++; + } + return ii > 2 && ii < rel.Length && rel[ii] == ':'; + } + + private static string? LocalName(string? browseName) + { + if (string.IsNullOrEmpty(browseName)) + { + return null; + } + if (browseName!.StartsWith("nsu=", StringComparison.Ordinal)) + { + for (int ii = 4; ii < browseName.Length; ii++) + { + if (browseName[ii] == ';') + { + return ii + 1 < browseName.Length + ? browseName.Substring(ii + 1) + : null; + } + } + return null; + } + int separator = -1; + for (int ii = 0; ii < browseName.Length; ii++) + { + if (browseName[ii] == ':') + { + separator = ii; + break; + } + } + return separator >= 0 && separator + 1 < browseName.Length + ? browseName.Substring(separator + 1) + : browseName; + } + + private static string? GetString(JsonElement element, string name) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private static void Add( + List entries, + string pointer, + JsonElement value) + { + entries.Add(new Entry + { + Pointer = pointer, + Json = value.GetRawText() + }); + } + + private static System.Xml.XmlElement CreateExtension(List entries) + { + var document = new XmlDocument { XmlResolver = null }; + System.Xml.XmlElement root = document.CreateElement( + "uav", + ResidueElement, + WotVocabulary.VocabularyNamespace); + root.SetAttribute("Version", Version); + document.AppendChild(root); + + foreach (Entry entry in entries) + { + byte[] bytes = Encoding.UTF8.GetBytes(entry.Json); + System.Xml.XmlElement member = document.CreateElement( + "uav", + MemberElement, + WotVocabulary.VocabularyNamespace); + member.SetAttribute("Pointer", entry.Pointer); + member.SetAttribute("Encoding", WotVocabulary.Base64Encoding); + member.SetAttribute("Sha256", ToLowerHex(ComputeSha256(bytes))); + SetOptionalAttribute(member, "LinkRel", entry.LinkRel); + SetOptionalAttribute(member, "LinkHref", entry.LinkHref); + SetOptionalAttribute(member, "LinkRefId", entry.LinkRefId); + SetOptionalAttribute(member, "LinkRefName", entry.LinkRefName); + member.InnerText = Convert.ToBase64String(bytes); + root.AppendChild(member); + } + return root; + } + + private static void SetOptionalAttribute( + System.Xml.XmlElement element, + string name, + string? value) + { + if (!string.IsNullOrEmpty(value)) + { + element.SetAttribute(name, value); + } + } + + private static List ReadEntries( + UANodeSet nodeSet, + WotNodeSetConverterOptions options, + List diagnostics) + { + var entries = new List(); + if (nodeSet.Extensions is null) + { + return entries; + } + + int total = 0; + foreach (System.Xml.XmlElement extension in nodeSet.Extensions) + { + if (!IsResidue(extension)) + { + continue; + } + if (!string.Equals( + extension.GetAttribute("Version"), + Version, + StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Unsupported {ResidueElement} Version " + + $"'{extension.GetAttribute("Version")}'.")); + continue; + } + foreach (XmlNode child in extension.ChildNodes) + { + if (child is not System.Xml.XmlElement member || + !string.Equals( + member.LocalName, + MemberElement, + StringComparison.Ordinal) || + !string.Equals( + member.NamespaceURI, + WotVocabulary.VocabularyNamespace, + StringComparison.Ordinal)) + { + continue; + } + string pointer = member.GetAttribute("Pointer"); + if (!IsJsonPointer(pointer, options.MaxJsonDepth)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue pointer '{pointer}' is not an RFC 6901 JSON Pointer " + + $"within the configured depth of {options.MaxJsonDepth}.")); + continue; + } + if (!string.Equals( + member.GetAttribute("Encoding"), + WotVocabulary.Base64Encoding, + StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue at '{pointer}' does not use base64 encoding.", + WotLocation.FromPointer(pointer))); + continue; + } + + byte[] bytes; + try + { + bytes = Convert.FromBase64String(member.InnerText); + } + catch (FormatException) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue at '{pointer}' is not valid base64.", + WotLocation.FromPointer(pointer))); + continue; + } + total += bytes.Length; + if (total > options.MaxJsonDocumentSize) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.JsonDocumentTooLarge, + $"WoT residue exceeds the configured " + + $"{options.MaxJsonDocumentSize} byte limit.")); + return entries; + } + string digest = member.GetAttribute("Sha256"); + if (!string.Equals( + digest, + ToLowerHex(ComputeSha256(bytes)), + StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue at '{pointer}' failed its SHA-256 integrity check.", + WotLocation.FromPointer(pointer))); + continue; + } + entries.Add(new Entry + { + Pointer = pointer, + Json = Encoding.UTF8.GetString(bytes), + LinkRel = OptionalAttribute(member, "LinkRel"), + LinkHref = OptionalAttribute(member, "LinkHref"), + LinkRefId = OptionalAttribute(member, "LinkRefId"), + LinkRefName = OptionalAttribute(member, "LinkRefName") + }); + } + } + return entries; + } + + private static string? OptionalAttribute( + System.Xml.XmlElement element, + string name) + { + string value = element.GetAttribute(name); + return value.Length == 0 ? null : value; + } + + private static bool IsResidue(System.Xml.XmlElement element) + { + return string.Equals( + element.LocalName, + ResidueElement, + StringComparison.Ordinal) && + string.Equals( + element.NamespaceURI, + WotVocabulary.VocabularyNamespace, + StringComparison.Ordinal); + } + + private static void ApplyEntry( + JsonNode root, + string pointer, + JsonNode? value, + List diagnostics) + { + string[] tokens = ParsePointer(pointer); + // Defensive: every caller validates the pointer with IsJsonPointer + // first, which rejects null, empty and anything not starting with + // '/', and string.Split never yields an empty array, so this cannot + // currently be entered. The guard keeps the root from being + // overwritten if pointer parsing ever changes. + if (tokens.Length == 0) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + "The document root cannot be a residue target.", + WotLocation.FromPointer(pointer))); + return; + } + + JsonNode current = root; + for (int ii = 0; ii < tokens.Length - 1; ii++) + { + string token = tokens[ii]; + string next = tokens[ii + 1]; + if (current is JsonObject obj) + { + JsonNode? child = obj[token]; + if (child is null) + { + child = IsArrayToken(next) ? new JsonArray() : new JsonObject(); + obj[token] = child; + } + current = child; + } + else if (current is JsonArray array && + int.TryParse( + token, + NumberStyles.None, + CultureInfo.InvariantCulture, + out int index) && + index >= 0 && + index < array.Count && + array[index] is JsonNode child) + { + current = child; + } + else + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue parent '{pointer}' does not resolve.", + WotLocation.FromPointer(pointer))); + return; + } + } + + string leaf = tokens[^1]; + if (current is JsonObject targetObject) + { + JsonNode? existing = targetObject[leaf]; + if (existing is not null) + { + if (!JsonEquals(existing, value)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueConflict, + $"Residue at '{pointer}' conflicts with a value " + + "reconstructed from OPC UA model facts.", + WotLocation.FromPointer(pointer))); + } + return; + } + targetObject[leaf] = value; + return; + } + if (current is JsonArray targetArray) + { + if (string.Equals(leaf, "-", StringComparison.Ordinal)) + { + targetArray.Add(value); + return; + } + if (int.TryParse( + leaf, + NumberStyles.None, + CultureInfo.InvariantCulture, + out int index) && + index >= 0 && + index <= targetArray.Count) + { + if (index == targetArray.Count) + { + targetArray.Add(value); + } + else if (targetArray[index] is null) + { + targetArray[index] = value; + } + else if (!JsonEquals(targetArray[index], value)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueConflict, + $"Residue at '{pointer}' conflicts with an existing array item.", + WotLocation.FromPointer(pointer))); + } + return; + } + } + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + $"Residue target '{pointer}' is invalid.", + WotLocation.FromPointer(pointer))); + } + + private static void ApplyLinkEntry( + JsonNode root, + Entry entry, + JsonNode? value, + List diagnostics) + { + if (root is not JsonObject rootObject || value is not JsonObject extras) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueInvalid, + "A link residue selector requires an object value.", + WotLocation.FromPointer(entry.Pointer))); + return; + } + + JsonArray links; + if (rootObject["links"] is JsonArray existingLinks) + { + links = existingLinks; + } + else if (rootObject["links"] is null) + { + links = new JsonArray(); + rootObject["links"] = links; + } + else + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueConflict, + "Link residue conflicts with a non-array links member.", + WotLocation.FromPointer("/links"))); + return; + } + + JsonObject? target = FindLink(links, entry, requireExactRel: true); + bool exact = target is not null; + target ??= FindLink(links, entry, requireExactRel: false); + if (target is null) + { + target = new JsonObject(); + SetString(target, "rel", entry.LinkRel); + SetString(target, "href", entry.LinkHref); + SetString(target, "uav:refId", entry.LinkRefId); + SetString(target, "uav:refName", entry.LinkRefName); + links.Add(target); + } + else if (exact) + { + MergeString(target, "rel", entry.LinkRel, entry.Pointer, diagnostics); + MergeString(target, "href", entry.LinkHref, entry.Pointer, diagnostics); + MergeString( + target, + "uav:refId", + entry.LinkRefId, + entry.Pointer, + diagnostics); + MergeString( + target, + "uav:refName", + entry.LinkRefName, + entry.Pointer, + diagnostics); + } + + foreach (KeyValuePair property in extras) + { + JsonNode? existing = target[property.Key]; + if (existing is not null) + { + if (!JsonEquals(existing, property.Value)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueConflict, + $"Link residue member '{property.Key}' conflicts with " + + "a regenerated value.", + WotLocation.FromPointer(entry.Pointer))); + } + continue; + } + target[property.Key] = CloneNode(property.Value); + } + } + + private static JsonObject? FindLink( + JsonArray links, + Entry entry, + bool requireExactRel) + { + foreach (JsonNode? item in links) + { + if (item is not JsonObject link || + !StringNodeEquals(link["href"], entry.LinkHref)) + { + continue; + } + if (requireExactRel) + { + if (StringNodeEquals(link["rel"], entry.LinkRel)) + { + return link; + } + continue; + } + if (entry.LinkRefId is not null && + StringNodeEquals(link["uav:refId"], entry.LinkRefId)) + { + return link; + } + } + return null; + } + + private static bool StringNodeEquals(JsonNode? node, string? value) + { + return node is JsonValue jsonValue && + jsonValue.TryGetValue(out string? text) && + string.Equals(text, value, StringComparison.Ordinal); + } + + private static void SetString( + JsonObject target, + string name, + string? value) + { + if (value is not null) + { + target[name] = value; + } + } + + private static void MergeString( + JsonObject target, + string name, + string? value, + string pointer, + List diagnostics) + { + if (value is null) + { + return; + } + JsonNode? existing = target[name]; + if (existing is null) + { + target[name] = value; + } + else if (!StringNodeEquals(existing, value)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResidueConflict, + $"Link residue selector '{name}' conflicts with a regenerated value.", + WotLocation.FromPointer(pointer))); + } + } + + private static JsonNode? CloneNode(JsonNode? value) + { + return value?.DeepClone(); + } + + private static bool JsonEquals(JsonNode? left, JsonNode? right) + { + return string.Equals( + left?.ToJsonString() ?? "null", + right?.ToJsonString() ?? "null", + StringComparison.Ordinal); + } + + private static bool IsArrayToken(string token) + { + return string.Equals(token, "-", StringComparison.Ordinal) || + int.TryParse( + token, + NumberStyles.None, + CultureInfo.InvariantCulture, + out _); + } + + private static bool IsJsonPointer(string pointer, int maxDepth) + { + if (string.IsNullOrEmpty(pointer) || pointer[0] != '/') + { + return false; + } + string[] tokens = pointer.Substring(1).Split('/'); + if (tokens.Length >= maxDepth) + { + return false; + } + foreach (string token in tokens) + { + for (int ii = 0; ii < token.Length; ii++) + { + if (token[ii] == '~' && + (ii + 1 >= token.Length || + token[ii + 1] is not ('0' or '1'))) + { + return false; + } + } + } + return true; + } + + private static string[] ParsePointer(string pointer) + { + string[] tokens = pointer.Substring(1).Split('/'); + for (int ii = 0; ii < tokens.Length; ii++) + { + tokens[ii] = ReplaceOrdinal( + ReplaceOrdinal(tokens[ii], "~1", "/"), + "~0", + "~"); + } + return tokens; + } + + private static string Escape(string token) + { + return ReplaceOrdinal( + ReplaceOrdinal(token, "~", "~0"), + "/", + "~1"); + } + + private static string ReplaceOrdinal( + string source, + string oldValue, + string newValue) + { + int index = source.IndexOf(oldValue, StringComparison.Ordinal); + if (index < 0) + { + return source; + } + var builder = new StringBuilder(source.Length); + int start = 0; + while (index >= 0) + { + builder.Append(source, start, index - start); + builder.Append(newValue); + start = index + oldValue.Length; + index = source.IndexOf(oldValue, start, StringComparison.Ordinal); + } + builder.Append(source, start, source.Length - start); + return builder.ToString(); + } + + private static byte[] ComputeSha256(byte[] data) + { +#if NET6_0_OR_GREATER + return SHA256.HashData(data); +#else + using SHA256 sha256 = SHA256.Create(); + return sha256.ComputeHash(data); +#endif + } + + private static string ToLowerHex(byte[] data) + { + var builder = new StringBuilder(data.Length * 2); + foreach (byte value in data) + { + builder.Append(value.ToString("x2", CultureInfo.InvariantCulture)); + } + return builder.ToString(); + } + } +} diff --git a/src/Opc.Ua.Types/Wot/WotNativeProjection.cs b/src/Opc.Ua.Types/Wot/WotNativeProjection.cs new file mode 100644 index 0000000000..4f75a3e777 --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotNativeProjection.cs @@ -0,0 +1,1437 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text.Json; +using System.Xml; +using Opc.Ua.Export; + +namespace Opc.Ua.Wot +{ + /// + /// Schema-complete, deterministic JSON projection of the UANodeSet XSD. + /// + internal static class WotNativeProjection + { + public const string ProjectionType = "uav:NodeModel"; + public const string ProfileVersion = "1.0"; + + public static byte[] Write( + UANodeSet nodeSet, + WotNodeSetConverterOptions options, + List diagnostics) + { + using var output = new MemoryStream(); + using (var writer = new Utf8JsonWriter( + output, + new JsonWriterOptions { Indented = true, SkipValidation = false })) + { + writer.WriteStartObject(); + writer.WriteString("@type", ProjectionType); + writer.WriteString("profileVersion", ProfileVersion); + WriteStrings(writer, "namespaceUris", nodeSet.NamespaceUris); + WriteStrings(writer, "serverUris", nodeSet.ServerUris); + WriteModels(writer, nodeSet.Models); + WriteAliases(writer, nodeSet.Aliases); + WriteXmlElements(writer, "extensions", nodeSet.Extensions); + if (nodeSet.LastModifiedSpecified) + { + writer.WriteString("lastModified", FormatDate(nodeSet.LastModified)); + } + + writer.WritePropertyName("nodes"); + writer.WriteStartArray(); + if (nodeSet.Items is not null) + { + int count = 0; + foreach (UANode node in nodeSet.Items) + { + if (count++ >= options.MaxNodeCount) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NodeCountExceeded, + $"The NodeSet contains more than the configured " + + $"{options.MaxNodeCount} native projection nodes.")); + break; + } + WriteNode(writer, node); + } + } + writer.WriteEndArray(); + writer.WriteEndObject(); + } + return output.ToArray(); + } + + public static UANodeSet? Read( + JsonElement projection, + WotNodeSetConverterOptions options, + List diagnostics) + { + int initialErrors = CountErrors(diagnostics); + if (projection.ValueKind != JsonValueKind.Object || + !string.Equals( + GetString(projection, "@type"), + ProjectionType, + StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + $"The uav:nodes member shall be an object whose @type is " + + $"{ProjectionType}.", + WotLocation.FromPointer("/uav:nodes"))); + return null; + } + + string? version = GetString(projection, "profileVersion"); + if (!string.Equals(version, ProfileVersion, StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + $"Unsupported uav:nodes profileVersion '{version}'.", + WotLocation.FromPointer("/uav:nodes/profileVersion"))); + return null; + } + + var nodeSet = new UANodeSet + { + NamespaceUris = ReadStrings(projection, "namespaceUris"), + ServerUris = ReadStrings(projection, "serverUris"), + Models = ReadModels(projection, diagnostics), + Aliases = ReadAliases(projection, diagnostics), + Extensions = ReadXmlElements( + projection, + "extensions", + "/uav:nodes/extensions", + diagnostics) + }; + + if (TryGetDate(projection, "lastModified", out DateTime lastModified)) + { + nodeSet.LastModified = lastModified; + nodeSet.LastModifiedSpecified = true; + } + + if (!projection.TryGetProperty("nodes", out JsonElement nodes) || + nodes.ValueKind != JsonValueKind.Array) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + "The uav:nodes projection is missing its nodes array.", + WotLocation.FromPointer("/uav:nodes/nodes"))); + return null; + } + + var items = new List(); + int index = 0; + foreach (JsonElement element in nodes.EnumerateArray()) + { + if (items.Count >= options.MaxNodeCount) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NodeCountExceeded, + $"The native projection contains more than the configured " + + $"{options.MaxNodeCount} nodes.", + WotLocation.FromPointer("/uav:nodes/nodes"))); + break; + } + UANode? node = ReadNode( + element, + $"/uav:nodes/nodes/{index.ToString(CultureInfo.InvariantCulture)}", + diagnostics); + if (node is not null) + { + items.Add(node); + } + index++; + } + nodeSet.Items = [.. items]; + + return CountErrors(diagnostics) == initialErrors ? nodeSet : null; + } + + private static void WriteModels(Utf8JsonWriter writer, ModelTableEntry[]? models) + { + if (models is null || models.Length == 0) + { + return; + } + writer.WritePropertyName("models"); + writer.WriteStartArray(); + foreach (ModelTableEntry model in models) + { + WriteModel(writer, model); + } + writer.WriteEndArray(); + } + + private static void WriteModel(Utf8JsonWriter writer, ModelTableEntry model) + { + writer.WriteStartObject(); + WriteString(writer, "modelUri", model.ModelUri); + WriteString(writer, "xmlSchemaUri", model.XmlSchemaUri); + WriteString(writer, "version", model.Version); + if (model.PublicationDateSpecified) + { + writer.WriteString("publicationDate", FormatDate(model.PublicationDate)); + } + WriteString(writer, "modelVersion", model.ModelVersion); + if (model.AccessRestrictions != 0) + { + writer.WriteNumber("accessRestrictions", model.AccessRestrictions); + } + WriteRolePermissions(writer, model.RolePermissions); + if (model.RequiredModel is { Length: > 0 }) + { + writer.WritePropertyName("requiredModels"); + writer.WriteStartArray(); + foreach (ModelTableEntry required in model.RequiredModel) + { + WriteModel(writer, required); + } + writer.WriteEndArray(); + } + writer.WriteEndObject(); + } + + private static ModelTableEntry[]? ReadModels( + JsonElement projection, + List diagnostics) + { + if (!projection.TryGetProperty("models", out JsonElement models) || + models.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + int index = 0; + foreach (JsonElement model in models.EnumerateArray()) + { + result.Add(ReadModel( + model, + $"/uav:nodes/models/{index.ToString(CultureInfo.InvariantCulture)}", + diagnostics)); + index++; + } + return [.. result]; + } + + private static ModelTableEntry ReadModel( + JsonElement element, + string pointer, + List diagnostics) + { + var model = new ModelTableEntry + { + ModelUri = GetString(element, "modelUri"), + XmlSchemaUri = GetString(element, "xmlSchemaUri"), + Version = GetString(element, "version"), + ModelVersion = GetString(element, "modelVersion"), + RolePermissions = ReadRolePermissions(element, "rolePermissions") + }; + if (TryGetDate(element, "publicationDate", out DateTime publicationDate)) + { + model.PublicationDate = publicationDate; + model.PublicationDateSpecified = true; + } + if (TryGetUInt16(element, "accessRestrictions", out ushort accessRestrictions)) + { + model.AccessRestrictions = accessRestrictions; + } + if (element.TryGetProperty("requiredModels", out JsonElement required) && + required.ValueKind == JsonValueKind.Array) + { + var entries = new List(); + int index = 0; + foreach (JsonElement item in required.EnumerateArray()) + { + entries.Add(ReadModel( + item, + pointer + "/requiredModels/" + + index.ToString(CultureInfo.InvariantCulture), + diagnostics)); + index++; + } + model.RequiredModel = [.. entries]; + } + if (string.IsNullOrEmpty(model.ModelUri)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + "A native model entry is missing modelUri.", + WotLocation.FromPointer(pointer))); + } + return model; + } + + private static void WriteAliases(Utf8JsonWriter writer, NodeIdAlias[]? aliases) + { + if (aliases is null || aliases.Length == 0) + { + return; + } + writer.WritePropertyName("aliases"); + writer.WriteStartArray(); + foreach (NodeIdAlias alias in aliases) + { + writer.WriteStartObject(); + WriteString(writer, "alias", alias.Alias); + WriteString(writer, "value", alias.Value); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + private static NodeIdAlias[]? ReadAliases( + JsonElement projection, + List diagnostics) + { + if (!projection.TryGetProperty("aliases", out JsonElement aliases) || + aliases.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + int index = 0; + foreach (JsonElement item in aliases.EnumerateArray()) + { + string? alias = GetString(item, "alias"); + string? value = GetString(item, "value"); + if (string.IsNullOrEmpty(alias) || string.IsNullOrEmpty(value)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + "A native alias entry requires alias and value.", + WotLocation.FromPointer( + "/uav:nodes/aliases/" + + index.ToString(CultureInfo.InvariantCulture)))); + } + result.Add(new NodeIdAlias { Alias = alias, Value = value }); + index++; + } + return [.. result]; + } + + private static void WriteNode(Utf8JsonWriter writer, UANode node) + { + writer.WriteStartObject(); + writer.WriteString("nodeClass", GetNodeClass(node)); + WriteString(writer, "nodeId", node.NodeId); + WriteString(writer, "browseName", node.BrowseName); + WriteString(writer, "symbolicName", node.SymbolicName); + WriteTexts(writer, "displayName", node.DisplayName); + WriteTexts(writer, "description", node.Description); + WriteStrings(writer, "category", node.Category); + WriteString(writer, "documentation", node.Documentation); + WriteReferences(writer, node.References); + WriteRolePermissions(writer, node.RolePermissions); + WriteXmlElements(writer, "extensions", node.Extensions); + if (node.WriteMask != 0) + { + writer.WriteNumber("writeMask", node.WriteMask); + } + if (node.UserWriteMask != 0) + { + writer.WriteNumber("userWriteMask", node.UserWriteMask); + } + if (node.AccessRestrictionsSpecified) + { + writer.WriteNumber("accessRestrictions", node.AccessRestrictions); + } + if (node.HasNoPermissions) + { + writer.WriteBoolean("hasNoPermissions", true); + } + if (node.ReleaseStatus != ReleaseStatus.Released) + { + writer.WriteString("releaseStatus", node.ReleaseStatus.ToString()); + } + + switch (node) + { + case UAVariable variable: + WriteInstance(writer, variable); + WriteVariable(writer, variable); + break; + case UAVariableType variableType: + WriteType(writer, variableType); + WriteVariableType(writer, variableType); + break; + case UAObject uaObject: + WriteInstance(writer, uaObject); + if (uaObject.EventNotifier != 0) + { + writer.WriteNumber("eventNotifier", uaObject.EventNotifier); + } + break; + case UAMethod method: + WriteInstance(writer, method); + WriteMethod(writer, method); + break; + case UAView view: + WriteInstance(writer, view); + if (view.ContainsNoLoops) + { + writer.WriteBoolean("containsNoLoops", true); + } + if (view.EventNotifier != 0) + { + writer.WriteNumber("eventNotifier", view.EventNotifier); + } + break; + case UADataType dataType: + WriteType(writer, dataType); + WriteDataType(writer, dataType); + break; + case UAReferenceType referenceType: + WriteType(writer, referenceType); + WriteTexts(writer, "inverseName", referenceType.InverseName); + if (referenceType.Symmetric) + { + writer.WriteBoolean("symmetric", true); + } + break; + case UAObjectType objectType: + WriteType(writer, objectType); + break; + } + + WriteDerivedFacts(writer, node); + writer.WriteEndObject(); + } + + private static UANode? ReadNode( + JsonElement element, + string pointer, + List diagnostics) + { + string? nodeClass = GetString(element, "nodeClass"); + UANode? node = nodeClass switch + { + "Object" => new UAObject(), + "Variable" => new UAVariable(), + "Method" => new UAMethod(), + "View" => new UAView(), + "ObjectType" => new UAObjectType(), + "VariableType" => new UAVariableType(), + "DataType" => new UADataType(), + "ReferenceType" => new UAReferenceType(), + _ => null + }; + if (node is null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + $"Unknown native nodeClass '{nodeClass}'.", + WotLocation.FromPointer(pointer))); + return null; + } + + node.NodeId = GetString(element, "nodeId"); + node.BrowseName = GetString(element, "browseName"); + node.SymbolicName = GetString(element, "symbolicName"); + node.DisplayName = ReadTexts(element, "displayName"); + node.Description = ReadTexts(element, "description"); + node.Category = ReadStrings(element, "category"); + node.Documentation = GetString(element, "documentation"); + node.References = ReadReferences(element); + node.RolePermissions = ReadRolePermissions(element, "rolePermissions"); + node.Extensions = ReadXmlElements( + element, + "extensions", + pointer + "/extensions", + diagnostics); + if (TryGetUInt32(element, "writeMask", out uint writeMask)) + { + node.WriteMask = writeMask; + } + if (TryGetUInt32(element, "userWriteMask", out uint userWriteMask)) + { + node.UserWriteMask = userWriteMask; + } + if (TryGetUInt16(element, "accessRestrictions", out ushort accessRestrictions)) + { + node.AccessRestrictions = accessRestrictions; + node.AccessRestrictionsSpecified = true; + } + node.HasNoPermissions = GetBoolean(element, "hasNoPermissions"); + string? releaseStatus = GetString(element, "releaseStatus"); + if (releaseStatus is not null && + Enum.TryParse(releaseStatus, ignoreCase: false, out ReleaseStatus status)) + { + node.ReleaseStatus = status; + } + + switch (node) + { + case UAVariable variable: + ReadInstance(element, variable); + ReadVariable(element, variable, pointer, diagnostics); + break; + case UAVariableType variableType: + ReadType(element, variableType); + ReadVariableType(element, variableType, pointer, diagnostics); + break; + case UAObject uaObject: + ReadInstance(element, uaObject); + if (TryGetByte(element, "eventNotifier", out byte objectNotifier)) + { + uaObject.EventNotifier = objectNotifier; + } + break; + case UAMethod method: + ReadInstance(element, method); + ReadMethod(element, method); + break; + case UAView view: + ReadInstance(element, view); + view.ContainsNoLoops = GetBoolean(element, "containsNoLoops"); + if (TryGetByte(element, "eventNotifier", out byte viewNotifier)) + { + view.EventNotifier = viewNotifier; + } + break; + case UADataType dataType: + ReadType(element, dataType); + ReadDataType(element, dataType, pointer, diagnostics); + break; + case UAReferenceType referenceType: + ReadType(element, referenceType); + referenceType.InverseName = ReadTexts(element, "inverseName"); + referenceType.Symmetric = GetBoolean(element, "symmetric"); + break; + case UAObjectType objectType: + ReadType(element, objectType); + break; + } + + if (string.IsNullOrEmpty(node.NodeId) || string.IsNullOrEmpty(node.BrowseName)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + "A native node requires nodeId and browseName.", + WotLocation.FromPointer(pointer))); + } + return node; + } + + private static void WriteInstance(Utf8JsonWriter writer, UAInstance instance) + { + WriteString(writer, "parentNodeId", instance.ParentNodeId); + if (instance.DesignToolOnly) + { + writer.WriteBoolean("designToolOnly", true); + } + } + + private static void ReadInstance(JsonElement element, UAInstance instance) + { + instance.ParentNodeId = GetString(element, "parentNodeId"); + instance.DesignToolOnly = GetBoolean(element, "designToolOnly"); + } + + private static void WriteType(Utf8JsonWriter writer, UAType type) + { + if (type.IsAbstract) + { + writer.WriteBoolean("isAbstract", true); + } + } + + private static void ReadType(JsonElement element, UAType type) + { + type.IsAbstract = GetBoolean(element, "isAbstract"); + } + + private static void WriteVariable(Utf8JsonWriter writer, UAVariable variable) + { + WriteXmlElement(writer, "valueXml", variable.Value); + WriteTranslations(writer, variable.Translation); + WriteString(writer, "dataType", variable.DataType); + if (variable.ValueRank != -1) + { + writer.WriteNumber("valueRank", variable.ValueRank); + } + WriteString(writer, "arrayDimensions", variable.ArrayDimensions); + if (variable.AccessLevel != 1) + { + writer.WriteNumber("accessLevel", variable.AccessLevel); + } + if (variable.UserAccessLevel != 1) + { + writer.WriteNumber("userAccessLevel", variable.UserAccessLevel); + } + if (variable.MinimumSamplingInterval != 0D) + { + writer.WriteNumber("minimumSamplingInterval", variable.MinimumSamplingInterval); + } + if (variable.Historizing) + { + writer.WriteBoolean("historizing", true); + } + } + + private static void ReadVariable( + JsonElement element, + UAVariable variable, + string pointer, + List diagnostics) + { + variable.Value = ReadXmlElement( + element, + "valueXml", + pointer + "/valueXml", + diagnostics); + variable.Translation = ReadTranslations(element); + variable.DataType = GetString(element, "dataType") ?? WotVocabulary.BaseDataType; + if (TryGetInt32(element, "valueRank", out int valueRank)) + { + variable.ValueRank = valueRank; + } + variable.ArrayDimensions = GetString(element, "arrayDimensions") ?? string.Empty; + if (TryGetUInt32(element, "accessLevel", out uint accessLevel)) + { + variable.AccessLevel = accessLevel; + } + if (TryGetUInt32(element, "userAccessLevel", out uint userAccessLevel)) + { + variable.UserAccessLevel = userAccessLevel; + } + if (TryGetDouble( + element, + "minimumSamplingInterval", + out double minimumSamplingInterval)) + { + variable.MinimumSamplingInterval = minimumSamplingInterval; + } + variable.Historizing = GetBoolean(element, "historizing"); + } + + private static void WriteVariableType( + Utf8JsonWriter writer, + UAVariableType variableType) + { + WriteXmlElement(writer, "valueXml", variableType.Value); + WriteString(writer, "dataType", variableType.DataType); + if (variableType.ValueRank != -1) + { + writer.WriteNumber("valueRank", variableType.ValueRank); + } + WriteString(writer, "arrayDimensions", variableType.ArrayDimensions); + } + + private static void ReadVariableType( + JsonElement element, + UAVariableType variableType, + string pointer, + List diagnostics) + { + variableType.Value = ReadXmlElement( + element, + "valueXml", + pointer + "/valueXml", + diagnostics); + variableType.DataType = + GetString(element, "dataType") ?? WotVocabulary.BaseDataType; + if (TryGetInt32(element, "valueRank", out int valueRank)) + { + variableType.ValueRank = valueRank; + } + variableType.ArrayDimensions = + GetString(element, "arrayDimensions") ?? string.Empty; + } + + private static void WriteMethod(Utf8JsonWriter writer, UAMethod method) + { + if (method.ArgumentDescription is { Length: > 0 }) + { + writer.WritePropertyName("argumentDescriptions"); + writer.WriteStartArray(); + foreach (UAMethodArgument argument in method.ArgumentDescription) + { + writer.WriteStartObject(); + WriteString(writer, "name", argument.Name); + WriteTexts(writer, "description", argument.Description); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + if (!method.Executable) + { + writer.WriteBoolean("executable", false); + } + if (!method.UserExecutable) + { + writer.WriteBoolean("userExecutable", false); + } + WriteString(writer, "methodDeclarationId", method.MethodDeclarationId); + } + + private static void ReadMethod(JsonElement element, UAMethod method) + { + if (element.TryGetProperty( + "argumentDescriptions", + out JsonElement descriptions) && + descriptions.ValueKind == JsonValueKind.Array) + { + var arguments = new List(); + foreach (JsonElement argument in descriptions.EnumerateArray()) + { + arguments.Add(new UAMethodArgument + { + Name = GetString(argument, "name"), + Description = ReadTexts(argument, "description") + }); + } + method.ArgumentDescription = [.. arguments]; + } + if (element.TryGetProperty("executable", out JsonElement executable) && + executable.ValueKind is JsonValueKind.True or JsonValueKind.False) + { + method.Executable = executable.GetBoolean(); + } + if (element.TryGetProperty( + "userExecutable", + out JsonElement userExecutable) && + userExecutable.ValueKind is JsonValueKind.True or JsonValueKind.False) + { + method.UserExecutable = userExecutable.GetBoolean(); + } + method.MethodDeclarationId = GetString(element, "methodDeclarationId"); + } + + private static void WriteDataType(Utf8JsonWriter writer, UADataType dataType) + { + if (dataType.Definition is not null) + { + writer.WritePropertyName("definition"); + WriteDefinition(writer, dataType.Definition); + } + if (dataType.Purpose != DataTypePurpose.Normal) + { + writer.WriteString("purpose", dataType.Purpose.ToString()); + } + } + + private static void ReadDataType( + JsonElement element, + UADataType dataType, + string pointer, + List diagnostics) + { + if (element.TryGetProperty("definition", out JsonElement definition) && + definition.ValueKind == JsonValueKind.Object) + { + dataType.Definition = ReadDefinition( + definition, + pointer + "/definition", + diagnostics); + } + string? purpose = GetString(element, "purpose"); + if (purpose is not null && + Enum.TryParse(purpose, ignoreCase: false, out DataTypePurpose parsed)) + { + dataType.Purpose = parsed; + } + } + + private static void WriteDefinition( + Utf8JsonWriter writer, + Opc.Ua.Export.DataTypeDefinition definition) + { + writer.WriteStartObject(); + WriteString(writer, "name", definition.Name); + WriteString(writer, "symbolicName", definition.SymbolicName); + if (definition.IsUnion) + { + writer.WriteBoolean("isUnion", true); + } + if (definition.IsOptionSet) + { + writer.WriteBoolean("isOptionSet", true); + } + WriteString(writer, "baseType", definition.BaseType); + if (definition.Field is { Length: > 0 }) + { + writer.WritePropertyName("fields"); + writer.WriteStartArray(); + foreach (Opc.Ua.Export.DataTypeField field in definition.Field) + { + writer.WriteStartObject(); + WriteString(writer, "name", field.Name); + WriteString(writer, "symbolicName", field.SymbolicName); + WriteTexts(writer, "displayName", field.DisplayName); + WriteTexts(writer, "description", field.Description); + WriteString(writer, "dataType", field.DataType); + if (field.ValueRank != -1) + { + writer.WriteNumber("valueRank", field.ValueRank); + } + WriteString(writer, "arrayDimensions", field.ArrayDimensions); + if (field.MaxStringLength != 0) + { + writer.WriteNumber("maxStringLength", field.MaxStringLength); + } + if (field.Value != -1) + { + writer.WriteNumber("value", field.Value); + } + if (field.IsOptional) + { + writer.WriteBoolean("isOptional", true); + } + if (field.AllowSubTypes) + { + writer.WriteBoolean("allowSubTypes", true); + } + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + writer.WriteEndObject(); + } + + private static Opc.Ua.Export.DataTypeDefinition ReadDefinition( + JsonElement element, + string pointer, + List diagnostics) + { + var definition = new Opc.Ua.Export.DataTypeDefinition + { + Name = GetString(element, "name"), + SymbolicName = GetString(element, "symbolicName"), + IsUnion = GetBoolean(element, "isUnion"), + IsOptionSet = GetBoolean(element, "isOptionSet"), + BaseType = GetString(element, "baseType") ?? string.Empty + }; + if (element.TryGetProperty("fields", out JsonElement fields) && + fields.ValueKind == JsonValueKind.Array) + { + var result = new List(); + int index = 0; + foreach (JsonElement item in fields.EnumerateArray()) + { + var field = new Opc.Ua.Export.DataTypeField + { + Name = GetString(item, "name"), + SymbolicName = GetString(item, "symbolicName"), + DisplayName = ReadTexts(item, "displayName"), + Description = ReadTexts(item, "description"), + DataType = GetString(item, "dataType") ?? WotVocabulary.BaseDataType, + ArrayDimensions = + GetString(item, "arrayDimensions") ?? string.Empty, + IsOptional = GetBoolean(item, "isOptional"), + AllowSubTypes = GetBoolean(item, "allowSubTypes") + }; + if (TryGetInt32(item, "valueRank", out int valueRank)) + { + field.ValueRank = valueRank; + } + if (TryGetUInt32(item, "maxStringLength", out uint maxStringLength)) + { + field.MaxStringLength = maxStringLength; + } + if (TryGetInt32(item, "value", out int value)) + { + field.Value = value; + } + if (string.IsNullOrEmpty(field.Name)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + "A DataType definition field is missing name.", + WotLocation.FromPointer( + pointer + "/fields/" + + index.ToString(CultureInfo.InvariantCulture)))); + } + result.Add(field); + index++; + } + definition.Field = [.. result]; + } + if (string.IsNullOrEmpty(definition.Name)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + "A DataType definition is missing name.", + WotLocation.FromPointer(pointer))); + } + return definition; + } + + private static void WriteTranslations( + Utf8JsonWriter writer, + TranslationType[]? translations) + { + if (translations is null || translations.Length == 0) + { + return; + } + writer.WritePropertyName("translations"); + writer.WriteStartArray(); + foreach (TranslationType translation in translations) + { + writer.WriteStartObject(); + if (translation.Items is { Length: > 0 }) + { + writer.WritePropertyName("items"); + writer.WriteStartArray(); + foreach (object item in translation.Items) + { + writer.WriteStartObject(); + switch (item) + { + case Opc.Ua.Export.LocalizedText text: + writer.WriteString("kind", "text"); + WriteText(writer, text); + break; + case StructureTranslationType field: + writer.WriteString("kind", "field"); + WriteString(writer, "name", field.Name); + WriteTexts(writer, "text", field.Text); + break; + } + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + private static TranslationType[]? ReadTranslations(JsonElement element) + { + if (!element.TryGetProperty("translations", out JsonElement translations) || + translations.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + foreach (JsonElement translation in translations.EnumerateArray()) + { + var items = new List(); + if (translation.TryGetProperty("items", out JsonElement array) && + array.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement item in array.EnumerateArray()) + { + string? kind = GetString(item, "kind"); + if (string.Equals(kind, "text", StringComparison.Ordinal)) + { + items.Add(ReadText(item)); + } + else if (string.Equals(kind, "field", StringComparison.Ordinal)) + { + items.Add(new StructureTranslationType + { + Name = GetString(item, "name"), + Text = ReadTexts(item, "text") + }); + } + } + } + result.Add(new TranslationType { Items = [.. items] }); + } + return [.. result]; + } + + private static void WriteDerivedFacts(Utf8JsonWriter writer, UANode node) + { + if (node.References is null) + { + return; + } + foreach (Reference reference in node.References) + { + if (reference.IsForward && + IsReference(reference.ReferenceType, "HasTypeDefinition", "i=40")) + { + WriteString(writer, "typeDefinition", reference.Value); + } + else if (!reference.IsForward && + IsReference(reference.ReferenceType, "HasSubtype", "i=45")) + { + WriteString(writer, "superType", reference.Value); + } + else if (reference.IsForward && + IsReference(reference.ReferenceType, "HasModellingRule", "i=37") && + reference.Value is not null && + WotVocabulary.TryGetModellingRuleName( + reference.Value, + out string modellingRule)) + { + writer.WriteString("modellingRule", modellingRule); + } + } + } + + private static bool IsReference(string? value, string name, string nodeId) + { + return string.Equals(value, name, StringComparison.Ordinal) || + string.Equals(value, nodeId, StringComparison.Ordinal); + } + + private static void WriteReferences( + Utf8JsonWriter writer, + Reference[]? references) + { + if (references is null || references.Length == 0) + { + return; + } + writer.WritePropertyName("references"); + writer.WriteStartArray(); + foreach (Reference reference in references) + { + writer.WriteStartObject(); + WriteString(writer, "referenceType", reference.ReferenceType); + if (!reference.IsForward) + { + writer.WriteBoolean("isForward", false); + } + WriteString(writer, "target", reference.Value); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + private static Reference[]? ReadReferences(JsonElement element) + { + if (!element.TryGetProperty("references", out JsonElement references) || + references.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + foreach (JsonElement reference in references.EnumerateArray()) + { + result.Add(new Reference + { + ReferenceType = GetString(reference, "referenceType"), + IsForward = !reference.TryGetProperty( + "isForward", + out JsonElement isForward) || + isForward.ValueKind != JsonValueKind.False, + Value = GetString(reference, "target") + }); + } + return [.. result]; + } + + private static void WriteRolePermissions( + Utf8JsonWriter writer, + RolePermission[]? rolePermissions) + { + if (rolePermissions is null || rolePermissions.Length == 0) + { + return; + } + writer.WritePropertyName("rolePermissions"); + writer.WriteStartArray(); + foreach (RolePermission permission in rolePermissions) + { + writer.WriteStartObject(); + if (permission.Permissions != 0) + { + writer.WriteNumber("permissions", permission.Permissions); + } + WriteString(writer, "roleId", permission.Value); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + private static RolePermission[]? ReadRolePermissions( + JsonElement element, + string name) + { + if (!element.TryGetProperty(name, out JsonElement permissions) || + permissions.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + foreach (JsonElement permission in permissions.EnumerateArray()) + { + var rolePermission = new RolePermission + { + Value = GetString(permission, "roleId") + }; + if (TryGetUInt32(permission, "permissions", out uint value)) + { + rolePermission.Permissions = value; + } + result.Add(rolePermission); + } + return [.. result]; + } + + private static void WriteTexts( + Utf8JsonWriter writer, + string name, + Opc.Ua.Export.LocalizedText[]? texts) + { + if (texts is null || texts.Length == 0) + { + return; + } + writer.WritePropertyName(name); + writer.WriteStartArray(); + foreach (Opc.Ua.Export.LocalizedText text in texts) + { + writer.WriteStartObject(); + WriteText(writer, text); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + private static void WriteText( + Utf8JsonWriter writer, + Opc.Ua.Export.LocalizedText text) + { + WriteString(writer, "locale", text.Locale); + WriteString(writer, "value", text.Value); + } + + private static Opc.Ua.Export.LocalizedText[]? ReadTexts( + JsonElement element, + string name) + { + if (!element.TryGetProperty(name, out JsonElement texts) || + texts.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + foreach (JsonElement text in texts.EnumerateArray()) + { + result.Add(ReadText(text)); + } + return [.. result]; + } + + private static Opc.Ua.Export.LocalizedText ReadText(JsonElement element) + { + return new Opc.Ua.Export.LocalizedText + { + Locale = GetString(element, "locale") ?? string.Empty, + Value = GetString(element, "value") + }; + } + + private static void WriteXmlElements( + Utf8JsonWriter writer, + string name, + System.Xml.XmlElement[]? elements) + { + if (elements is null || elements.Length == 0) + { + return; + } + writer.WritePropertyName(name); + writer.WriteStartArray(); + foreach (System.Xml.XmlElement element in elements) + { + writer.WriteStringValue(element.OuterXml); + } + writer.WriteEndArray(); + } + + private static System.Xml.XmlElement[]? ReadXmlElements( + JsonElement element, + string name, + string pointer, + List diagnostics) + { + if (!element.TryGetProperty(name, out JsonElement array) || + array.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + int index = 0; + foreach (JsonElement item in array.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String) + { + System.Xml.XmlElement? parsed = ParseXml( + item.GetString(), + pointer + "/" + index.ToString(CultureInfo.InvariantCulture), + diagnostics); + if (parsed is not null) + { + result.Add(parsed); + } + } + index++; + } + return [.. result]; + } + + private static void WriteXmlElement( + Utf8JsonWriter writer, + string name, + System.Xml.XmlElement? element) + { + if (element is not null) + { + writer.WriteString(name, element.OuterXml); + } + } + + private static System.Xml.XmlElement? ReadXmlElement( + JsonElement element, + string name, + string pointer, + List diagnostics) + { + return ParseXml(GetString(element, name), pointer, diagnostics); + } + + private static System.Xml.XmlElement? ParseXml( + string? xml, + string pointer, + List diagnostics) + { + if (string.IsNullOrEmpty(xml)) + { + return null; + } + try + { + var document = new XmlDocument { XmlResolver = null }; + using var reader = XmlReader.Create( + new StringReader(xml), + CoreUtils.DefaultXmlReaderSettings()); + document.Load(reader); + return document.DocumentElement; + } + catch (XmlException ex) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionInvalid, + $"The native XML fragment is malformed: {ex.Message}", + WotLocation.FromPointer(pointer))); + return null; + } + } + + private static void WriteStrings( + Utf8JsonWriter writer, + string name, + string[]? values) + { + if (values is null || values.Length == 0) + { + return; + } + writer.WritePropertyName(name); + writer.WriteStartArray(); + foreach (string value in values) + { + writer.WriteStringValue(value); + } + writer.WriteEndArray(); + } + + private static string[]? ReadStrings(JsonElement element, string name) + { + if (!element.TryGetProperty(name, out JsonElement values) || + values.ValueKind != JsonValueKind.Array) + { + return null; + } + var result = new List(); + foreach (JsonElement value in values.EnumerateArray()) + { + if (value.ValueKind == JsonValueKind.String) + { + result.Add(value.GetString()!); + } + } + return [.. result]; + } + + private static void WriteString( + Utf8JsonWriter writer, + string name, + string? value) + { + if (!string.IsNullOrEmpty(value)) + { + writer.WriteString(name, value); + } + } + + private static string? GetString(JsonElement element, string name) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private static bool GetBoolean(JsonElement element, string name) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.True; + } + + private static bool TryGetByte( + JsonElement element, + string name, + out byte value) + { + value = default; + return element.TryGetProperty(name, out JsonElement number) && + number.ValueKind == JsonValueKind.Number && + number.TryGetByte(out value); + } + + private static bool TryGetUInt16( + JsonElement element, + string name, + out ushort value) + { + value = default; + return element.TryGetProperty(name, out JsonElement number) && + number.ValueKind == JsonValueKind.Number && + number.TryGetUInt16(out value); + } + + private static bool TryGetUInt32( + JsonElement element, + string name, + out uint value) + { + value = default; + return element.TryGetProperty(name, out JsonElement number) && + number.ValueKind == JsonValueKind.Number && + number.TryGetUInt32(out value); + } + + private static bool TryGetInt32( + JsonElement element, + string name, + out int value) + { + value = default; + return element.TryGetProperty(name, out JsonElement number) && + number.ValueKind == JsonValueKind.Number && + number.TryGetInt32(out value); + } + + private static bool TryGetDouble( + JsonElement element, + string name, + out double value) + { + value = default; + return element.TryGetProperty(name, out JsonElement number) && + number.ValueKind == JsonValueKind.Number && + number.TryGetDouble(out value); + } + + private static bool TryGetDate( + JsonElement element, + string name, + out DateTime value) + { + value = default; + string? text = GetString(element, name); + if (string.IsNullOrEmpty(text)) + { + return false; + } + try + { + value = XmlConvert.ToDateTime(text, XmlDateTimeSerializationMode.RoundtripKind); + return true; + } + catch (FormatException) + { + return false; + } + } + + private static string FormatDate(DateTime value) + { + return XmlConvert.ToString(value, XmlDateTimeSerializationMode.RoundtripKind); + } + + private static string GetNodeClass(UANode node) + { + return node switch + { + UAObjectType => "ObjectType", + UAVariableType => "VariableType", + UAReferenceType => "ReferenceType", + UADataType => "DataType", + UAView => "View", + UAMethod => "Method", + UAVariable => "Variable", + UAObject => "Object", + _ => "Unknown" + }; + } + + private static int CountErrors(List diagnostics) + { + int count = 0; + foreach (WotDiagnostic diagnostic in diagnostics) + { + if (diagnostic.Severity == WotDiagnosticSeverity.Error) + { + count++; + } + } + return count; + } + } +} diff --git a/src/Opc.Ua.Types/Wot/WotNodeSetConverter.Mapping.cs b/src/Opc.Ua.Types/Wot/WotNodeSetConverter.Mapping.cs new file mode 100644 index 0000000000..49aeef2005 --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotNodeSetConverter.Mapping.cs @@ -0,0 +1,2403 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Text.Json; +using Opc.Ua.Export; + +namespace Opc.Ua.Wot +{ + /// + /// Native readable mapping (NodeSet2 to WoT affordances) and WoT to + /// NodeSet2 synthesis for the . + /// + public static partial class WotNodeSetConverter + { + private const uint AccessLevelCurrentRead = 1; + private const uint AccessLevelCurrentWrite = 2; + + private static readonly Dictionary s_dataTypeToJsonType = + new(StringComparer.Ordinal) + { + ["i=1"] = "boolean", + ["Boolean"] = "boolean", + ["i=2"] = "integer", + ["SByte"] = "integer", + ["i=3"] = "integer", + ["Byte"] = "integer", + ["i=4"] = "integer", + ["Int16"] = "integer", + ["i=5"] = "integer", + ["UInt16"] = "integer", + ["i=6"] = "integer", + ["Int32"] = "integer", + ["i=7"] = "integer", + ["UInt32"] = "integer", + ["i=8"] = "integer", + ["Int64"] = "integer", + ["i=9"] = "integer", + ["UInt64"] = "integer", + ["i=10"] = "number", + ["Float"] = "number", + ["i=11"] = "number", + ["Double"] = "number", + ["i=12"] = "string", + ["String"] = "string" + }; + + private static void WriteContext(Utf8JsonWriter writer, UANodeSet nodeSet) + { + writer.WritePropertyName("@context"); + writer.WriteStartArray(); + writer.WriteStringValue(WotVocabulary.WotContext); + writer.WriteStartObject(); + writer.WriteString("uav", WotVocabulary.VocabularyNamespace); + writer.WriteString("ua", WotVocabulary.OpcUaNamespace); + if (nodeSet.NamespaceUris is not null) + { + for (int ii = 0; ii < nodeSet.NamespaceUris.Length; ii++) + { + writer.WriteString( + "ns" + (ii + 1).ToString( + System.Globalization.CultureInfo.InvariantCulture), + nodeSet.NamespaceUris[ii]); + } + } + writer.WriteEndObject(); + writer.WriteEndArray(); + } + + private static void WriteRootType(Utf8JsonWriter writer, UANode? root, bool isEventType) + { + switch (root) + { + case UAObjectType when isEventType: + // An ObjectType derived from BaseEventType projects a UA + // EventType, annotated with uav:eventType (WoT Binding + // Section 5.2) rather than the generic uav:objectType. + writer.WritePropertyName("@type"); + writer.WriteStartArray(); + writer.WriteStringValue(WotVocabulary.ThingModelType); + writer.WriteStringValue(WotVocabulary.EventTypeAnnotation); + writer.WriteEndArray(); + break; + case UAObjectType: + writer.WritePropertyName("@type"); + writer.WriteStartArray(); + writer.WriteStringValue(WotVocabulary.ThingModelType); + writer.WriteStringValue("uav:objectType"); + writer.WriteEndArray(); + break; + case UAVariableType: + writer.WritePropertyName("@type"); + writer.WriteStartArray(); + writer.WriteStringValue(WotVocabulary.ThingModelType); + writer.WriteStringValue("uav:variableType"); + writer.WriteEndArray(); + break; + case UAObject: + writer.WriteString("@type", "uav:object"); + break; + case UAVariable: + writer.WriteString("@type", "uav:variable"); + break; + default: + writer.WriteString("@type", WotVocabulary.ThingModelType); + break; + } + } + + private static void WriteDescription(Utf8JsonWriter writer, Opc.Ua.Export.LocalizedText[]? description) + { + string? text = FirstText(description); + if (!string.IsNullOrEmpty(text)) + { + writer.WriteString("description", text); + } + } + + private static void WriteAffordances( + Utf8JsonWriter writer, + UANodeSet nodeSet, + UANode? root, + List diagnostics, + WotNodeSetConverterOptions options) + { + if (root?.References is null) + { + return; + } + + Dictionary index = BuildIndex(nodeSet); + string[]? namespaceUris = nodeSet.NamespaceUris; + var properties = new List(); + var actions = new List(); + var events = new List(); + + // HasComponent subtypes (for example HasOrderedComponent) are + // surfaced for discovery under uav:hasComponent / uav:componentOf and + // additionally pinned by a link whose rel is the semantic + // ReferenceType model name and whose uav:refId is the definitive + // ExpandedNodeId (WoT Binding Sections 5.1.2 and 5.3). + var componentChildren = new List(); + var componentParents = new List(); + var typedComponentLinks = new List<( + string Target, + string Rel, + string RefType, + string RefName)>(); + + foreach (Reference reference in root.References) + { + if (reference.Value is null) + { + continue; + } + if (reference.IsForward && IsComponentReference(reference.ReferenceType)) + { + if (index.TryGetValue(reference.Value, out UANode? target)) + { + if (target is UAVariable variable) + { + properties.Add(variable); + } + else if (target is UAMethod method) + { + actions.Add(method); + } + } + } + else if (reference.IsForward && + IsGeneratesEventReference(reference.ReferenceType) && + index.TryGetValue(reference.Value, out UANode? eventType)) + { + events.Add(eventType); + } + else if (WotVocabulary.TryGetHasComponentSubtype( + reference.ReferenceType, out string subtypeNodeId)) + { + string? portableTarget = ToPortableNodeId(reference.Value, namespaceUris); + if (string.IsNullOrEmpty(portableTarget)) + { + continue; + } + (reference.IsForward ? componentChildren : componentParents) + .Add(portableTarget!); + typedComponentLinks.Add(( + portableTarget!, + ToReferenceTypeModelName(reference.ReferenceType) + ?? "ua:HasOrderedComponent", + subtypeNodeId, + ComponentRefName(reference.Value, index))); + } + } + + bool isThingModel = root is UAObjectType or UAVariableType; + int affordanceCount = 0; + + WriteComponentArray(writer, "uav:hasComponent", componentChildren); + WriteComponentArray(writer, "uav:componentOf", componentParents); + + if (properties.Count > 0) + { + writer.WritePropertyName("properties"); + writer.WriteStartObject(); + var used = new HashSet(StringComparer.Ordinal); + foreach (UAVariable variable in properties) + { + if (!CheckAffordanceBudget(ref affordanceCount, options, diagnostics)) + { + break; + } + writer.WritePropertyName(UniqueKey(LocalName(variable.BrowseName), used)); + WriteVariableAffordance(writer, variable, isThingModel, namespaceUris); + } + writer.WriteEndObject(); + } + + if (actions.Count > 0) + { + writer.WritePropertyName("actions"); + writer.WriteStartObject(); + var used = new HashSet(StringComparer.Ordinal); + foreach (UAMethod method in actions) + { + if (!CheckAffordanceBudget(ref affordanceCount, options, diagnostics)) + { + break; + } + writer.WritePropertyName(UniqueKey(LocalName(method.BrowseName), used)); + WriteMethodAffordance(writer, method, namespaceUris); + } + writer.WriteEndObject(); + } + + if (events.Count > 0) + { + writer.WritePropertyName("events"); + writer.WriteStartObject(); + var used = new HashSet(StringComparer.Ordinal); + foreach (UANode eventType in events) + { + if (!CheckAffordanceBudget(ref affordanceCount, options, diagnostics)) + { + break; + } + writer.WritePropertyName(UniqueKey(LocalName(eventType.BrowseName), used)); + WriteEventAffordance(writer, eventType, namespaceUris); + } + writer.WriteEndObject(); + } + + WriteTypedComponentLinks(writer, typedComponentLinks); + } + + private static void WriteComponentArray( + Utf8JsonWriter writer, + string name, + List targets) + { + if (targets.Count == 0) + { + return; + } + writer.WritePropertyName(name); + writer.WriteStartArray(); + foreach (string target in targets) + { + writer.WriteStringValue(target); + } + writer.WriteEndArray(); + } + + private static void WriteTypedComponentLinks( + Utf8JsonWriter writer, + List<( + string Target, + string Rel, + string RefType, + string RefName)> links) + { + if (links.Count == 0) + { + return; + } + writer.WritePropertyName("links"); + writer.WriteStartArray(); + foreach (( + string target, + string rel, + string refType, + string refName) in links) + { + writer.WriteStartObject(); + writer.WriteString("rel", rel); + writer.WriteString("href", target); + writer.WriteString("uav:refId", refType); + writer.WriteString("uav:refName", refName); + writer.WriteEndObject(); + } + writer.WriteEndArray(); + } + + private static string ComponentRefName(string rawTarget, Dictionary index) + { + if (index.TryGetValue(rawTarget, out UANode? node) && + LocalName(node.BrowseName) is { Length: > 0 } local) + { + return local; + } + return rawTarget; + } + + /// + /// Maps a HasComponent-subtype reference onto its compact model name. + /// Only reference types accepted by + /// reach this + /// method, and every one of those is a well-known reference type, so the + /// standard vocabulary lookup always resolves. Null is returned if that + /// invariant is ever broken; the caller substitutes a default relation. + /// + private static string? ToReferenceTypeModelName(string? referenceType) + { + if (WotVocabulary.TryGetReferenceTypeBrowseName( + referenceType, + out string browseName)) + { + return "ua:" + browseName; + } + return null; + } + + private static void WriteVariableAffordance( + Utf8JsonWriter writer, + UAVariable variable, + bool isThingModel, + string[]? namespaceUris) + { + writer.WriteStartObject(); + writer.WriteString("@type", isThingModel ? "uav:variableType" : "uav:variable"); + WriteOptional(writer, "title", FirstText(variable.DisplayName)); + WriteDescription(writer, variable.Description); + WriteOptional( + writer, + "uav:browseName", + ToPortableQualifiedName(variable.BrowseName, namespaceUris)); + WriteOptional(writer, "uav:id", ToPortableNodeId(variable.NodeId, namespaceUris)); + + string? jsonType = MapDataTypeToJson(variable.DataType); + if (jsonType is not null) + { + writer.WriteString("type", jsonType); + } + + bool readable = (variable.AccessLevel & AccessLevelCurrentRead) != 0; + bool writable = (variable.AccessLevel & AccessLevelCurrentWrite) != 0; + if (readable && !writable) + { + writer.WriteBoolean("readOnly", true); + } + else if (writable && !readable) + { + writer.WriteBoolean("writeOnly", true); + } + if (readable) + { + // This advertises observation through the WoT binding. It does + // not define core UA monitorability; any Variable may be a + // MonitoredItem when the Server grants access. + writer.WriteBoolean("observable", true); + } + + WriteModellingRule(writer, variable); + writer.WriteEndObject(); + } + + private static void WriteMethodAffordance( + Utf8JsonWriter writer, + UAMethod method, + string[]? namespaceUris) + { + writer.WriteStartObject(); + writer.WriteString("@type", "uav:method"); + WriteOptional(writer, "title", FirstText(method.DisplayName)); + WriteDescription(writer, method.Description); + WriteOptional( + writer, + "uav:browseName", + ToPortableQualifiedName(method.BrowseName, namespaceUris)); + WriteOptional(writer, "uav:id", ToPortableNodeId(method.NodeId, namespaceUris)); + WriteModellingRule(writer, method); + writer.WriteEndObject(); + } + + private static void WriteEventAffordance( + Utf8JsonWriter writer, + UANode eventType, + string[]? namespaceUris) + { + writer.WriteStartObject(); + // uav:eventType is the @type annotation counterpart of the uav:isEvent + // flag; an EventType projection carries both (WoT Binding Section 5.2). + writer.WriteString("@type", WotVocabulary.EventTypeAnnotation); + WriteOptional(writer, "title", FirstText(eventType.DisplayName)); + WriteDescription(writer, eventType.Description); + writer.WriteBoolean("uav:isEvent", true); + WriteOptional( + writer, + "uav:browseName", + ToPortableQualifiedName(eventType.BrowseName, namespaceUris)); + WriteOptional(writer, "uav:id", ToPortableNodeId(eventType.NodeId, namespaceUris)); + WriteModellingRule(writer, eventType); + writer.WriteEndObject(); + } + + private static void WriteModellingRule(Utf8JsonWriter writer, UANode node) + { + string? rule = GetBaselineModellingRule(node); + if (rule is not null) + { + writer.WriteString("uav:modellingRule", rule); + } + } + + private static UANodeSet? Synthesize( + WotDocument document, + WotNodeSetConverterOptions options, + WotThingCatalog? thingCatalog, + WotResolutionContext resolutionContext, + List diagnostics) + { + WotDocumentKind kind = document.Kind; + if (kind == WotDocumentKind.Unknown) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NoConvertibleContent, + "The document is neither a Thing Model nor a Thing Description and carries no preservation envelope or native projection.")); + return null; + } + + bool isThingModel = kind == WotDocumentKind.ThingModel; + bool isEventType = isThingModel && HasEventTypeAnnotation(document); + + // Portable identity and event-annotation validation (WoT Binding + // Sections 5.1.1 and 5.2). Runs before synthesis so a document that + // uses the session-local ns= form or contradicts itself is + // diagnosed; the exact uav:nodeSet envelope and uav:nodes projection + // are never reached here and keep their own namespace indices. + ValidatePortableIdentity(document, diagnostics); + ValidateEventAnnotations(document, diagnostics); + ValidateModelConceptNames(document, diagnostics); + + string modelUri = DeriveModelUri(document); + string rootLocal = LocalName(GetUavString(document, "browseName")) ?? + SanitizeName(document.Title) ?? "Thing"; + string? authoredRootId = GetUavString(document, "id"); + string rootNodeId = GenerateNodeId(rootLocal); + + var nodeSet = new UANodeSet + { + NamespaceUris = [modelUri], + Models = + [ + new ModelTableEntry { ModelUri = modelUri } + ] + }; + if (authoredRootId is not null) + { + rootNodeId = ToNodeSetNodeId(authoredRootId, nodeSet, diagnostics); + } + else + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Info, + WotDiagnosticCode.GeneratedNodeId, + "NodeIds were generated deterministically from the target namespace and browse paths.", + new WotLocation(nodeId: rootNodeId))); + } + + var items = new List(); + var rootReferences = new List(); + + UANode rootNode; + if (isThingModel) + { + rootNode = new UAObjectType { IsAbstract = false }; + rootReferences.Add(new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + // An event-type Thing Model (@type uav:eventType) derives + // from BaseEventType rather than BaseObjectType. + Value = isEventType + ? WotVocabulary.BaseEventType + : WotVocabulary.BaseObjectType + }); + } + else + { + rootNode = new UAObject(); + rootReferences.Add(new Reference + { + ReferenceType = "HasTypeDefinition", + IsForward = true, + Value = WotVocabulary.BaseObjectType + }); + } + + rootNode.NodeId = rootNodeId; + string? rootBrowseName = GetUavString(document, "browseName"); + rootNode.BrowseName = rootBrowseName is null + ? "1:" + rootLocal + : ToNodeSetQualifiedName( + document, + rootBrowseName, + nodeSet, + diagnostics); + rootNode.DisplayName = MakeText(document.Title ?? rootLocal); + string? rootDescription = GetRootString(document, "description"); + if (rootDescription is not null) + { + rootNode.Description = MakeText(rootDescription); + } + + int affordanceCount = 0; + + foreach (KeyValuePair property in document.Properties) + { + if (!CheckAffordanceBudget(ref affordanceCount, options, diagnostics)) + { + break; + } + SynthesizeProperty( + document, nodeSet, property.Key, property.Value, rootLocal, + rootNodeId, isThingModel, + items, rootReferences, diagnostics); + } + + foreach (KeyValuePair action in document.Actions) + { + if (!CheckAffordanceBudget(ref affordanceCount, options, diagnostics)) + { + break; + } + SynthesizeAction( + document, nodeSet, action.Key, action.Value, rootLocal, + rootNodeId, items, rootReferences, diagnostics); + } + + foreach (KeyValuePair eventAffordance in document.Events) + { + if (!CheckAffordanceBudget(ref affordanceCount, options, diagnostics)) + { + break; + } + SynthesizeEvent( + document, nodeSet, eventAffordance.Key, eventAffordance.Value, + rootLocal, items, rootReferences, diagnostics); + } + + // A ReferenceType relation whose target is also listed under + // uav:hasComponent / uav:componentOf pins the exact subtype of that + // component (WoT Binding Section 5.3). Collect those pins once so the + // link pass does not also emit a separate generic reference and the + // component pass recreates the exact ReferenceType. + Dictionary componentTypedRefs = + CollectComponentTypedRefs(document, diagnostics); + SynthesizeLinks( + document, rootReferences, componentTypedRefs, thingCatalog, + resolutionContext, options, diagnostics); + SynthesizeComponentArrays(document, rootReferences, componentTypedRefs); + + rootNode.References = [.. rootReferences]; + items.Insert(0, rootNode); + nodeSet.Items = [.. items]; + return nodeSet; + } + + private static void SynthesizeProperty( + WotDocument document, + UANodeSet nodeSet, + string key, + JsonElement schema, + string rootLocal, + string rootNodeId, + bool isThingModel, + List items, + List rootReferences, + List diagnostics) + { + string local = LocalName(GetElementString(schema, "uav:browseName")) ?? key; + string? authoredNodeId = GetElementString(schema, "uav:id"); + string nodeId = authoredNodeId is null + ? GenerateNodeId(rootLocal + "/" + local) + : ToNodeSetNodeId(authoredNodeId, nodeSet, diagnostics); + string? authoredBrowseName = GetElementString(schema, "uav:browseName"); + var variable = new UAVariable + { + NodeId = nodeId, + BrowseName = authoredBrowseName is null + ? "1:" + local + : ToNodeSetQualifiedName( + document, + authoredBrowseName, + nodeSet, + diagnostics), + ParentNodeId = rootNodeId, + DataType = MapJsonSchemaToDataType(schema), + AccessLevel = MapAccessLevel(schema) + }; + string? title = GetElementString(schema, "title"); + if (title is not null) + { + variable.DisplayName = MakeText(title); + } + string? description = GetElementString(schema, "description"); + if (description is not null) + { + variable.Description = MakeText(description); + } + + var references = new List + { + new Reference + { + ReferenceType = "HasTypeDefinition", + IsForward = true, + Value = WotVocabulary.BaseDataVariableType + }, + new Reference + { + ReferenceType = "HasComponent", + IsForward = false, + Value = rootNodeId + } + }; + AddModellingRule(schema, references); + variable.References = [.. references]; + + ReportUnsupportedSchema(schema, nodeId, diagnostics); + + items.Add(variable); + rootReferences.Add(new Reference + { + ReferenceType = "HasComponent", + IsForward = true, + Value = nodeId + }); + _ = isThingModel; + } + + private static void SynthesizeAction( + WotDocument document, + UANodeSet nodeSet, + string key, + JsonElement action, + string rootLocal, + string rootNodeId, + List items, + List rootReferences, + List diagnostics) + { + string local = LocalName(GetElementString(action, "uav:browseName")) ?? key; + string? authoredNodeId = GetElementString(action, "uav:id"); + string nodeId = authoredNodeId is null + ? GenerateNodeId(rootLocal + "/" + local) + : ToNodeSetNodeId(authoredNodeId, nodeSet, diagnostics); + string? authoredBrowseName = GetElementString(action, "uav:browseName"); + var method = new UAMethod + { + NodeId = nodeId, + BrowseName = authoredBrowseName is null + ? "1:" + local + : ToNodeSetQualifiedName( + document, + authoredBrowseName, + nodeSet, + diagnostics), + ParentNodeId = rootNodeId + }; + string? title = GetElementString(action, "title"); + if (title is not null) + { + method.DisplayName = MakeText(title); + } + + var references = new List + { + new Reference + { + ReferenceType = "HasComponent", + IsForward = false, + Value = rootNodeId + } + }; + AddModellingRule(action, references); + method.References = [.. references]; + + items.Add(method); + rootReferences.Add(new Reference + { + ReferenceType = "HasComponent", + IsForward = true, + Value = nodeId + }); + } + + private static void SynthesizeEvent( + WotDocument document, + UANodeSet nodeSet, + string key, + JsonElement eventAffordance, + string rootLocal, + List items, + List rootReferences, + List diagnostics) + { + string local = LocalName(GetElementString(eventAffordance, "uav:browseName")) ?? key; + string? authoredNodeId = GetElementString( + eventAffordance, + "uav:id"); + string nodeId = authoredNodeId is null + ? GenerateNodeId(rootLocal + "/" + local) + : ToNodeSetNodeId(authoredNodeId, nodeSet, diagnostics); + string? authoredBrowseName = GetElementString( + eventAffordance, + "uav:browseName"); + var eventType = new UAObjectType + { + NodeId = nodeId, + BrowseName = authoredBrowseName is null + ? "1:" + local + : ToNodeSetQualifiedName( + document, + authoredBrowseName, + nodeSet, + diagnostics), + IsAbstract = false + }; + string? title = GetElementString(eventAffordance, "title"); + if (title is not null) + { + eventType.DisplayName = MakeText(title); + } + eventType.References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = WotVocabulary.BaseEventType + } + ]; + + items.Add(eventType); + rootReferences.Add(new Reference + { + ReferenceType = "GeneratesEvent", + IsForward = true, + Value = nodeId + }); + } + + private static void SynthesizeLinks( + WotDocument document, + List rootReferences, + Dictionary componentTypedRefs, + WotThingCatalog? thingCatalog, + WotResolutionContext resolutionContext, + WotNodeSetConverterOptions options, + List diagnostics) + { + foreach ((string href, string? referenceType, bool isExtends) in EnumerateResolvableThingReferences( + document, + componentTypedRefs, + diagnostics)) + { + if (isExtends) + { + if (TryResolveTargetNodeId( + href, thingCatalog, resolutionContext, options, diagnostics, out string extendsTarget)) + { + SetSuperType(rootReferences, extendsTarget); + } + continue; + } + + if (TryResolveTargetNodeId( + href, thingCatalog, resolutionContext, options, diagnostics, out string linkTarget)) + { + rootReferences.Add(new Reference + { + ReferenceType = referenceType!, + IsForward = true, + Value = linkTarget + }); + } + } + } + + private static IEnumerable<(string Reference, string? ReferenceType, bool IsExtends)> + EnumerateResolvableThingReferences( + WotDocument document, + Dictionary componentTypedRefs, + List diagnostics) + { + foreach (JsonElement link in document.Links) + { + string? rel = GetElementString(link, "rel"); + string? href = GetElementString(link, "href"); + if (rel is null || href is null) + { + continue; + } + + if (string.Equals(rel, "tm:extends", StringComparison.Ordinal)) + { + yield return (href, null, true); + continue; + } + + if (!IsReferenceRel(document, link, rel)) + { + continue; + } + + // A typed link that pins the subtype of a listed component is + // realized by the component pass, not here, so the component is + // not emitted twice (WoT Binding Section 5.3). + if (componentTypedRefs.ContainsKey(href)) + { + continue; + } + + if (TryResolveLinkReferenceType( + document, + link, + rel, + diagnostics, + out string referenceType)) + { + yield return (href, referenceType, false); + } + } + } + + private static bool TryResolveLinkReferenceType( + WotDocument document, + JsonElement link, + string rel, + List diagnostics, + out string referenceType) + { + string? modelName = IsModelConceptRelation(document, link, rel) + ? rel + : null; + string? definitive = GetElementString(link, "uav:refId"); + string? canonicalDefinitive = CanonicalReferenceType(definitive); + if (definitive is not null && canonicalDefinitive is null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptUnresolved, + $"The uav:refId value '{definitive}' is not a portable " + + "ExpandedNodeId.", + new WotLocation(reference: definitive))); + referenceType = string.Empty; + return false; + } + + if (modelName is not null && + TryResolveReferenceTypeName( + document, + modelName, + out string resolvedName)) + { + if (canonicalDefinitive is not null && + !string.Equals( + resolvedName, + canonicalDefinitive, + StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptConflict, + $"The ReferenceType model name '{modelName}' resolves to " + + $"'{resolvedName}' but uav:refId is '{definitive}'.", + new WotLocation(reference: modelName))); + referenceType = string.Empty; + return false; + } + referenceType = resolvedName; + return true; + } + + if (canonicalDefinitive is not null) + { + referenceType = canonicalDefinitive; + return true; + } + + if (modelName is not null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptUnresolved, + $"The ReferenceType relation '{modelName}' could not be " + + "resolved and has no ExpandedNodeId fallback.", + new WotLocation(reference: modelName))); + referenceType = string.Empty; + return false; + } + + referenceType = DefaultReferenceType(rel); + return true; + } + + private static string? CanonicalReferenceType(string? referenceType) + { + if (string.IsNullOrEmpty(referenceType)) + { + return null; + } + return IsNodeId(referenceType) ? referenceType : null; + } + + private static bool TryResolveReferenceTypeName( + WotDocument document, + string modelName, + out string referenceType) + { + referenceType = string.Empty; + if (!TrySplitCompactModelName( + modelName, + out string prefix, + out string browseName) || + !TryGetContextNamespace(document, prefix, out string namespaceUri)) + { + return false; + } + return string.Equals( + namespaceUri, + WotVocabulary.OpcUaNamespace, + StringComparison.Ordinal) && + WotVocabulary.TryGetReferenceTypeNodeId( + browseName, + out referenceType); + } + + private static bool TrySplitCompactModelName( + string value, + out string prefix, + out string browseName) + { + prefix = string.Empty; + browseName = string.Empty; + int separator = -1; + for (int ii = 0; ii < value.Length; ii++) + { + if (value[ii] == ':') + { + separator = ii; + break; + } + } + if (separator <= 0 || separator + 1 >= value.Length) + { + return false; + } + string candidate = value.Substring(0, separator); + if (!IsAsciiLetter(candidate[0]) && candidate[0] != '_') + { + return false; + } + for (int ii = 0; ii < candidate.Length; ii++) + { + char character = candidate[ii]; + if (!IsAsciiLetter(character) && + character is not (>= '0' and <= '9') && + character is not ('_' or '.' or '-')) + { + return false; + } + } + prefix = candidate; + browseName = value.Substring(separator + 1); + return true; + } + + private static bool IsAsciiLetter(char value) + { + return value is >= 'A' and <= 'Z' or >= 'a' and <= 'z'; + } + + private static bool TryGetContextNamespace( + WotDocument document, + string prefix, + out string namespaceUri) + { + if (string.Equals(prefix, "ua", StringComparison.Ordinal)) + { + namespaceUri = WotVocabulary.OpcUaNamespace; + return true; + } + if (string.Equals(prefix, "uav", StringComparison.Ordinal)) + { + namespaceUri = WotVocabulary.VocabularyNamespace; + return true; + } + if (document.TryGetContext(out JsonElement context) && + TryGetContextNamespace(context, prefix, out namespaceUri)) + { + return true; + } + namespaceUri = string.Empty; + return false; + } + + private static bool TryGetContextNamespace( + JsonElement context, + string prefix, + out string namespaceUri) + { + if (context.ValueKind == JsonValueKind.Object && + context.TryGetProperty(prefix, out JsonElement value) && + value.ValueKind == JsonValueKind.String) + { + namespaceUri = value.GetString()!; + return true; + } + if (context.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement entry in context.EnumerateArray()) + { + if (TryGetContextNamespace(entry, prefix, out namespaceUri)) + { + return true; + } + } + } + namespaceUri = string.Empty; + return false; + } + + /// + /// Collects the subtype pins carried by ReferenceType model-name links + /// whose target is also listed under uav:hasComponent or + /// uav:componentOf: target ExpandedNodeId to the exact + /// ReferenceType named by rel and, when needed, + /// uav:refId + /// (WoT Binding Section 5.3). + /// + private static Dictionary CollectComponentTypedRefs( + WotDocument document, + List diagnostics) + { + var pins = new Dictionary(StringComparer.Ordinal); + var componentTargets = new HashSet(StringComparer.Ordinal); + CollectComponentTargets(document, "hasComponent", componentTargets); + CollectComponentTargets(document, "componentOf", componentTargets); + if (componentTargets.Count == 0) + { + return pins; + } + foreach (JsonElement link in document.Links) + { + string? rel = GetElementString(link, "rel"); + if (rel is null || + !IsModelConceptRelation(document, link, rel)) + { + continue; + } + string? href = GetElementString(link, "href"); + if (href is not null && + componentTargets.Contains(href) && + TryResolveLinkReferenceType( + document, + link, + rel, + diagnostics, + out string refType)) + { + pins[href] = refType; + } + } + return pins; + } + + private static void CollectComponentTargets( + WotDocument document, + string localName, + HashSet targets) + { + if (document.TryGetUav(localName, out JsonElement array) && + array.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement target in array.EnumerateArray()) + { + if (target.ValueKind == JsonValueKind.String && + target.GetString() is { Length: > 0 } value) + { + targets.Add(value); + } + } + } + } + + private static void SynthesizeComponentArrays( + WotDocument document, + List rootReferences, + Dictionary componentTypedRefs) + { + if (document.TryGetUav("hasComponent", out JsonElement hasComponent) && + hasComponent.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement target in hasComponent.EnumerateArray()) + { + if (target.ValueKind == JsonValueKind.String) + { + rootReferences.Add(new Reference + { + ReferenceType = ComponentReferenceType(target.GetString(), componentTypedRefs), + IsForward = true, + Value = target.GetString() + }); + } + } + } + if (document.TryGetUav("componentOf", out JsonElement componentOf) && + componentOf.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement target in componentOf.EnumerateArray()) + { + if (target.ValueKind == JsonValueKind.String) + { + rootReferences.Add(new Reference + { + ReferenceType = ComponentReferenceType(target.GetString(), componentTypedRefs), + IsForward = false, + Value = target.GetString() + }); + } + } + } + } + + private static string ComponentReferenceType( + string? target, + Dictionary componentTypedRefs) + { + // A component whose exact subtype is pinned by a matching + // ReferenceType link is recreated with that ReferenceType; + // otherwise plain HasComponent is used (WoT Binding Section 5.3). + if (target is not null && componentTypedRefs.TryGetValue(target, out string? refType)) + { + return refType; + } + return "HasComponent"; + } + + private static async ValueTask PreresolveThingReferencesAsync( + WotDocument document, + WotNodeSetConverterOptions options, + IWotThingResolver resolver, + WotResolutionContext context, + WotThingCatalog thingCatalog, + List diagnostics, + CancellationToken cancellationToken) + { + if (document.TryGetEnvelope(out _) || + document.TryGetNativeProjection(out _) || + document.Kind == WotDocumentKind.Unknown) + { + return; + } + + var discoveryDiagnostics = new List(); + Dictionary componentTypedRefs = + CollectComponentTypedRefs(document, discoveryDiagnostics); + foreach ((string reference, _, _) in EnumerateResolvableThingReferences( + document, + componentTypedRefs, + discoveryDiagnostics)) + { + cancellationToken.ThrowIfCancellationRequested(); + if (IsNodeId(reference)) + { + continue; + } + + string? nodeId = await ResolveTargetNodeIdAsync( + reference, + resolver, + context, + options, + diagnostics, + cancellationToken).ConfigureAwait(false); + thingCatalog.Add(reference, nodeId); + } + } + + private static async ValueTask ResolveTargetNodeIdAsync( + string reference, + IWotThingResolver resolver, + WotResolutionContext context, + WotNodeSetConverterOptions options, + List diagnostics, + CancellationToken cancellationToken) + { + var entered = new List(); + try + { + string current = reference; + while (true) + { + cancellationToken.ThrowIfCancellationRequested(); + if (!context.TryEnter(WotResolutionKind.Thing, current, out WotDiagnostic? blocking)) + { + diagnostics.Add(blocking!); + return null; + } + entered.Add(current); + + WotResolverResult result = await resolver.ResolveThingAsync( + current, + context, + cancellationToken).ConfigureAwait(false); + if (!result.Found) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.ResolverNotFound, + $"The referenced document '{current}' could not be resolved.", + new WotLocation(reference: current))); + return null; + } + if (!context.TryAddBytes(current, result.Content.Length, out WotDiagnostic? limit)) + { + diagnostics.Add(limit!); + return null; + } + + using WotDocument resolved = WotDocument.Parse(result.Content, options); + string? resolvedId = GetUavString(resolved, "id"); + if (resolvedId is not null) + { + return resolvedId; + } + string? congruent = GetUavString(resolved, "congruentType"); + if (congruent is not null && + !string.Equals(congruent, current, StringComparison.Ordinal)) + { + current = congruent; + continue; + } + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.UnresolvedReference, + $"The referenced document '{current}' does not declare a uav:id.", + new WotLocation(reference: current))); + return null; + } + } + finally + { + for (int ii = entered.Count - 1; ii >= 0; ii--) + { + context.Leave(entered[ii]); + } + } + } + + private static bool TryResolveTargetNodeId( + string reference, + WotThingCatalog? thingCatalog, + WotResolutionContext context, + WotNodeSetConverterOptions options, + List diagnostics, + out string nodeId) + { + if (IsNodeId(reference)) + { + nodeId = reference; + return true; + } + nodeId = string.Empty; + if (thingCatalog is null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.UnresolvedReference, + $"The reference '{reference}' could not be resolved to a NodeId without an external resolver.", + new WotLocation(reference: reference))); + return false; + } + + if (thingCatalog.TryTake(reference, out string? resolvedNodeId)) + { + if (resolvedNodeId is null) + { + return false; + } + nodeId = resolvedNodeId; + return true; + } + + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.UnresolvedReference, + $"The reference '{reference}' was not pre-resolved before synchronous conversion.", + new WotLocation(reference: reference))); + _ = context; + _ = options; + return false; + } + + private static void ReportUnsupportedSchema( + JsonElement schema, + string nodeId, + List diagnostics) + { + if (schema.TryGetProperty("uav:externalSchema", out JsonElement external) && + external.ValueKind == JsonValueKind.String) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.UnsupportedSchema, + $"The property references an external schema '{external.GetString()}' that was not inlined.", + WotLocation.FromNode(nodeId))); + return; + } + string? type = GetElementString(schema, "type"); + if (string.Equals(type, "object", StringComparison.Ordinal) || + string.Equals(type, "array", StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.UnsupportedSchema, + $"The '{type}' DataSchema was mapped to a generic DataType; a custom DataType may be required.", + WotLocation.FromNode(nodeId))); + } + } + + private static void AddModellingRule(JsonElement schema, List references) + { + string? rule = GetElementString(schema, "uav:modellingRule"); + if (rule is not null && WotVocabulary.TryGetModellingRuleNodeId(rule, out string ruleNodeId)) + { + references.Add(new Reference + { + ReferenceType = "HasModellingRule", + IsForward = true, + Value = ruleNodeId + }); + } + } + + private static void SetSuperType(List references, string target) + { + for (int ii = 0; ii < references.Count; ii++) + { + if (string.Equals(references[ii].ReferenceType, "HasSubtype", StringComparison.Ordinal) && + !references[ii].IsForward) + { + references[ii].Value = target; + return; + } + } + references.Add(new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = target + }); + } + + private static Dictionary BuildIndex(UANodeSet nodeSet) + { + var index = new Dictionary(StringComparer.Ordinal); + if (nodeSet.Items is not null) + { + foreach (UANode node in nodeSet.Items) + { + if (!string.IsNullOrEmpty(node.NodeId)) + { + index[node.NodeId!] = node; + } + } + } + return index; + } + + private static UANode? SelectRootNode(UANodeSet nodeSet) + { + if (nodeSet.Items is null || nodeSet.Items.Length == 0) + { + return null; + } + return FirstOf(nodeSet) + ?? FirstOf(nodeSet) + ?? FirstOf(nodeSet) + ?? FirstOf(nodeSet) + ?? nodeSet.Items[0]; + } + + private static UANode? FirstOf(UANodeSet nodeSet) where T : UANode + { + foreach (UANode node in nodeSet.Items!) + { + if (node is T) + { + return node; + } + } + return null; + } + + private static bool CheckAffordanceBudget( + ref int count, + WotNodeSetConverterOptions options, + List diagnostics) + { + if (count >= options.MaxAffordanceCount) + { + if (count == options.MaxAffordanceCount) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.AffordanceCountExceeded, + $"The affordance count exceeded the configured limit of {options.MaxAffordanceCount}.")); + count++; + } + return false; + } + count++; + return true; + } + + private static bool IsComponentReference(string? referenceType) + { + return string.Equals(referenceType, "HasComponent", StringComparison.Ordinal) || + string.Equals(referenceType, "HasProperty", StringComparison.Ordinal) || + string.Equals(referenceType, WotVocabulary.HasComponent, StringComparison.Ordinal) || + string.Equals(referenceType, WotVocabulary.HasProperty, StringComparison.Ordinal); + } + + private static bool IsGeneratesEventReference(string? referenceType) + { + return string.Equals(referenceType, "GeneratesEvent", StringComparison.Ordinal) || + string.Equals(referenceType, WotVocabulary.GeneratesEvent, StringComparison.Ordinal); + } + + private static bool IsReferenceRel( + WotDocument document, + JsonElement link, + string rel) + { + return rel is "uav:reference" or + "uav:componentModel" or + "uav:capability" || + IsModelConceptRelation(document, link, rel); + } + + private static bool IsModelConceptRelation( + WotDocument document, + JsonElement link, + string rel) + { + if (!TrySplitCompactModelName( + rel, + out string prefix, + out _) || + string.Equals(prefix, "uav", StringComparison.Ordinal) || + string.Equals(prefix, "tm", StringComparison.Ordinal) || + IsExternalRelationPrefix(prefix) || + !IsModelConceptCandidate(link, prefix) || + !TryGetContextNamespace(document, prefix, out _)) + { + return false; + } + return true; + } + + private static bool IsKnownBindingRelation(string rel) + { + return rel is "uav:reference" or + "uav:componentModel" or + "uav:capability" or + "uav:componentOf"; + } + + private static bool IsModelConceptCandidate( + JsonElement link, + string prefix) + { + return string.Equals(prefix, "ua", StringComparison.Ordinal) || + StartsWithGeneratedNamespacePrefix(prefix) || + link.TryGetProperty("uav:refId", out _) || + link.TryGetProperty("uav:refName", out _); + } + + private static bool StartsWithGeneratedNamespacePrefix(string prefix) + { + if (!prefix.StartsWith("ns", StringComparison.Ordinal) || + prefix.Length == 2) + { + return false; + } + for (int ii = 2; ii < prefix.Length; ii++) + { + if (prefix[ii] is not (>= '0' and <= '9')) + { + return false; + } + } + return true; + } + + private static bool IsExternalRelationPrefix(string prefix) + { + return prefix is "http" or "https" or "urn"; + } + + private static string DefaultReferenceType(string rel) + { + if (string.Equals(rel, "uav:componentModel", StringComparison.Ordinal)) + { + return "HasComponent"; + } + return "Organizes"; + } + + private static bool IsNodeId(string reference) + { + return reference.StartsWith("ns=", StringComparison.Ordinal) || + reference.StartsWith("nsu=", StringComparison.Ordinal) || + reference.StartsWith("svr=", StringComparison.Ordinal) || + reference.StartsWith("i=", StringComparison.Ordinal) || + reference.StartsWith("s=", StringComparison.Ordinal) || + reference.StartsWith("g=", StringComparison.Ordinal) || + reference.StartsWith("b=", StringComparison.Ordinal); + } + + private static string GenerateNodeId(string browsePath) + { + return "ns=1;s=" + browsePath; + } + + /// + /// Renders a NodeSet-local NodeId string as a portable OPC 10000-6 + /// ExpandedNodeId (WoT Binding Section 5.1.1): namespace 0 keeps its + /// canonical i=/s= form, while a higher namespace index is + /// resolved to nsu=<NamespaceUri>;... through the source + /// NodeSet's NamespaceUris table so the value survives a + /// namespace-table reordering. The session-local ns=<index> + /// form is never emitted. An unparseable or unresolvable value is left + /// untouched. + /// + private static string? ToPortableNodeId(string? rawNodeId, string[]? namespaceUris) + { + if (string.IsNullOrEmpty(rawNodeId)) + { + return rawNodeId; + } + NodeId parsed; + try + { + parsed = NodeId.Parse(rawNodeId!); + } + catch (ServiceResultException) + { + return rawNodeId; + } + var buffer = new System.Text.StringBuilder(); + ushort index = parsed.NamespaceIndex; + if (index != 0) + { + if (namespaceUris is null || index - 1 >= namespaceUris.Length) + { + return rawNodeId; + } + buffer.Append("nsu=") + .Append(CoreUtils.EscapeUri(namespaceUris[index - 1])) + .Append(';'); + } + NodeId.Format( + System.Globalization.CultureInfo.InvariantCulture, + buffer, + parsed.IdentifierAsString, + parsed.IdType, + 0); + return buffer.ToString(); + } + + private static string? ToPortableQualifiedName( + string? rawBrowseName, + string[]? namespaceUris) + { + if (string.IsNullOrEmpty(rawBrowseName) || + rawBrowseName!.StartsWith("nsu=", StringComparison.Ordinal)) + { + return rawBrowseName; + } + int separator = -1; + for (int ii = 0; ii < rawBrowseName.Length; ii++) + { + if (rawBrowseName[ii] == ':') + { + separator = ii; + break; + } + if (rawBrowseName[ii] is not (>= '0' and <= '9')) + { + return rawBrowseName; + } + } + if (separator <= 0 || separator + 1 >= rawBrowseName.Length) + { + return rawBrowseName; + } + int namespaceIndex = 0; + for (int ii = 0; ii < separator; ii++) + { + int digit = rawBrowseName[ii] - '0'; + if (namespaceIndex > (int.MaxValue - digit) / 10) + { + return rawBrowseName; + } + namespaceIndex = (namespaceIndex * 10) + digit; + } + string name = rawBrowseName.Substring(separator + 1); + if (namespaceIndex == 0) + { + return name; + } + if (namespaceUris is null || namespaceIndex > namespaceUris.Length) + { + return rawBrowseName; + } + return "ns" + + namespaceIndex.ToString( + System.Globalization.CultureInfo.InvariantCulture) + + ":" + + name; + } + + private static string ToNodeSetQualifiedName( + WotDocument document, + string rawBrowseName, + UANodeSet nodeSet, + List diagnostics) + { + if (rawBrowseName.StartsWith("nsu=", StringComparison.Ordinal)) + { + int delimiter = rawBrowseName.IndexOf(';', 4); + if (delimiter < 0 || delimiter + 1 >= rawBrowseName.Length) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NonPortableQualifiedName, + $"The uav:browseName '{rawBrowseName}' is not a valid " + + "NamespaceUri-qualified QualifiedName.")); + return rawBrowseName; + } + string namespaceUri = CoreUtils.UnescapeUri( + rawBrowseName.AsSpan(4, delimiter - 4)); + string name = rawBrowseName.Substring(delimiter + 1); + if (string.Equals( + namespaceUri, + WotVocabulary.OpcUaNamespace, + StringComparison.Ordinal)) + { + return name; + } + int namespaceIndex = GetOrAppendNamespaceUri(nodeSet, namespaceUri); + return namespaceIndex.ToString( + System.Globalization.CultureInfo.InvariantCulture) + + ":" + + name; + } + + int separator = -1; + for (int ii = 0; ii < rawBrowseName.Length; ii++) + { + if (rawBrowseName[ii] == ':') + { + separator = ii; + break; + } + } + if (separator > 0) + { + bool numeric = true; + for (int ii = 0; ii < separator; ii++) + { + if (rawBrowseName[ii] is not (>= '0' and <= '9')) + { + numeric = false; + break; + } + } + if (numeric) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.NonPortableQualifiedName, + $"The uav:browseName '{rawBrowseName}' uses a numeric " + + "NamespaceIndex; persisted documents shall use a " + + "context prefix or nsu=;.", + new WotLocation(reference: rawBrowseName))); + return rawBrowseName; + } + string prefix = rawBrowseName.Substring(0, separator); + if (!TryGetContextNamespace(document, prefix, out string namespaceUri)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NonPortableQualifiedName, + $"The uav:browseName '{rawBrowseName}' uses an unbound " + + $"context prefix '{prefix}'.", + new WotLocation(reference: rawBrowseName))); + return rawBrowseName; + } + string name = rawBrowseName.Substring(separator + 1); + if (string.Equals( + namespaceUri, + WotVocabulary.OpcUaNamespace, + StringComparison.Ordinal)) + { + return name; + } + int namespaceIndex = GetOrAppendNamespaceUri(nodeSet, namespaceUri); + return namespaceIndex.ToString( + System.Globalization.CultureInfo.InvariantCulture) + + ":" + + name; + } + return rawBrowseName; + } + + private static string ToNodeSetNodeId( + string portableNodeId, + UANodeSet nodeSet, + List diagnostics) + { + if (portableNodeId.StartsWith("nsu=", StringComparison.Ordinal)) + { + int delimiter = portableNodeId.IndexOf(';', 4); + if (delimiter < 0 || delimiter + 1 >= portableNodeId.Length) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ValidationError, + $"The NodeId '{portableNodeId}' is not a valid " + + "NamespaceUri-qualified NodeId.")); + return portableNodeId; + } + string namespaceUri = CoreUtils.UnescapeUri( + portableNodeId.AsSpan(4, delimiter - 4)); + string identifier = portableNodeId.Substring(delimiter + 1); + if (string.Equals( + namespaceUri, + WotVocabulary.OpcUaNamespace, + StringComparison.Ordinal)) + { + return identifier; + } + int namespaceIndex = GetOrAppendNamespaceUri(nodeSet, namespaceUri); + return "ns=" + + namespaceIndex.ToString( + System.Globalization.CultureInfo.InvariantCulture) + + ";" + + identifier; + } + return portableNodeId; + } + + private static int GetOrAppendNamespaceUri( + UANodeSet nodeSet, + string namespaceUri) + { + if (nodeSet.NamespaceUris is not null) + { + for (int ii = 0; ii < nodeSet.NamespaceUris.Length; ii++) + { + if (string.Equals( + nodeSet.NamespaceUris[ii], + namespaceUri, + StringComparison.Ordinal)) + { + return ii + 1; + } + } + } + var uris = nodeSet.NamespaceUris is null + ? new List() + : new List(nodeSet.NamespaceUris); + uris.Add(namespaceUri); + nodeSet.NamespaceUris = [.. uris]; + return uris.Count; + } + + private static bool HasEventTypeAnnotation(WotDocument document) + { + foreach (string token in document.TypeTokens) + { + if (string.Equals(token, WotVocabulary.EventTypeAnnotation, StringComparison.Ordinal)) + { + return true; + } + } + return false; + } + + /// + /// Determines whether the projected root ObjectType derives from + /// BaseEventType and therefore projects a UA EventType, annotated with + /// uav:eventType (WoT Binding Section 5.2). + /// + private static bool IsEventTypeRoot(UANode? root, UANodeSet nodeSet) + { + if (root is not UAObjectType) + { + return false; + } + Dictionary index = BuildIndex(nodeSet); + UANode? current = root; + int guard = index.Count + 1; + while (current is UAObjectType && guard-- > 0) + { + string? superType = FindSuperTypeId(current); + if (superType is null) + { + return false; + } + if (string.Equals(superType, WotVocabulary.BaseEventType, StringComparison.Ordinal)) + { + return true; + } + if (!index.TryGetValue(superType, out current)) + { + return false; + } + } + return false; + } + + private static string? FindSuperTypeId(UANode node) + { + if (node.References is null) + { + return null; + } + foreach (Reference reference in node.References) + { + if (!reference.IsForward && reference.Value is not null && + (string.Equals(reference.ReferenceType, "HasSubtype", StringComparison.Ordinal) || + string.Equals(reference.ReferenceType, WotVocabulary.HasSubtype, StringComparison.Ordinal))) + { + return reference.Value; + } + } + return null; + } + + /// + /// Portable identity validation (WoT Binding Section 5.1.1): every + /// NodeId-valued term (uav:id, each uav:hasComponent / + /// uav:componentOf entry, uav:mapToNodeId, + /// uav:mapToType, uav:refId, and a + /// ?id= href) shall be a portable ExpandedNodeId, never the + /// session-local ns=<index> form. The exact uav:nodeSet + /// envelope and uav:nodes projection subtrees are skipped so their + /// own namespace indices - resolved through their own NamespaceUris table - + /// are unaffected. + /// + private static void ValidatePortableIdentity( + WotDocument document, + List diagnostics) + { + ValidatePortableIdentity(document.RootElement, diagnostics); + } + + private static void ValidatePortableIdentity( + JsonElement element, + List diagnostics) + { + switch (element.ValueKind) + { + case JsonValueKind.Object: + foreach (JsonProperty member in element.EnumerateObject()) + { + if (string.Equals(member.Name, "uav:nodeSet", StringComparison.Ordinal) || + string.Equals(member.Name, "uav:nodes", StringComparison.Ordinal)) + { + // Exact preservation subtrees keep their own indices. + continue; + } + CheckPortableMember(member.Name, member.Value, diagnostics); + ValidatePortableIdentity(member.Value, diagnostics); + } + break; + case JsonValueKind.Array: + foreach (JsonElement item in element.EnumerateArray()) + { + ValidatePortableIdentity(item, diagnostics); + } + break; + } + } + + private static void CheckPortableMember( + string name, + JsonElement value, + List diagnostics) + { + switch (name) + { + case "uav:id": + case "uav:mapToNodeId": + case "uav:mapToType": + if (value.ValueKind == JsonValueKind.String) + { + CheckPortableValue(name, value.GetString(), diagnostics); + } + break; + case "uav:hasComponent": + case "uav:componentOf": + if (value.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement entry in value.EnumerateArray()) + { + if (entry.ValueKind == JsonValueKind.String) + { + CheckPortableValue(name + " entry", entry.GetString(), diagnostics); + } + } + } + break; + case "uav:refId": + if (value.ValueKind == JsonValueKind.String) + { + CheckPortableValue(name, value.GetString(), diagnostics); + } + break; + case "href": + if (value.ValueKind == JsonValueKind.String && + value.GetString() is { } href) + { + int marker = href.IndexOf("?id=", StringComparison.Ordinal); + if (marker >= 0) + { + CheckPortableValue( + "href ?id=", href.Substring(marker + 4), diagnostics); + } + } + break; + } + } + + private static void CheckPortableValue( + string term, + string? value, + List diagnostics) + { + if (string.IsNullOrEmpty(value)) + { + return; + } + if (!IsNodeId(value!)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ValidationError, + $"The NodeId-valued term {term} uses '{value}', which is not " + + "an ExpandedNodeId.", + new WotLocation(reference: value))); + return; + } + int marker = value!.IndexOf("ns=", StringComparison.Ordinal); + if (marker >= 0 && + marker + 3 < value.Length && + char.IsDigit(value[marker + 3]) && + (marker == 0 || value[marker - 1] is ';' or '=')) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.NonPortableIdentity, + $"The portable identity term {term} uses the session-local " + + $"ns= form ('{value}'); a persisted document shall use an " + + "ExpandedNodeId (nsu=;... or namespace-0 i=...) " + + "so it survives a namespace-table reordering (WoT Binding Section 5.1.1).", + new WotLocation(reference: value))); + } + } + + private static void ValidateModelConceptNames( + WotDocument document, + List diagnostics) + { + ValidateModelConceptNames( + document, + document.RootElement, + diagnostics); + } + + private static void ValidateModelConceptNames( + WotDocument document, + JsonElement element, + List diagnostics) + { + if (element.ValueKind == JsonValueKind.Object) + { + ValidateReferenceTypeRelation(document, element, diagnostics); + ValidateModelConceptMember( + document, + element, + "uav:mapToTypeName", + requiredDefinitiveMember: "uav:mapToType", + diagnostics); + ValidateModelConceptMember( + document, + element, + "uav:congruentTypeName", + requiredDefinitiveMember: "uav:congruentType", + diagnostics); + foreach (JsonProperty member in element.EnumerateObject()) + { + if (member.Name is not ("uav:nodeSet" or "uav:nodes")) + { + ValidateModelConceptNames( + document, + member.Value, + diagnostics); + } + } + } + else if (element.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement item in element.EnumerateArray()) + { + ValidateModelConceptNames(document, item, diagnostics); + } + } + } + + private static void ValidateModelConceptMember( + WotDocument document, + JsonElement element, + string memberName, + string? requiredDefinitiveMember, + List diagnostics) + { + if (!element.TryGetProperty(memberName, out JsonElement member)) + { + return; + } + string? value = member.ValueKind == JsonValueKind.String + ? member.GetString() + : null; + if (value is null || + !TrySplitCompactModelName( + value, + out string prefix, + out _) || + !TryGetContextNamespace(document, prefix, out _)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptUnresolved, + $"The {memberName} value '{value}' is not a compact model name " + + "whose non-numeric prefix is bound in @context.", + new WotLocation(reference: value))); + } + if (requiredDefinitiveMember is not null && + !element.TryGetProperty(requiredDefinitiveMember, out _)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptUnresolved, + $"{memberName} requires {requiredDefinitiveMember}.", + new WotLocation(reference: value))); + } + } + + private static void ValidateReferenceTypeRelation( + WotDocument document, + JsonElement element, + List diagnostics) + { + string? rel = GetElementString(element, "rel"); + if (rel is null) + { + return; + } + if (IsKnownBindingRelation(rel) || + rel.StartsWith("http:", StringComparison.Ordinal) || + rel.StartsWith("https:", StringComparison.Ordinal) || + rel.StartsWith("urn:", StringComparison.Ordinal)) + { + return; + } + if (!TrySplitCompactModelName( + rel, + out string prefix, + out _) || + prefix == "tm") + { + return; + } + if (prefix == "uav") + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptUnresolved, + $"The Binding relation '{rel}' is not defined.", + new WotLocation(reference: rel))); + return; + } + if (IsExternalRelationPrefix(prefix) || + !IsModelConceptCandidate(element, prefix)) + { + return; + } + if (!TryGetContextNamespace(document, prefix, out _)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ModelConceptUnresolved, + $"The ReferenceType relation '{rel}' uses a prefix that is " + + "not bound in @context.", + new WotLocation(reference: rel))); + } + } + + /// + /// Event-annotation consistency (WoT Binding Section 5.2): an event + /// affordance annotated @type: uav:eventType shall not set + /// uav:isEvent: false; the two forms record the same fact. + /// + private static void ValidateEventAnnotations( + WotDocument document, + List diagnostics) + { + foreach (KeyValuePair affordance in document.Events) + { + JsonElement node = affordance.Value; + if (node.ValueKind != JsonValueKind.Object || !HasEventTypeType(node)) + { + continue; + } + if (node.TryGetProperty("uav:isEvent", out JsonElement isEvent) && + isEvent.ValueKind == JsonValueKind.False) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.EventAnnotationConflict, + $"The event affordance '{affordance.Key}' is annotated " + + "@type uav:eventType but sets uav:isEvent: false; the two " + + "forms record the same EventType projection (WoT Binding Section 5.2).", + WotLocation.FromPointer("/events/" + affordance.Key))); + } + } + } + + private static bool HasEventTypeType(JsonElement node) + { + if (!node.TryGetProperty("@type", out JsonElement type)) + { + return false; + } + if (type.ValueKind == JsonValueKind.String) + { + return string.Equals( + type.GetString(), WotVocabulary.EventTypeAnnotation, StringComparison.Ordinal); + } + if (type.ValueKind == JsonValueKind.Array) + { + foreach (JsonElement token in type.EnumerateArray()) + { + if (token.ValueKind == JsonValueKind.String && + string.Equals( + token.GetString(), WotVocabulary.EventTypeAnnotation, StringComparison.Ordinal)) + { + return true; + } + } + } + return false; + } + + private static string DeriveModelUri(WotDocument document) + { + string? uavId = GetUavString(document, "id"); + if (uavId is not null) + { + const string marker = "nsu="; + if (uavId.StartsWith(marker, StringComparison.Ordinal)) + { + int semicolon = uavId.IndexOf(';', marker.Length); + string ns = semicolon < 0 + ? uavId.Substring(marker.Length) + : uavId.Substring(marker.Length, semicolon - marker.Length); + if (ns.Length > 0) + { + return ns; + } + } + } + string? id = document.Id; + if (!string.IsNullOrEmpty(id)) + { + return id!; + } + return "urn:opcua:wot:synthesized"; + } + + private static string? MapDataTypeToJson(string? dataType) + { + if (dataType is not null && + s_dataTypeToJsonType.TryGetValue(dataType, out string? jsonType)) + { + return jsonType; + } + return null; + } + + private static string MapJsonSchemaToDataType(JsonElement schema) + { + return WotVocabulary.MapJsonTypeToDataType(GetElementString(schema, "type")); + } + + private static uint MapAccessLevel(JsonElement schema) + { + bool readOnly = GetElementBool(schema, "readOnly"); + bool writeOnly = GetElementBool(schema, "writeOnly"); + uint access = 0; + if (!writeOnly) + { + access |= AccessLevelCurrentRead; + } + if (!readOnly) + { + access |= AccessLevelCurrentWrite; + } + return access == 0 ? AccessLevelCurrentRead : access; + } + + private static string UniqueKey(string? candidate, HashSet used) + { + string key = string.IsNullOrEmpty(candidate) ? "member" : candidate!; + if (used.Add(key)) + { + return key; + } + int suffix = 2; + string unique = key + "_" + suffix.ToString(System.Globalization.CultureInfo.InvariantCulture); + while (!used.Add(unique)) + { + suffix++; + unique = key + "_" + suffix.ToString(System.Globalization.CultureInfo.InvariantCulture); + } + return unique; + } + + private static string? LocalName(string? browseName) + { + if (string.IsNullOrEmpty(browseName)) + { + return null; + } + if (browseName!.StartsWith("nsu=", StringComparison.Ordinal)) + { + int delimiter = -1; + for (int ii = 4; ii < browseName.Length; ii++) + { + if (browseName[ii] == ';') + { + delimiter = ii; + break; + } + } + return delimiter >= 0 && delimiter + 1 < browseName.Length + ? browseName.Substring(delimiter + 1) + : null; + } + int colon = browseName!.IndexOf(':', StringComparison.Ordinal); + return colon >= 0 && colon + 1 < browseName.Length + ? browseName.Substring(colon + 1) + : browseName; + } + + private static string? SanitizeName(string? title) + { + if (string.IsNullOrEmpty(title)) + { + return null; + } + var builder = new System.Text.StringBuilder(title!.Length); + foreach (char character in title!) + { + if (char.IsLetterOrDigit(character) || character is '_' or '-') + { + builder.Append(character); + } + } + return builder.Length == 0 ? null : builder.ToString(); + } + + private static Opc.Ua.Export.LocalizedText[] MakeText(string value) + { + return [new Opc.Ua.Export.LocalizedText { Value = value }]; + } + + private static string? FirstText(Opc.Ua.Export.LocalizedText[]? texts) + { + if (texts is null) + { + return null; + } + foreach (Opc.Ua.Export.LocalizedText text in texts) + { + if (!string.IsNullOrEmpty(text.Value)) + { + return text.Value; + } + } + return null; + } + + private static void WriteOptional(Utf8JsonWriter writer, string name, string? value) + { + if (!string.IsNullOrEmpty(value)) + { + writer.WriteString(name, value); + } + } + + private static string? GetUavString(WotDocument document, string localName) + { + return document.TryGetUav(localName, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private static string? GetRootString(WotDocument document, string name) + { + JsonElement root = document.RootElement; + return root.ValueKind == JsonValueKind.Object && + root.TryGetProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private static string? GetElementString(JsonElement element, string name) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private static bool GetElementBool(JsonElement element, string name) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(name, out JsonElement value) && + value.ValueKind == JsonValueKind.True; + } + } +} diff --git a/src/Opc.Ua.Types/Wot/WotNodeSetConverter.cs b/src/Opc.Ua.Types/Wot/WotNodeSetConverter.cs new file mode 100644 index 0000000000..38ebd1428c --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotNodeSetConverter.cs @@ -0,0 +1,820 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Security.Cryptography; +using System.Threading; +using System.Threading.Tasks; +using System.Text.Json; +using Opc.Ua.Export; + +namespace Opc.Ua.Wot +{ + /// + /// Converts OPC UA NodeSet2 documents to and from WoT Thing Models and + /// Thing Descriptions. The default output uses the semantic/readable + /// mapping of the OPC UA WoT Binding and adds the schema-complete, + /// deterministic uav:nodes projection only when needed; the byte-exact + /// uav:nodeSet envelope is an explicit or last-resort fallback. + /// + public static partial class WotNodeSetConverter + { + /// + /// OPC UA WoT Binding vocabulary namespace. + /// + public const string VocabularyNamespace = WotVocabulary.VocabularyNamespace; + + /// + /// Creates a deterministic WoT Thing Model/Thing Description with + /// readable affordances and an exceptional complete + /// uav:nodes projection when required. The preservation envelope is governed by + /// . + /// + /// The NodeSet2 document to convert. + /// An optional document title. + /// Resource limits; defaults are used when omitted. + /// The generated, byte-preserving WoT document. + public static WotDocument FromNodeSet( + UANodeSet nodeSet, + string? title = null, + WotNodeSetConverterOptions? options = null) + { + WotConversionResult result = FromNodeSetResult(nodeSet, title, options); + ThrowIfErrors(result.Diagnostics); + return result.Value + ?? throw new FormatException("The NodeSet could not be converted to a WoT document."); + } + + /// + /// Creates a WoT document from a NodeSet2 document, returning structured + /// diagnostics together with the result. + /// + /// The NodeSet2 document to convert. + /// An optional document title. + /// Resource limits; defaults are used when omitted. + /// The conversion result and its diagnostics. + [SuppressMessage( + "Reliability", + "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the returned WotDocument is transferred to the caller through the result.")] + public static WotConversionResult FromNodeSetResult( + UANodeSet nodeSet, + string? title = null, + WotNodeSetConverterOptions? options = null) + { + if (nodeSet is null) + { + throw new ArgumentNullException(nameof(nodeSet)); + } + options ??= new WotNodeSetConverterOptions(); + options.Validate(); + + var diagnostics = new List(); + + byte[] nodeSetBytes; + using (var nodeSetStream = new MemoryStream()) + { + nodeSet.Write(nodeSetStream); + if (nodeSetStream.Length > options.MaxNodeSetSize) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NodeSetTooLarge, + $"NodeSet exceeds the configured {options.MaxNodeSetSize} byte limit.")); + return new WotConversionResult(null, diagnostics); + } + nodeSetBytes = nodeSetStream.ToArray(); + } + + UANode? root = SelectRootNode(nodeSet); + string resolvedTitle = title + ?? FirstText(root?.DisplayName) + ?? (nodeSet.Models is { Length: > 0 } && + !string.IsNullOrEmpty(nodeSet.Models[0].ModelUri) + ? nodeSet.Models[0].ModelUri! + : "OPC UA NodeSet"); + + byte[] digest = ComputeSha256(nodeSetBytes); + var nativeDiagnostics = new List(); + byte[] nativeProjection = WotNativeProjection.Write( + nodeSet, + options, + nativeDiagnostics); + bool nativeComplete = false; + string? nativeDifference = null; + if (!HasErrors(nativeDiagnostics)) + { + using JsonDocument nativeDocument = JsonDocument.Parse(nativeProjection); + var reconstructionDiagnostics = new List(); + UANodeSet? reconstructed = WotNativeProjection.Read( + nativeDocument.RootElement, + options, + reconstructionDiagnostics); + if (reconstructed is not null && !HasErrors(reconstructionDiagnostics)) + { + NodeSetComparisonResult comparison = + NodeSetComparer.Compare(nodeSet, reconstructed, options); + nativeComplete = comparison.AreEquivalent; + if (!nativeComplete && comparison.Differences.Count > 0) + { + nativeDifference = comparison.Differences[0]; + } + } + else + { + nativeDifference = FirstDiagnosticMessage(reconstructionDiagnostics); + } + } + else + { + nativeDifference = FirstDiagnosticMessage(nativeDiagnostics); + } + + bool emitEnvelope = options.PreservationMode == + WotNodeSetPreservationMode.Always; + if (!nativeComplete) + { + string reason = nativeDifference ?? + "The structured native projection did not reproduce the source NodeSet."; + if (options.PreservationMode == WotNodeSetPreservationMode.Never) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionIncomplete, + reason)); + return new WotConversionResult(null, diagnostics); + } + emitEnvelope = true; + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Warning, + WotDiagnosticCode.NativeProjectionIncomplete, + reason + " The uav:nodeSet fallback was emitted.")); + } + + byte[] json; + using (var output = new MemoryStream()) + { + using (var writer = new Utf8JsonWriter( + output, + new JsonWriterOptions { Indented = true, SkipValidation = false })) + { + writer.WriteStartObject(); + WriteContext(writer, nodeSet); + bool rootIsEventType = IsEventTypeRoot(root, nodeSet); + WriteRootType(writer, root, rootIsEventType); + writer.WriteString("title", resolvedTitle); + if (!string.IsNullOrEmpty(root?.BrowseName)) + { + writer.WriteString( + "uav:browseName", + ToPortableQualifiedName( + root!.BrowseName, + nodeSet.NamespaceUris)); + } + if (!string.IsNullOrEmpty(root?.NodeId)) + { + string? portableId = ToPortableNodeId(root!.NodeId, nodeSet.NamespaceUris); + if (!string.IsNullOrEmpty(portableId)) + { + writer.WriteString("uav:id", portableId); + } + } + if (rootIsEventType) + { + writer.WriteBoolean("uav:isEvent", true); + } + WriteDescription(writer, root?.Description); + WriteAffordances(writer, nodeSet, root, diagnostics, options); + + if (emitEnvelope) + { + writer.WritePropertyName("uav:nodeSet"); + writer.WriteStartObject(); + writer.WriteString("@type", WotVocabulary.EnvelopeType); + writer.WriteString("contentType", WotVocabulary.NodeSetContentType); + writer.WriteString("encoding", WotVocabulary.Base64Encoding); + writer.WriteString("sha256", ToLowerHex(digest)); + writer.WriteString("data", System.Convert.ToBase64String(nodeSetBytes)); + writer.WriteString("profileVersion", WotVocabulary.ProfileVersion); + writer.WriteEndObject(); + } + + writer.WritePropertyName("uav:nodes"); + using (JsonDocument nativeDocument = JsonDocument.Parse(nativeProjection)) + { + nativeDocument.RootElement.WriteTo(writer); + } + + writer.WriteEndObject(); + } + json = output.ToArray(); + } + + json = WotJsonResidue.Apply(json, nodeSet, options, diagnostics); + if (IsReadableMappingComplete(json, nodeSet, options)) + { + json = RemoveRootMembers(json, options, "uav:nodes"); + } + if (json.Length > options.MaxJsonDocumentSize) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.JsonDocumentTooLarge, + $"Generated WoT document exceeds the configured " + + $"{options.MaxJsonDocumentSize} byte limit.")); + return new WotConversionResult(null, diagnostics); + } + WotDocument document = WotDocument.FromOwnedBytes(json, options); + return new WotConversionResult(document, diagnostics); + } + + private static bool IsReadableMappingComplete( + byte[] json, + UANodeSet source, + WotNodeSetConverterOptions options) + { + byte[] readable = RemoveRootMembers( + json, + options, + "uav:nodes", + "uav:nodeSet"); + using WotDocument document = WotDocument.Parse(readable, options); + WotConversionResult result = + ToNodeSetResult(document, options); + return result.Success && + NodeSetComparer.Compare(source, result.Value!, options).AreEquivalent; + } + + private static byte[] RemoveRootMembers( + byte[] json, + WotNodeSetConverterOptions options, + params string[] names) + { + using WotDocument document = WotDocument.Parse(json, options); + var excluded = new HashSet(names, StringComparer.Ordinal); + using var output = new MemoryStream(); + using (var writer = new Utf8JsonWriter( + output, + new JsonWriterOptions { Indented = true, SkipValidation = false })) + { + writer.WriteStartObject(); + foreach (JsonProperty member in document.RootElement.EnumerateObject()) + { + if (!excluded.Contains(member.Name)) + { + writer.WritePropertyName(member.Name); + member.Value.WriteTo(writer); + } + } + writer.WriteEndObject(); + } + return output.ToArray(); + } + + /// + /// Restores or synthesizes the NodeSet2 document described by a WoT + /// document, throwing on any error diagnostic. + /// + /// The WoT document. + /// Resource limits; defaults are used when omitted. + /// The restored or synthesized NodeSet2 document. + /// Thrown when the conversion fails. + public static UANodeSet ToNodeSet( + WotDocument document, + WotNodeSetConverterOptions? options = null) + { + if (document is null) + { + throw new ArgumentNullException(nameof(document)); + } + + var diagnostics = new List(); + UANodeSet? nodeSet = ToNodeSetCore(document, options, null, null, diagnostics); + ThrowIfErrors(diagnostics); + return nodeSet + ?? throw new FormatException("The WoT document could not be converted to a NodeSet."); + } + + /// + /// Parses and restores or synthesizes a NodeSet2 document from UTF-8 WoT + /// JSON, throwing on any error diagnostic. + /// + /// The UTF-8 encoded WoT document. + /// Resource limits; defaults are used when omitted. + /// The restored or synthesized NodeSet2 document. + public static UANodeSet ToNodeSet( + ReadOnlyMemory utf8Json, + WotNodeSetConverterOptions? options = null) + { + using WotDocument document = WotDocument.Parse(utf8Json, options); + return ToNodeSet(document, options); + } + + /// + /// Selects the root node of a projected NodeSet2 - the ObjectType or + /// VariableType a Thing Model materializes, or the top-level Object a + /// Thing Description projects - and returns it as an absolute + /// whose + /// is resolved from the NodeSet's own namespace table. Returns + /// ExpandedNodeId.Null when the NodeSet carries no nodes or the + /// root NodeId cannot be parsed. + /// + /// The projected NodeSet2 document. + /// + /// The root node as an absolute ExpandedNodeId, or + /// ExpandedNodeId.Null when the NodeSet has no identifiable root. + /// + /// + /// Thrown when is null. + /// + public static ExpandedNodeId TrySelectProjectionRoot(UANodeSet nodeSet) + { + if (nodeSet is null) + { + throw new ArgumentNullException(nameof(nodeSet)); + } + UANode? root = SelectRootNode(nodeSet); + if (root?.NodeId is not { Length: > 0 } rawNodeId) + { + return ExpandedNodeId.Null; + } + NodeId parsed; + try + { + parsed = NodeId.Parse(rawNodeId); + } + catch (ServiceResultException) + { + return ExpandedNodeId.Null; + } + ushort localIndex = parsed.NamespaceIndex; + string namespaceUri; + if (localIndex == 0) + { + namespaceUri = Opc.Ua.Types.Namespaces.OpcUa; + } + else if (nodeSet.NamespaceUris is { Length: > 0 } uris && + localIndex - 1 < uris.Length) + { + namespaceUri = uris[localIndex - 1]; + } + else + { + return ExpandedNodeId.Null; + } + return new ExpandedNodeId(parsed, namespaceUri); + } + + /// + /// Restores or synthesizes the NodeSet2 document described by a WoT + /// document, returning structured diagnostics together with the result. + /// + /// The WoT document. + /// Resource limits; defaults are used when omitted. + /// An optional resolver for referenced TD/TM documents. + /// An optional resolution context for cycle and limit tracking. + /// A token that cancels asynchronous resolution. + /// The conversion result and its diagnostics. + public static async ValueTask> ToNodeSetResultAsync( + WotDocument document, + WotNodeSetConverterOptions? options = null, + IWotThingResolver? thingResolver = null, + WotResolutionContext? resolutionContext = null, + CancellationToken cancellationToken = default) + { + if (document is null) + { + throw new ArgumentNullException(nameof(document)); + } + var diagnostics = new List(); + WotThingCatalog? thingCatalog = null; + if (thingResolver is not null) + { + options ??= new WotNodeSetConverterOptions(); + options.Validate(); + resolutionContext ??= new WotResolutionContext(options.ToResolverOptions()); + thingCatalog = new WotThingCatalog(); + await PreresolveThingReferencesAsync( + document, + options, + thingResolver, + resolutionContext, + thingCatalog, + diagnostics, + cancellationToken).ConfigureAwait(false); + } + UANodeSet? nodeSet = ToNodeSetCore( + document, options, thingCatalog, resolutionContext, diagnostics); + return new WotConversionResult(nodeSet, diagnostics); + } + + /// + /// Restores or synthesizes the NodeSet2 document described by a WoT + /// document, returning structured diagnostics together with the result. + /// + /// The WoT document. + /// Resource limits; defaults are used when omitted. + /// The conversion result and its diagnostics. + public static WotConversionResult ToNodeSetResult( + WotDocument document, + WotNodeSetConverterOptions? options = null) + { + if (document is null) + { + throw new ArgumentNullException(nameof(document)); + } + var diagnostics = new List(); + UANodeSet? nodeSet = ToNodeSetCore( + document, options, null, null, diagnostics); + return new WotConversionResult(nodeSet, diagnostics); + } + + private static UANodeSet? ToNodeSetCore( + WotDocument document, + WotNodeSetConverterOptions? options, + WotThingCatalog? thingCatalog, + WotResolutionContext? resolutionContext, + List diagnostics) + { + options ??= new WotNodeSetConverterOptions(); + options.Validate(); + + // Exactly one resolution context is created per top-level + // conversion, seeded from the converter options, and threaded + // through every context/schema/thing/link resolution below. It + // must never be re-created per link so that depth, document + // count, cycle and cumulative byte bounds apply across the whole + // conversion rather than resetting for each resolved reference. + resolutionContext ??= new WotResolutionContext(options.ToResolverOptions()); + + if (document.TryGetEnvelope(out JsonElement envelope)) + { + UANodeSet? restored = RestoreFromEnvelope(envelope, options, diagnostics); + if (restored is null) + { + return null; + } + if (document.TryGetNativeProjection(out JsonElement projection)) + { + ValidateNativeConsistency(restored, projection, options, diagnostics); + } + WotJsonResidue.Replace(restored, document, options, diagnostics); + return restored; + } + + if (document.TryGetNativeProjection(out JsonElement nativeProjection)) + { + UANodeSet? restored = WotNativeProjection.Read( + nativeProjection, + options, + diagnostics); + if (restored is not null) + { + WotJsonResidue.Replace(restored, document, options, diagnostics); + } + return restored; + } + + UANodeSet? synthesized = + Synthesize(document, options, thingCatalog, resolutionContext, diagnostics); + if (synthesized is not null) + { + WotJsonResidue.Replace(synthesized, document, options, diagnostics); + } + return synthesized; + } + + private static UANodeSet? RestoreFromEnvelope( + JsonElement envelope, + WotNodeSetConverterOptions options, + List diagnostics) + { + var location = new WotLocation(jsonPointer: "/uav:nodeSet"); + + if (!TryGetString(envelope, "contentType", out string? contentType) || + !string.Equals(contentType, WotVocabulary.NodeSetContentType, StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.UnsupportedContentType, + $"Unsupported NodeSet content type '{contentType}'.", + location)); + return null; + } + + if (!TryGetString(envelope, "encoding", out string? encoding) || + !string.Equals(encoding, WotVocabulary.Base64Encoding, StringComparison.Ordinal)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.UnsupportedEncoding, + $"Unsupported NodeSet encoding '{encoding}'.", + location)); + return null; + } + + if (!TryGetString(envelope, "data", out string? data) || data is null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.EnvelopeInvalid, + "The uav:nodeSet data value is required and must be a string.", + location)); + return null; + } + + byte[] nodeSetBytes; + try + { + nodeSetBytes = System.Convert.FromBase64String(data); + } + catch (FormatException) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.InvalidBase64, + "The uav:nodeSet data is not valid base64.", + location)); + return null; + } + + if (nodeSetBytes.Length > options.MaxNodeSetSize) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NodeSetTooLarge, + $"Decoded NodeSet exceeds the configured {options.MaxNodeSetSize} byte limit.", + location)); + return null; + } + + // uav:nodeSet.sha256 is mandatory: a preservation envelope without + // an integrity digest cannot be trusted and must not yield a + // NodeSet, regardless of whether the payload otherwise parses. + if (!envelope.TryGetProperty("sha256", out JsonElement digestElement) || + digestElement.ValueKind != JsonValueKind.String) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.InvalidDigest, + "The uav:nodeSet sha256 value is required and must be a string.", + location)); + return null; + } + + if (!TryParseDigest(digestElement.GetString()!, out byte[] expected)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.InvalidDigest, + "The uav:nodeSet sha256 value is not a valid SHA-256 digest.", + location)); + return null; + } + + byte[] actual = ComputeSha256(nodeSetBytes); + if (!FixedEquals(expected, actual)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.DigestMismatch, + "The uav:nodeSet digest does not match the payload.", + location)); + return null; + } + + UANodeSet? nodeSet; + try + { + using (var stream = new MemoryStream(nodeSetBytes, writable: false)) + { + nodeSet = UANodeSet.Read(stream); + } + } + catch (Exception ex) when ( + ex is InvalidOperationException or + System.Xml.XmlException or + FormatException) + { + // XmlSerializer wraps parse failures in InvalidOperationException; + // treat any deserialization failure as a structured diagnostic + // rather than letting the exception escape the converter. + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.MalformedNodeSet, + $"The uav:nodeSet payload is not a valid NodeSet2 document: {ex.Message}", + location)); + return null; + } + if (nodeSet is null) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.MalformedNodeSet, + "The uav:nodeSet payload is not a valid NodeSet2 document.", + location)); + } + return nodeSet; + } + + private static void ValidateNativeConsistency( + UANodeSet baseline, + JsonElement projection, + WotNodeSetConverterOptions options, + List diagnostics) + { + var nativeDiagnostics = new List(); + UANodeSet? projected = WotNativeProjection.Read( + projection, + options, + nativeDiagnostics); + if (projected is null || HasErrors(nativeDiagnostics)) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionConflict, + FirstDiagnosticMessage(nativeDiagnostics) ?? + "The native projection could not be reconstructed.")); + return; + } + + NodeSetComparisonResult comparison = + NodeSetComparer.Compare(baseline, projected, options); + if (!comparison.AreEquivalent) + { + diagnostics.Add(new WotDiagnostic( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.NativeProjectionConflict, + comparison.Differences.Count > 0 + ? comparison.Differences[0] + : "The native projection conflicts with the preservation baseline.")); + } + } + + private static bool HasErrors(List diagnostics) + { + for (int ii = 0; ii < diagnostics.Count; ii++) + { + if (diagnostics[ii].Severity == WotDiagnosticSeverity.Error) + { + return true; + } + } + return false; + } + + private static string? FirstDiagnosticMessage( + List diagnostics) + { + return diagnostics.Count > 0 ? diagnostics[0].Message : null; + } + + private static string? GetBaselineModellingRule(UANode node) + { + if (node.References is null) + { + return null; + } + foreach (Reference reference in node.References) + { + if (string.Equals(reference.ReferenceType, "HasModellingRule", StringComparison.Ordinal) && + reference.IsForward && + reference.Value is not null && + WotVocabulary.TryGetModellingRuleName(reference.Value, out string rule)) + { + return rule; + } + } + return null; + } + + private static void ThrowIfErrors(IReadOnlyList diagnostics) + { + for (int ii = 0; ii < diagnostics.Count; ii++) + { + if (diagnostics[ii].Severity == WotDiagnosticSeverity.Error) + { + throw new FormatException(diagnostics[ii].ToString()); + } + } + } + + private static bool TryGetString(JsonElement element, string name, out string? value) + { + if (element.TryGetProperty(name, out JsonElement property) && + property.ValueKind == JsonValueKind.String) + { + value = property.GetString(); + return true; + } + value = null; + return false; + } + + private static byte[] ComputeSha256(byte[] data) + { +#if NET6_0_OR_GREATER + return SHA256.HashData(data); +#else + using SHA256 sha256 = SHA256.Create(); + return sha256.ComputeHash(data); +#endif + } + + private static string ToLowerHex(byte[] data) + { + const string digits = "0123456789abcdef"; + var chars = new char[data.Length * 2]; + for (int ii = 0; ii < data.Length; ii++) + { + chars[ii * 2] = digits[data[ii] >> 4]; + chars[(ii * 2) + 1] = digits[data[ii] & 0x0F]; + } + return new string(chars); + } + + private static bool TryParseDigest(string text, out byte[] digest) + { + string trimmed = text.Trim(); + if (trimmed.Length == 64 && IsHex(trimmed)) + { + digest = CoreUtils.FromHexString(trimmed); + return true; + } + try + { + byte[] decoded = System.Convert.FromBase64String(trimmed); + if (decoded.Length == 32) + { + digest = decoded; + return true; + } + } + catch (FormatException) + { + // Not base64; fall through. + } + digest = []; + return false; + } + + private static bool IsHex(string text) + { + foreach (char character in text) + { + bool isHex = (character >= '0' && character <= '9') || + (character >= 'a' && character <= 'f') || + (character >= 'A' && character <= 'F'); + if (!isHex) + { + return false; + } + } + return true; + } + + private static bool FixedEquals(byte[] left, byte[] right) + { + if (left.Length != right.Length) + { + return false; + } + int difference = 0; + for (int ii = 0; ii < left.Length; ii++) + { + difference |= left[ii] ^ right[ii]; + } + return difference == 0; + } + } +} diff --git a/src/Opc.Ua.Types/Wot/WotNodeSetConverterOptions.cs b/src/Opc.Ua.Types/Wot/WotNodeSetConverterOptions.cs new file mode 100644 index 0000000000..d0a114f1a3 --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotNodeSetConverterOptions.cs @@ -0,0 +1,198 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.Wot +{ + /// + /// Controls whether a converter emits the opaque byte-exact + /// uav:nodeSet preservation envelope. + /// + public enum WotNodeSetPreservationMode + { + /// + /// Emit the envelope only if the structured native projection cannot + /// reproduce the source NodeSet. + /// + WhenRequired, + + /// Always emit the byte-exact preservation envelope. + Always, + + /// + /// Never emit the envelope; report an error if native projection is not + /// complete. This mode is intended for conformance and completeness tests. + /// + Never + } + + /// + /// Resource limits and behavioural switches used while reading and + /// writing WoT documents, preservation envelopes and NodeSet2 payloads. + /// + /// + /// All limits are enforced deliberately so that a malformed or hostile + /// document cannot exhaust memory or stack. The defaults are generous + /// enough for real companion specifications yet bounded. + /// + public sealed class WotNodeSetConverterOptions + { + /// + /// Gets or sets the preservation-envelope policy. The default uses + /// readable mapping plus structured fallback and emits an opaque envelope + /// only when required. + /// + public WotNodeSetPreservationMode PreservationMode { get; set; } = + WotNodeSetPreservationMode.WhenRequired; + + /// + /// Gets or sets the maximum accepted WoT JSON document size in bytes. + /// + public int MaxJsonDocumentSize { get; set; } = 16 * 1024 * 1024; + + /// + /// Gets or sets the maximum accepted or decoded NodeSet2 XML size in bytes. + /// + public int MaxNodeSetSize { get; set; } = 64 * 1024 * 1024; + + /// + /// Gets or sets the maximum JSON nesting depth. + /// + public int MaxJsonDepth { get; set; } = 128; + + /// + /// Gets or sets the maximum XML nesting depth accepted when reading a + /// decoded or synthesized NodeSet2 document. + /// + public int MaxXmlDepth { get; set; } = 256; + + /// + /// Gets or sets the maximum number of UANode records projected into or + /// reconstructed from a native uav:nodes projection. + /// + public int MaxNodeCount { get; set; } = 1_000_000; + + /// + /// Gets or sets the maximum number of affordances (properties, actions + /// and events combined) processed for a single Thing. + /// + public int MaxAffordanceCount { get; set; } = 100_000; + + /// + /// Gets or sets the maximum external-document resolution depth used + /// when following contexts, schemas and referenced TD/TM documents. + /// + public int MaxResolverDepth { get; set; } = 16; + + /// + /// Gets or sets the maximum number of external documents (contexts, + /// schemas and referenced TD/TM documents combined) resolved for a + /// single top-level conversion. + /// + public int MaxResolverDocuments { get; set; } = 256; + + /// + /// Gets or sets the maximum accepted size of a single externally + /// resolved document. + /// + public int MaxResolverDocumentBytes { get; set; } = 16 * 1024 * 1024; + + /// + /// Gets or sets the maximum cumulative size of all documents + /// externally resolved for a single top-level conversion. + /// + public long MaxResolverTotalBytes { get; set; } = 128L * 1024 * 1024; + + /// + /// Validates the option values and throws when a limit is not positive. + /// + /// + /// Thrown when any configured limit is not strictly positive. + /// + public void Validate() + { + if (PreservationMode is not ( + WotNodeSetPreservationMode.WhenRequired or + WotNodeSetPreservationMode.Always or + WotNodeSetPreservationMode.Never)) + { + throw new ArgumentOutOfRangeException( + nameof(PreservationMode), + PreservationMode, + "The preservation mode is not defined."); + } + EnsurePositive(MaxJsonDocumentSize, nameof(MaxJsonDocumentSize)); + EnsurePositive(MaxNodeSetSize, nameof(MaxNodeSetSize)); + EnsurePositive(MaxJsonDepth, nameof(MaxJsonDepth)); + EnsurePositive(MaxXmlDepth, nameof(MaxXmlDepth)); + EnsurePositive(MaxNodeCount, nameof(MaxNodeCount)); + EnsurePositive(MaxAffordanceCount, nameof(MaxAffordanceCount)); + EnsurePositive(MaxResolverDepth, nameof(MaxResolverDepth)); + EnsurePositive(MaxResolverDocuments, nameof(MaxResolverDocuments)); + EnsurePositive(MaxResolverDocumentBytes, nameof(MaxResolverDocumentBytes)); + if (MaxResolverTotalBytes <= 0) + { + throw new ArgumentOutOfRangeException( + nameof(MaxResolverTotalBytes), + MaxResolverTotalBytes, + "The configured limit must be a positive value."); + } + } + + /// + /// Projects the aggregate resolver limits configured on this instance + /// onto a suitable for seeding a + /// single per top-level conversion. + /// + /// The equivalent bounded resolution options. + public WotResolverOptions ToResolverOptions() + { + return new WotResolverOptions + { + MaxDepth = MaxResolverDepth, + MaxDocuments = MaxResolverDocuments, + MaxDocumentBytes = MaxResolverDocumentBytes, + MaxTotalBytes = MaxResolverTotalBytes + }; + } + + private static void EnsurePositive(int value, string name) + { + if (value <= 0) + { + throw new ArgumentOutOfRangeException( + name, + value, + "The configured limit must be a positive value."); + } + } + } +} diff --git a/src/Opc.Ua.Types/Wot/WotResolver.cs b/src/Opc.Ua.Types/Wot/WotResolver.cs new file mode 100644 index 0000000000..eb2c5a3adb --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotResolver.cs @@ -0,0 +1,440 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.Wot +{ + /// + /// The kind of external document being resolved. + /// + public enum WotResolutionKind + { + /// + /// A JSON-LD @context document. + /// + Context, + + /// + /// An external DataSchema referenced by uav:externalSchema. + /// + Schema, + + /// + /// A referenced Thing Description or Thing Model document. + /// + Thing + } + + /// + /// Bounded options that govern external document resolution. + /// + public sealed class WotResolverOptions + { + /// + /// Gets or sets the maximum resolution depth. + /// + public int MaxDepth { get; set; } = 16; + + /// + /// Gets or sets the maximum number of documents resolved. + /// + public int MaxDocuments { get; set; } = 256; + + /// + /// Gets or sets the maximum accepted size of a single resolved document. + /// + public int MaxDocumentBytes { get; set; } = 16 * 1024 * 1024; + + /// + /// Gets or sets the maximum total size of all resolved documents. + /// + public long MaxTotalBytes { get; set; } = 128L * 1024 * 1024; + + /// + /// Validates the option values and throws when a limit is not positive. + /// + /// + /// Thrown when any configured limit is not strictly positive. + /// + public void Validate() + { + EnsurePositive(MaxDepth, nameof(MaxDepth)); + EnsurePositive(MaxDocuments, nameof(MaxDocuments)); + EnsurePositive(MaxDocumentBytes, nameof(MaxDocumentBytes)); + if (MaxTotalBytes <= 0) + { + throw new ArgumentOutOfRangeException( + nameof(MaxTotalBytes), + MaxTotalBytes, + "The configured limit must be a positive value."); + } + } + + private static void EnsurePositive(int value, string name) + { + if (value <= 0) + { + throw new ArgumentOutOfRangeException( + name, + value, + "The configured limit must be a positive value."); + } + } + } + + /// + /// The result of resolving one external document. + /// + public sealed class WotResolverResult + { + private WotResolverResult( + bool found, + ReadOnlyMemory content, + string? contentType) + { + Found = found; + Content = content; + ContentType = contentType; + } + + /// + /// Gets a value indicating whether the document was found. + /// + public bool Found { get; } + + /// + /// Gets the resolved UTF-8 document bytes. + /// + public ReadOnlyMemory Content { get; } + + /// + /// Gets the media type of the resolved document, if known. + /// + public string? ContentType { get; } + + /// + /// A shared result indicating the document was not found. + /// + public static WotResolverResult NotFound { get; } = + new WotResolverResult(false, ReadOnlyMemory.Empty, null); + + /// + /// Creates a successful result from resolved bytes. + /// + /// The resolved UTF-8 document bytes. + /// The media type of the document, if known. + public static WotResolverResult FromBytes( + ReadOnlyMemory content, + string? contentType = null) + { + return new WotResolverResult(true, content, contentType); + } + } + + /// + /// Resolves external JSON-LD @context documents. Implementations + /// supply their own transport; this library performs no network I/O. + /// + public interface IWotContextResolver + { + /// + /// Resolves a context document by reference. + /// + /// The context reference (absolute or relative IRI). + /// The active resolution context. + /// A token that cancels the resolution operation. + /// The resolution result. + ValueTask ResolveContextAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken); + } + + /// + /// Resolves external DataSchema documents referenced by an affordance. + /// Implementations supply their own transport; this library performs no + /// network I/O. + /// + public interface IWotSchemaResolver + { + /// + /// Resolves a schema document by reference. + /// + /// The schema reference (absolute or relative IRI or path). + /// The active resolution context. + /// A token that cancels the resolution operation. + /// The resolution result. + ValueTask ResolveSchemaAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken); + } + + /// + /// Resolves referenced Thing Description or Thing Model documents. + /// Implementations supply their own transport; this library performs no + /// network I/O. + /// + public interface IWotThingResolver + { + /// + /// Resolves a referenced TD/TM document by reference. + /// + /// The document reference (absolute or relative IRI). + /// The active resolution context. + /// A token that cancels the resolution operation. + /// The resolution result. + ValueTask ResolveThingAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken); + } + + /// + /// A resolver that never resolves anything. Use it as an explicit + /// "no external resolution" policy; it performs no I/O. + /// + public sealed class NullWotResolver + : IWotContextResolver, IWotSchemaResolver, IWotThingResolver + { + /// + /// The shared instance. + /// + public static NullWotResolver Instance { get; } = new NullWotResolver(); + + /// + public ValueTask ResolveContextAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken) + { + return new ValueTask(WotResolverResult.NotFound); + } + + /// + public ValueTask ResolveSchemaAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken) + { + return new ValueTask(WotResolverResult.NotFound); + } + + /// + public ValueTask ResolveThingAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken) + { + return new ValueTask(WotResolverResult.NotFound); + } + } + + /// + /// Tracks resolution depth, the set of documents currently being resolved + /// (for cycle detection) and cumulative resource usage. A context is + /// created per conversion and is not shared across threads. + /// + public sealed class WotResolutionContext + { + /// + /// Initializes a new instance of the class. + /// + /// The bounded resolution options. + public WotResolutionContext(WotResolverOptions? options = null) + { + Options = options ?? new WotResolverOptions(); + Options.Validate(); + m_active = new HashSet(StringComparer.Ordinal); + m_diagnostics = []; + } + + /// + /// Gets the bounded resolution options. + /// + public WotResolverOptions Options { get; } + + /// + /// Gets the current resolution depth. + /// + public int Depth => m_depth; + + /// + /// Gets the number of documents entered so far. + /// + public int DocumentCount => m_documentCount; + + /// + /// Gets the cumulative resolved byte count. + /// + public long TotalBytes => m_totalBytes; + + /// + /// Gets the diagnostics accumulated during resolution. + /// + public IReadOnlyList Diagnostics => m_diagnostics; + + /// + /// Attempts to begin resolving . On success + /// the reference is pushed and the caller must invoke + /// in a finally block. On failure a + /// diagnostic describing the cycle or limit is produced. + /// + /// The kind of document being resolved. + /// The document reference. + /// The blocking diagnostic when the method returns false. + /// true when resolution may proceed. + /// + public bool TryEnter( + WotResolutionKind kind, + string reference, + out WotDiagnostic? diagnostic) + { + if (reference is null) + { + throw new ArgumentNullException(nameof(reference)); + } + + var location = new WotLocation(reference: reference); + + if (m_active.Contains(reference)) + { + diagnostic = Add( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResolverCycle, + $"External {kind} resolution detected a cycle at '{reference}'.", + location); + return false; + } + + if (m_depth >= Options.MaxDepth) + { + diagnostic = Add( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResolverDepthExceeded, + $"External {kind} resolution exceeded the maximum depth of {Options.MaxDepth}.", + location); + return false; + } + + if (m_documentCount >= Options.MaxDocuments) + { + diagnostic = Add( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResolverLimitExceeded, + $"External resolution exceeded the maximum document count of {Options.MaxDocuments}.", + location); + return false; + } + + m_active.Add(reference); + m_depth++; + m_documentCount++; + diagnostic = null; + return true; + } + + /// + /// Ends resolving . Must be paired with a + /// successful . + /// + /// The document reference. + /// + public void Leave(string reference) + { + if (reference is null) + { + throw new ArgumentNullException(nameof(reference)); + } + if (m_active.Remove(reference)) + { + m_depth--; + } + } + + /// + /// Records that bytes were resolved and + /// verifies the per-document and cumulative byte limits. + /// + /// The document reference. + /// The size of the resolved document. + /// The blocking diagnostic when the method returns false. + /// true when the byte counts remain within the configured limits. + public bool TryAddBytes(string reference, int byteCount, out WotDiagnostic? diagnostic) + { + var location = new WotLocation(reference: reference); + if (byteCount > Options.MaxDocumentBytes) + { + diagnostic = Add( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResolverLimitExceeded, + $"Resolved document '{reference}' of {byteCount} bytes exceeds the " + + $"per-document limit of {Options.MaxDocumentBytes}.", + location); + return false; + } + + if (m_totalBytes + byteCount > Options.MaxTotalBytes) + { + diagnostic = Add( + WotDiagnosticSeverity.Error, + WotDiagnosticCode.ResolverLimitExceeded, + $"Cumulative resolved size exceeded the total limit of {Options.MaxTotalBytes} bytes.", + location); + return false; + } + + m_totalBytes += byteCount; + diagnostic = null; + return true; + } + + private WotDiagnostic Add( + WotDiagnosticSeverity severity, + WotDiagnosticCode code, + string message, + WotLocation location) + { + var diagnostic = new WotDiagnostic(severity, code, message, location); + m_diagnostics.Add(diagnostic); + return diagnostic; + } + + private readonly HashSet m_active; + private readonly List m_diagnostics; + private int m_depth; + private int m_documentCount; + private long m_totalBytes; + } +} diff --git a/src/Opc.Ua.Types/Wot/WotThingCatalog.cs b/src/Opc.Ua.Types/Wot/WotThingCatalog.cs new file mode 100644 index 0000000000..265a825580 --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotThingCatalog.cs @@ -0,0 +1,78 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; + +namespace Opc.Ua.Wot +{ + /// + /// Tracks generated Thing Description references so WoT conversion can preserve stable NodeIds + /// when multiple documents reference the same Thing. + /// + internal sealed class WotThingCatalog + { + /// + /// Adds a generated NodeId candidate for a Thing reference. + /// + /// The Thing reference used as the catalog key. + /// + /// The NodeId associated with the reference, or null when none was generated. + /// + public void Add(string reference, string? nodeId) + { + if (!m_entries.TryGetValue(reference, out Queue? entries)) + { + entries = new Queue(); + m_entries.Add(reference, entries); + } + entries.Enqueue(nodeId); + } + + /// + /// Removes the next NodeId candidate for a Thing reference while preserving insertion order. + /// + /// The Thing reference to resolve. + /// The next catalogued NodeId, or null when none was stored. + /// true when a catalogued entry was available. + public bool TryTake(string reference, out string? nodeId) + { + if (m_entries.TryGetValue(reference, out Queue? entries) && + entries.Count > 0) + { + nodeId = entries.Dequeue(); + return true; + } + nodeId = null; + return false; + } + + private readonly Dictionary> m_entries = new(System.StringComparer.Ordinal); + } +} diff --git a/src/Opc.Ua.Types/Wot/WotVocabulary.cs b/src/Opc.Ua.Types/Wot/WotVocabulary.cs new file mode 100644 index 0000000000..ec26fdafab --- /dev/null +++ b/src/Opc.Ua.Types/Wot/WotVocabulary.cs @@ -0,0 +1,238 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; + +namespace Opc.Ua.Wot +{ + /// + /// Well-known identifiers, reference types, modelling rules and DataType + /// mappings used by the WoT/NodeSet conversion. Kept in one place so that + /// the numeric OPC UA base-namespace NodeIds are not scattered. + /// + internal static class WotVocabulary + { + public const string VocabularyNamespace = "http://opcfoundation.org/UA/WoT-Binding/"; + public const string OpcUaNamespace = "http://opcfoundation.org/UA/"; + public const string NodeSetXmlNamespace = "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd"; + public const string NodeSetContentType = "application/opcua-nodeset+xml"; + public const string Base64Encoding = "base64"; + public const string EnvelopeType = "uav:nodeSet"; + public const string EnvelopePreservationType = "uav:NodeSet2Preservation"; + public const string ProfileVersion = "1.0"; + public const string ThingModelType = "tm:ThingModel"; + public const string WotContext = "https://www.w3.org/2022/wot/td/v1.1"; + + // Reference types (base namespace). + public const string HasSubtype = "i=45"; + public const string HasProperty = "i=46"; + public const string HasComponent = "i=47"; + public const string HasOrderedComponent = "i=49"; + public const string Organizes = "i=35"; + public const string HasTypeDefinition = "i=40"; + public const string HasModellingRule = "i=37"; + public const string GeneratesEvent = "i=41"; + + // Type-annotation term for an event affordance projecting a UA EventType. + public const string EventTypeAnnotation = "uav:eventType"; + + private static readonly Dictionary s_referenceTypeNameToNodeId = + new(StringComparer.Ordinal) + { + ["Organizes"] = Organizes, + ["HasModellingRule"] = HasModellingRule, + ["HasTypeDefinition"] = HasTypeDefinition, + ["GeneratesEvent"] = GeneratesEvent, + ["HasSubtype"] = HasSubtype, + ["HasProperty"] = HasProperty, + ["HasComponent"] = HasComponent, + ["HasOrderedComponent"] = HasOrderedComponent + }; + + private static readonly Dictionary s_referenceTypeNodeIdToName = + new(StringComparer.Ordinal) + { + [Organizes] = "Organizes", + [HasModellingRule] = "HasModellingRule", + [HasTypeDefinition] = "HasTypeDefinition", + [GeneratesEvent] = "GeneratesEvent", + [HasSubtype] = "HasSubtype", + [HasProperty] = "HasProperty", + [HasComponent] = "HasComponent", + [HasOrderedComponent] = "HasOrderedComponent" + }; + + // HasComponent subtypes (base namespace) that carry stronger semantics + // than plain HasComponent and must be pinned by a link whose rel is + // the ReferenceType model name (WoT Binding Section 5.3). Keyed by both the reference-type + // BrowseName and its base-namespace NodeId; the value is the canonical + // base-namespace ExpandedNodeId used for the typed link's uav:refId. + // HasComponent and HasProperty are intentionally excluded: they are the + // baseline parent-child forms surfaced directly as affordances. + private static readonly Dictionary s_hasComponentSubtypes = + new(StringComparer.Ordinal) + { + ["HasOrderedComponent"] = HasOrderedComponent, + [HasOrderedComponent] = HasOrderedComponent + }; + + // Base types (base namespace). + public const string BaseObjectType = "i=58"; + public const string BaseVariableType = "i=62"; + public const string BaseDataVariableType = "i=63"; + public const string PropertyType = "i=68"; + public const string BaseEventType = "i=2041"; + public const string BaseDataType = "i=24"; + + // Modelling rules (base namespace). + public const string ModellingRuleMandatory = "i=78"; + public const string ModellingRuleOptional = "i=80"; + public const string ModellingRuleMandatoryPlaceholder = "i=11508"; + public const string ModellingRuleOptionalPlaceholder = "i=11509"; + + private static readonly Dictionary s_modellingRuleToNodeId = + new(StringComparer.Ordinal) + { + ["Mandatory"] = ModellingRuleMandatory, + ["Optional"] = ModellingRuleOptional, + ["MandatoryPlaceholder"] = ModellingRuleMandatoryPlaceholder, + ["OptionalPlaceholder"] = ModellingRuleOptionalPlaceholder + }; + + private static readonly Dictionary s_nodeIdToModellingRule = + new(StringComparer.Ordinal) + { + [ModellingRuleMandatory] = "Mandatory", + [ModellingRuleOptional] = "Optional", + [ModellingRuleMandatoryPlaceholder] = "MandatoryPlaceholder", + [ModellingRuleOptionalPlaceholder] = "OptionalPlaceholder" + }; + + private static readonly Dictionary s_jsonTypeToDataType = + new(StringComparer.Ordinal) + { + ["boolean"] = "i=1", + ["integer"] = "i=8", + ["number"] = "i=11", + ["string"] = "i=12", + ["object"] = "i=22", + ["null"] = "i=24" + }; + + public static bool TryGetModellingRuleNodeId(string modellingRule, out string nodeId) + { + return s_modellingRuleToNodeId.TryGetValue(modellingRule, out nodeId!); + } + + public static bool TryGetModellingRuleName(string nodeId, out string modellingRule) + { + return s_nodeIdToModellingRule.TryGetValue(nodeId, out modellingRule!); + } + + public static string MapJsonTypeToDataType(string? jsonType) + { + if (jsonType is not null && + s_jsonTypeToDataType.TryGetValue(jsonType, out string? dataType)) + { + return dataType; + } + return BaseDataType; + } + + public static bool IsModellingRule(string modellingRule) + { + return s_modellingRuleToNodeId.ContainsKey(modellingRule); + } + + /// + /// Determines whether a reference type (given as a BrowseName or a NodeId) + /// is a HasComponent subtype whose exact semantics must be pinned by a + /// typed Reference link, and returns the canonical + /// base-namespace ExpandedNodeId to use for the link's uav:refId. + /// + public static bool TryGetHasComponentSubtype(string? referenceType, out string subtypeNodeId) + { + if (referenceType is not null && + s_hasComponentSubtypes.TryGetValue(referenceType, out subtypeNodeId!)) + { + return true; + } + subtypeNodeId = string.Empty; + return false; + } + + public static bool TryGetReferenceTypeNodeId( + string? browseName, + out string nodeId) + { + if (browseName is not null && + s_referenceTypeNameToNodeId.TryGetValue(browseName, out nodeId!)) + { + return true; + } + nodeId = string.Empty; + return false; + } + + public static bool TryGetReferenceTypeBrowseName( + string? referenceType, + out string browseName) + { + if (referenceType is not null) + { + if (s_referenceTypeNodeIdToName.TryGetValue( + referenceType, + out browseName!)) + { + return true; + } + if (s_referenceTypeNameToNodeId.ContainsKey(referenceType)) + { + browseName = referenceType; + return true; + } + } + browseName = string.Empty; + return false; + } + + public static string FormatUInt(uint value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static string FormatInt(int value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingChannel.cs b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingChannel.cs new file mode 100644 index 0000000000..d509396fe9 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingChannel.cs @@ -0,0 +1,323 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using MQTTnet; +using MQTTnet.Exceptions; +using MQTTnet.Protocol; + +namespace Opc.Ua.WotCon.Bindings.Mqtt +{ + /// + /// A live MQTT binding channel that publishes writes / actions and subscribes + /// for reads / observes / events per the pinned MQTT binding, with bounded QoS, + /// payload sizes and read timeouts. + /// + internal sealed class MqttWotBindingChannel : IWotBindingChannel + { + public MqttWotBindingChannel( + IMqttClient client, + WotCompiledForm form, + WotExecutorContext context, + MqttWotBindingOptions options) + { + m_client = client; + Form = form; + m_options = options; + m_topic = form.Addressing.Target; + m_qos = ParseQos(form.Addressing.Metadata); + m_retain = ParseBool(form.Addressing.Metadata, "retain"); + context.Codecs.TrySelect(form.Payload.ContentType, out m_codec); + m_client.ApplicationMessageReceivedAsync += OnMessageAsync; + } + + public WotCompiledForm Form { get; } + + public async ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + var completion = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + Interlocked.Exchange(ref m_pendingRead, completion); + using var timeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + timeout.CancelAfter(m_options.ReadTimeout); + try + { + await SubscribeAsync(cancellationToken).ConfigureAwait(false); + byte[] payload = await completion.Task.WaitAsync(timeout.Token).ConfigureAwait(false); + WotDecodeResult decoded = m_codec.Decode(payload, Form.Payload); + if (!decoded.Success) + { + return new WotReadResult( + StatusCodes.BadDecodingError, + DataValue.FromStatusCode(StatusCodes.BadDecodingError), + decoded.Error); + } + return new WotReadResult( + StatusCodes.Good, new DataValue(decoded.Value, StatusCodes.Good, DateTimeUtc.Now, DateTimeUtc.Now)); + } + catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + return new WotReadResult( + StatusCodes.BadTimeout, DataValue.FromStatusCode(StatusCodes.BadTimeout), + "Timed out waiting for an MQTT message."); + } + finally + { + Interlocked.CompareExchange(ref m_pendingRead, null, completion); + if (!m_observing) + { + await TryUnsubscribeAsync().ConfigureAwait(false); + } + } + } + + public async ValueTask WriteAsync( + DataValue value, CancellationToken cancellationToken = default) + { + WotEncodeResult encoded = m_codec.Encode(value.WrappedValue, Form.Payload); + if (!encoded.Success) + { + return new WotWriteResult(StatusCodes.BadEncodingError, encoded.Error); + } + try + { + await PublishAsync(encoded.Data.ToArray(), cancellationToken).ConfigureAwait(false); + return new WotWriteResult(StatusCodes.Good); + } + catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + return new WotWriteResult(StatusCodes.BadTimeout, "The MQTT publish timed out."); + } + catch (MqttCommunicationException ex) + { + return new WotWriteResult(StatusCodes.BadCommunicationError, ex.Message); + } + } + + public async ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + byte[] payload = []; + if (inputs is { Count: > 0 }) + { + WotEncodeResult encoded = m_codec.Encode(inputs[0], Form.Payload); + if (!encoded.Success) + { + return new WotInvokeResult(StatusCodes.BadEncodingError, null, encoded.Error); + } + payload = encoded.Data.ToArray(); + } + try + { + await PublishAsync(payload, cancellationToken).ConfigureAwait(false); + return new WotInvokeResult(StatusCodes.Good, []); + } + catch (MqttCommunicationException ex) + { + return new WotInvokeResult(StatusCodes.BadCommunicationError, null, ex.Message); + } + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller, who disposes it.")] + public async ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + lock (m_lock) + { + m_handlers.Add(onNotification); + m_observing = true; + } + await SubscribeAsync(cancellationToken).ConfigureAwait(false); + return new HandlerSubscription(this, onNotification); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + return ObserveAsync(onEvent, cancellationToken); + } + + public async ValueTask DisposeAsync() + { + m_client.ApplicationMessageReceivedAsync -= OnMessageAsync; + try + { + await m_client.DisconnectAsync(new MqttClientDisconnectOptionsBuilder().Build()) + .ConfigureAwait(false); + } + catch (MqttCommunicationException) + { + // Ignore disconnect faults during teardown. + } + m_client.Dispose(); + } + + private Task OnMessageAsync(MqttApplicationMessageReceivedEventArgs args) + { + byte[] payload = ToArray(args.ApplicationMessage.Payload); + TaskCompletionSource? pending = Interlocked.Exchange(ref m_pendingRead, null); + pending?.TrySetResult(payload); + + Action[] handlers; + lock (m_lock) + { + if (m_handlers.Count == 0) + { + return Task.CompletedTask; + } + handlers = [.. m_handlers]; + } + WotDecodeResult decoded = m_codec.Decode(payload, Form.Payload); + if (decoded.Success) + { + var notification = new WotNotification( + new DataValue(decoded.Value, StatusCodes.Good, DateTimeUtc.Now, DateTimeUtc.Now)); + foreach (Action handler in handlers) + { + handler(notification); + } + } + return Task.CompletedTask; + } + + private async Task SubscribeAsync(CancellationToken cancellationToken) + { + MqttClientSubscribeOptions options = new MqttClientSubscribeOptionsBuilder() + .WithTopicFilter(m_topic, m_qos) + .Build(); + await m_client.SubscribeAsync(options, cancellationToken).ConfigureAwait(false); + } + + private async Task TryUnsubscribeAsync() + { + try + { + MqttClientUnsubscribeOptions options = new MqttClientUnsubscribeOptionsBuilder() + .WithTopicFilter(m_topic) + .Build(); + await m_client.UnsubscribeAsync(options).ConfigureAwait(false); + } + catch (MqttCommunicationException) + { + // Ignore unsubscribe faults. + } + } + + private async Task PublishAsync(byte[] payload, CancellationToken cancellationToken) + { + MqttApplicationMessage message = new MqttApplicationMessageBuilder() + .WithTopic(m_topic) + .WithPayload(payload) + .WithQualityOfServiceLevel(m_qos) + .WithRetainFlag(m_retain) + .Build(); + await m_client.PublishAsync(message, cancellationToken).ConfigureAwait(false); + } + + private void RemoveHandler(Action handler) + { + lock (m_lock) + { + m_handlers.Remove(handler); + m_observing = m_handlers.Count > 0; + } + } + + private static byte[] ToArray(ReadOnlySequence payload) + { + return payload.IsEmpty ? [] : payload.ToArray(); + } + + private static MqttQualityOfServiceLevel ParseQos( + System.Collections.Immutable.ImmutableDictionary metadata) + { + if (metadata.TryGetValue("qos", out string? value) && + int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out int qos)) + { + return qos switch + { + 1 => MqttQualityOfServiceLevel.AtLeastOnce, + 2 => MqttQualityOfServiceLevel.ExactlyOnce, + _ => MqttQualityOfServiceLevel.AtMostOnce + }; + } + return MqttQualityOfServiceLevel.AtMostOnce; + } + + private static bool ParseBool( + System.Collections.Immutable.ImmutableDictionary metadata, string key) + { + return metadata.TryGetValue(key, out string? value) && bool.TryParse(value, out bool result) && result; + } + + private sealed class HandlerSubscription : IWotSubscription + { + public HandlerSubscription(MqttWotBindingChannel channel, Action handler) + { + m_channel = channel; + m_handler = handler; + } + + public WotCompiledForm Form => m_channel.Form; + + public async ValueTask DisposeAsync() + { + m_channel.RemoveHandler(m_handler); + if (!m_channel.m_observing) + { + await m_channel.TryUnsubscribeAsync().ConfigureAwait(false); + } + } + + private readonly MqttWotBindingChannel m_channel; + private readonly Action m_handler; + } + + private readonly IMqttClient m_client; + private readonly MqttWotBindingOptions m_options; + private readonly string m_topic; + private readonly MqttQualityOfServiceLevel m_qos; + private readonly bool m_retain; + private readonly IWotPayloadCodec m_codec; + private readonly Lock m_lock = new(); + private readonly List> m_handlers = []; + private volatile bool m_observing; + private TaskCompletionSource? m_pendingRead; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingExecutor.cs b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingExecutor.cs new file mode 100644 index 0000000000..9ac6d628f2 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingExecutor.cs @@ -0,0 +1,101 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.Threading; +using System.Threading.Tasks; +using MQTTnet; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Mqtt +{ + /// + /// Executes MQTT WoT binding forms compiled by the + /// by opening a per-form MQTT connection using + /// the repository's MQTTnet infrastructure. + /// + public sealed class MqttWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new MQTT executor. + /// + public MqttWotBindingExecutor(MqttWotBindingOptions? options = null) + { + m_options = options ?? new MqttWotBindingOptions(); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.mqtt", "1.0-ed", MqttBindingPlanner.BindingUri, "W3C WoT MQTT Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + return form is not null && string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal); + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "The client is owned by the returned channel, which disposes it.")] + public async ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + string suffix = Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture); + string clientId = $"{m_options.ClientIdPrefix}-{suffix.AsSpan(0, 12)}"; + // Resolve credentials / trust and build the options first, so a + // fail-closed rejection throws before any client is created. + MqttWotConnection.MqttWotConnectPlan plan = await MqttWotConnection + .PrepareAsync(form, context, m_options, clientId, cancellationToken).ConfigureAwait(false); + IMqttClient client = m_options.ClientFactory?.Invoke() + ?? new MqttClientFactory().CreateMqttClient(); + try + { + await client.ConnectAsync(plan.Options, cancellationToken).ConfigureAwait(false); + } + catch + { + client.Dispose(); + throw; + } + return new MqttWotBindingChannel(client, form, context, m_options); + } + + private readonly MqttWotBindingOptions m_options; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingOptions.cs b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingOptions.cs new file mode 100644 index 0000000000..9160837188 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotBindingOptions.cs @@ -0,0 +1,74 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using MQTTnet; + +namespace Opc.Ua.WotCon.Bindings.Mqtt +{ + /// + /// Options for the MQTT WoT binding executor. + /// + public sealed class MqttWotBindingOptions + { + /// + /// Gets or sets a factory that supplies an unconnected MQTT client. When + /// null the executor creates one from the MQTTnet client factory. + /// + public Func? ClientFactory { get; set; } + + /// + /// Gets or sets the client id prefix used for connections. + /// + public string ClientIdPrefix { get; set; } = "opcua-wot"; + + /// + /// Gets or sets the timeout awaiting a message during a read. + /// + public TimeSpan ReadTimeout { get; set; } = TimeSpan.FromSeconds(10); + + /// + /// Gets or sets whether username / password credentials may be sent over a + /// plaintext mqtt:// connection. When false (the default) the + /// executor fails closed rather than leaking credentials in clear text; use + /// an mqtts:// href instead. Set to true only for explicitly + /// accepted plaintext deployments. + /// + public bool AllowCredentialsOverPlaintext { get; set; } + + /// + /// Gets or sets whether the broker's TLS certificate is validated for an + /// mqtts:// connection. When true (the default) the platform + /// trust store, or the trust anchors resolved through the credential + /// provider, must validate the broker certificate. Set to false only + /// for explicitly accepted test deployments. + /// + public bool ValidateServerCertificate { get; set; } = true; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotConnection.cs b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotConnection.cs new file mode 100644 index 0000000000..45f77f1c2d --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/MqttWotConnection.cs @@ -0,0 +1,206 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using MQTTnet; + +namespace Opc.Ua.WotCon.Bindings.Mqtt +{ + /// + /// Builds the transport-security-aware MQTT client options for a compiled WoT + /// form. The mqtts scheme always enables TLS (defaulting to port 8883) + /// and applies the trust anchors and client certificate resolved through the + /// credential provider; the mqtt scheme stays explicit plaintext + /// (port 1883). The builder fails closed: a declared security scheme that + /// resolves to no credential, or username / password material that would be + /// sent over a plaintext connection, throws instead of downgrading silently. + /// + internal static class MqttWotConnection + { + internal const int DefaultTlsPort = 8883; + internal const int DefaultPlaintextPort = 1883; + + /// + /// The result of preparing an MQTT connection for a compiled form. + /// + internal sealed class MqttWotConnectPlan + { + public MqttWotConnectPlan( + MqttClientOptions options, + string host, + int port, + bool useTls, + bool hasCredentials) + { + Options = options; + Host = host; + Port = port; + UseTls = useTls; + HasCredentials = hasCredentials; + } + + /// + /// Gets the built MQTT client options. + /// + public MqttClientOptions Options { get; } + + /// + /// Gets the resolved broker host. + /// + public string Host { get; } + + /// + /// Gets the resolved broker port. + /// + public int Port { get; } + + /// + /// Gets whether TLS is enabled for the connection. + /// + public bool UseTls { get; } + + /// + /// Gets whether username / password credentials were applied. + /// + public bool HasCredentials { get; } + } + + /// + /// Resolves credentials / trust through the provider and builds the MQTT + /// client options for the supplied compiled form, enforcing the transport + /// security rules described on the type. + /// + /// + public static async ValueTask PrepareAsync( + WotCompiledForm form, + WotExecutorContext context, + MqttWotBindingOptions options, + string clientId, + CancellationToken cancellationToken) + { + bool useTls = string.Equals(form.Endpoint.Scheme, "mqtts", StringComparison.OrdinalIgnoreCase); + string host = string.IsNullOrEmpty(form.Endpoint.Host) ? "127.0.0.1" : form.Endpoint.Host!; + int port = form.Endpoint.Port > 0 + ? form.Endpoint.Port + : (useTls ? DefaultTlsPort : DefaultPlaintextPort); + + WotCredential? credential = await ResolveRequiredCredentialAsync(form, context, cancellationToken) + .ConfigureAwait(false); + + MqttClientOptionsBuilder builder = new MqttClientOptionsBuilder() + .WithTcpServer(host, port) + .WithClientId(clientId); + + string? username = null; + byte[] password = []; + if (credential is not null) + { + if (credential.Properties.TryGetValue("username", out string? user)) + { + username = user; + } + if (credential.Properties.TryGetValue("password", out string? pass) && pass is not null) + { + password = Encoding.UTF8.GetBytes(pass); + } + } + + bool hasCredentials = !string.IsNullOrEmpty(username); + if (hasCredentials && !useTls && !options.AllowCredentialsOverPlaintext) + { + throw new InvalidOperationException( + "MQTT username / password credentials require TLS. Use an mqtts:// href, or set " + + "MqttWotBindingOptions.AllowCredentialsOverPlaintext for explicitly accepted " + + "plaintext deployments."); + } + if (hasCredentials) + { + builder = builder.WithCredentials(username, password); + } + + if (useTls) + { + X509Certificate2? clientCertificate = credential?.ClientCertificate; + ImmutableArray trust = credential is null + ? [] + : credential.TrustedCertificates; + bool validate = options.ValidateServerCertificate; + builder = builder.WithTlsOptions(tls => + { + tls.UseTls().WithAllowUntrustedCertificates(!validate); + if (clientCertificate is not null) + { + tls.WithClientCertificates([clientCertificate]); + } + if (!trust.IsDefaultOrEmpty) + { + var chain = new X509Certificate2Collection(); + foreach (X509Certificate2 anchor in trust) + { + chain.Add(anchor); + } + tls.WithTrustChain(chain); + } + }); + } + + return new MqttWotConnectPlan(builder.Build(), host, port, useTls, hasCredentials); + } + + private static async ValueTask ResolveRequiredCredentialAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken) + { + if (form.Security.IsDefaultOrEmpty) + { + return null; + } + foreach (WotCredentialReference reference in form.Security) + { + if (reference.Scheme == WotSecurityScheme.NoSecurity) + { + continue; + } + // Fail closed: a form that declares a security scheme must have + // its credential resolved or the connection is refused rather + // than silently opened without the required authentication. + return (WotCredential?)(await context.Credentials + .ResolveAsync(reference, cancellationToken).ConfigureAwait(false) ?? + throw new InvalidOperationException( + $"The MQTT binding requires a credential for security scheme '{reference.SchemeName}' " + + "but the credential provider resolved none; refusing to connect.")); + } + return null; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/NugetREADME.md b/src/Opc.Ua.WotCon.Bindings.Mqtt/NugetREADME.md new file mode 100644 index 0000000000..44372ee63c --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/NugetREADME.md @@ -0,0 +1,17 @@ +# OPC UA WoT Connectivity — MQTT Executor + +`OPCFoundation.NetStandard.Opc.Ua.WotCon.Bindings.Mqtt` executes MQTT WoT Connectivity binding forms compiled by the MQTT planner in `Opc.Ua.WotCon.Bindings`. + +It uses the repository's MQTTnet infrastructure (kept out of the core model assembly) to implement publish / subscribe / RPC patterns per the pinned MQTT binding, with bounded QoS, topic, payload sizes and timeouts. The MQTT client factory is injectable. + +## Transport security + +- An `mqtts://` href always enables TLS and defaults to port 8883; an `mqtt://` href stays explicit plaintext (port 1883). There is no silent plaintext downgrade. +- Username / password credentials, the TLS client certificate and the TLS trust anchors are resolved through the registered `IWotCredentialProvider`. A form that declares a security scheme fails closed (the connection is refused) when the provider resolves no credential. +- Username / password credentials are refused over a plaintext `mqtt://` connection unless `MqttWotBindingOptions.AllowCredentialsOverPlaintext` is set for an explicitly accepted plaintext deployment. `ValidateServerCertificate` controls broker-certificate validation for `mqtts://`. + +Register it with `builder.AddMqttWotBinding(...)`. + +The package targets `net8.0`, `net9.0`, and `net10.0`. The MQTT planner and common binding contracts are supplied by `OPCFoundation.NetStandard.Opc.Ua.WotCon.Bindings`. + +See the [WoT protocol bindings guide](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/docs/WotBindings.md). diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/Opc.Ua.WotCon.Bindings.Mqtt.csproj b/src/Opc.Ua.WotCon.Bindings.Mqtt/Opc.Ua.WotCon.Bindings.Mqtt.csproj new file mode 100644 index 0000000000..b2ee1a9c28 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/Opc.Ua.WotCon.Bindings.Mqtt.csproj @@ -0,0 +1,33 @@ + + + $(AssemblyPrefix).WotCon.Bindings.Mqtt + net8.0;net9.0;net10.0 + $(CustomTestTarget) + $(CustomTestTarget) + true + $(PackagePrefix).Opc.Ua.WotCon.Bindings.Mqtt + Opc.Ua.WotCon.Bindings.Mqtt + enable + MQTT protocol executor for OPC UA WoT Connectivity binding forms + true + NugetREADME.md + true + true + + + + + + + $(PackageId).Debug + + + + + + + + + + + diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/OpcUaMqttWotBindingBuilderExtensions.cs b/src/Opc.Ua.WotCon.Bindings.Mqtt/OpcUaMqttWotBindingBuilderExtensions.cs new file mode 100644 index 0000000000..9bf43caaa7 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/OpcUaMqttWotBindingBuilderExtensions.cs @@ -0,0 +1,61 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Opc.Ua; +using Opc.Ua.WotCon.Bindings.Mqtt; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// extensions that register the MQTT WoT binding + /// executor alongside the shipped planner binders. + /// + public static class OpcUaMqttWotBindingBuilderExtensions + { + /// + /// Registers the eight shipped planner binders and the MQTT executor, so + /// MQTT binding forms are validated, compiled and executable. + /// + /// + public static IOpcUaBuilder AddMqttWotBinding( + this IOpcUaBuilder builder, Action? configure = null) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + var options = new MqttWotBindingOptions(); + configure?.Invoke(options); + return builder + .AddWotProtocolBinders() + .AddWotBindingExecutor(new MqttWotBindingExecutor(options)); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings.Mqtt/Properties/AssemblyInfo.cs b/src/Opc.Ua.WotCon.Bindings.Mqtt/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..7798c9bd57 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings.Mqtt/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/src/Opc.Ua.WotCon.Bindings/Http/HttpStatusMapper.cs b/src/Opc.Ua.WotCon.Bindings/Http/HttpStatusMapper.cs new file mode 100644 index 0000000000..ca075e53be --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Http/HttpStatusMapper.cs @@ -0,0 +1,62 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Net; + +namespace Opc.Ua.WotCon.Bindings.Http +{ + /// + /// Maps HTTP status codes to OPC UA values. + /// + internal static class HttpStatusMapper + { + public static StatusCode Map(HttpStatusCode status) + { + int code = (int)status; + if (code is >= 200 and < 300) + { + return StatusCodes.Good; + } + return status switch + { + HttpStatusCode.BadRequest => StatusCodes.BadInvalidArgument, + HttpStatusCode.Unauthorized => StatusCodes.BadUserAccessDenied, + HttpStatusCode.Forbidden => StatusCodes.BadUserAccessDenied, + HttpStatusCode.NotFound => StatusCodes.BadNodeIdUnknown, + HttpStatusCode.MethodNotAllowed => StatusCodes.BadNotSupported, + HttpStatusCode.RequestTimeout => StatusCodes.BadTimeout, + HttpStatusCode.Conflict => StatusCodes.BadInvalidState, + HttpStatusCode.NotImplemented => StatusCodes.BadNotImplemented, + HttpStatusCode.ServiceUnavailable => StatusCodes.BadServerHalted, + HttpStatusCode.GatewayTimeout => StatusCodes.BadTimeout, + _ => code >= 500 ? StatusCodes.BadInternalError : StatusCodes.BadUnexpectedError + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingChannel.cs b/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingChannel.cs new file mode 100644 index 0000000000..7a87bcb0a3 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingChannel.cs @@ -0,0 +1,508 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings.Http +{ + /// + /// A live HTTP binding channel. It executes read (GET), write (PUT/method), + /// action (POST/method), observe and event operations with bounded timeouts + /// and payload sizes, cooperative cancellation, HTTP-to- + /// mapping and credential-provider-driven authentication. + /// + internal sealed class HttpWotBindingChannel : IWotBindingChannel + { + public HttpWotBindingChannel( + HttpClient client, + bool ownsClient, + bool manualRedirects, + ImmutableArray> defaultHeaders, + WotCompiledForm form, + WotExecutorContext context, + HttpWotBindingOptions options) + { + m_client = client; + m_ownsClient = ownsClient; + m_manualRedirects = manualRedirects; + m_defaultHeaders = defaultHeaders; + Form = form; + m_context = context; + m_options = options; + context.Codecs.TrySelect(form.Payload.ContentType, out m_codec); + m_baseTarget = form.Addressing.Target; + } + + public WotCompiledForm Form { get; } + + public async ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + (StatusCode status, byte[] body, string? error) = + await SendAsync(HttpMethod.Get, null, cancellationToken).ConfigureAwait(false); + if (!StatusCode.IsGood(status)) + { + return new WotReadResult(status, DataValue.FromStatusCode(status), error); + } + WotDecodeResult decoded = m_codec.Decode(body, Form.Payload); + if (!decoded.Success) + { + return new WotReadResult( + StatusCodes.BadDecodingError, + DataValue.FromStatusCode(StatusCodes.BadDecodingError), + decoded.Error); + } + return new WotReadResult( + StatusCodes.Good, + new DataValue(decoded.Value, StatusCodes.Good, DateTimeUtc.Now, DateTimeUtc.Now)); + } + + public async ValueTask WriteAsync( + DataValue value, CancellationToken cancellationToken = default) + { + WotEncodeResult encoded = m_codec.Encode(value.WrappedValue, Form.Payload); + if (!encoded.Success) + { + return new WotWriteResult(StatusCodes.BadEncodingError, encoded.Error); + } + HttpMethod method = ResolveMethod("PUT"); + (StatusCode status, _, string? error) = + await SendAsync(method, encoded.Data, cancellationToken).ConfigureAwait(false); + return new WotWriteResult(status, error); + } + + public async ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + ReadOnlyMemory? content = null; + if (inputs is { Count: > 0 }) + { + WotEncodeResult encoded = m_codec.Encode(inputs[0], Form.Payload); + if (!encoded.Success) + { + return new WotInvokeResult(StatusCodes.BadEncodingError, null, encoded.Error); + } + content = encoded.Data; + } + HttpMethod method = ResolveMethod("POST"); + (StatusCode status, byte[] body, string? error) = + await SendAsync(method, content, cancellationToken).ConfigureAwait(false); + if (!StatusCode.IsGood(status)) + { + return new WotInvokeResult(status, null, error); + } + if (body.Length == 0) + { + return new WotInvokeResult(StatusCodes.Good, []); + } + WotDecodeResult decoded = m_codec.Decode(body, Form.Payload); + var output = new DataValue( + decoded.Success ? decoded.Value : Variant.Null, + decoded.Success ? StatusCodes.Good : StatusCodes.BadDecodingError, + DateTimeUtc.Now, DateTimeUtc.Now); + return new WotInvokeResult(StatusCodes.Good, [output]); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller, who disposes it.")] + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + var subscription = new PollingWotSubscription( + Form, + async token => + { + WotReadResult result = await ReadAsync(token).ConfigureAwait(false); + // A mapped failure carries its bad StatusCode on the value, so surface it + // rather than leaving the last good value in place, and report the poll as + // unhealthy so the retry policy backs off instead of hammering the asset. + onNotification(new WotNotification(result.Value)); + return result.Success; + }, + m_options.ObserveInterval, + // A transient poll fault is reported as a Bad-status notification + // so consumers observe the fault without the poll loop faulting. + onError: _ => onNotification(new WotNotification( + DataValue.FromStatusCode(StatusCodes.BadCommunicationError))), + retryPolicy: m_options.RetryPolicy); + return new ValueTask(subscription); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + return ObserveAsync(onEvent, cancellationToken); + } + + public ValueTask DisposeAsync() + { + if (m_ownsClient) + { + m_client.Dispose(); + } + return default; + } + + private HttpMethod ResolveMethod(string fallback) + { + string method = string.IsNullOrEmpty(Form.OperationInfo.Method) + ? fallback : Form.OperationInfo.Method; + return new HttpMethod(method.ToUpperInvariant()); + } + + private async ValueTask<(StatusCode Status, byte[] Body, string? Error)> SendAsync( + HttpMethod method, ReadOnlyMemory? content, CancellationToken cancellationToken) + { + await EnsureCredentialAsync(cancellationToken).ConfigureAwait(false); + using var timeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + timeout.CancelAfter(m_context.Bounds.DefaultTimeout); + try + { + if (!Uri.TryCreate(m_baseTarget, UriKind.Absolute, out Uri? current) || current is null) + { + return (StatusCodes.BadInvalidArgument, Array.Empty(), + "The HTTP target is not a valid absolute URI."); + } + Uri origin = current; + HttpMethod currentMethod = method; + ReadOnlyMemory? currentContent = content; + int redirectsRemaining = m_manualRedirects ? Math.Max(0, m_options.MaxAutomaticRedirects) : 0; + var visited = new HashSet(StringComparer.OrdinalIgnoreCase); + while (true) + { + visited.Add(current.AbsoluteUri); + // Custom header / query credentials are only applied while the + // request stays on the original origin; a cross-origin redirect + // drops them so they never leak to a different host. + bool sameOrigin = IsSameOrigin(origin, current); + Uri requestUri = sameOrigin ? AppendCredentialQuery(current) : current; + HopResult hop = await SendOnceAsync( + currentMethod, requestUri, sameOrigin, currentContent, timeout.Token).ConfigureAwait(false); + + if (hop.Redirect is null) + { + return (hop.Status, hop.Body, hop.Error); + } + + if (redirectsRemaining <= 0) + { + return (StatusCodes.BadCommunicationError, Array.Empty(), + "The HTTP redirect limit was exceeded."); + } + Uri? next = ResolveRedirectTarget(current, hop.Location, out string? redirectError); + if (next is null) + { + return (StatusCodes.BadSecurityChecksFailed, Array.Empty(), redirectError); + } + if (visited.Contains(next.AbsoluteUri)) + { + return (StatusCodes.BadCommunicationError, Array.Empty(), + "The HTTP redirect chain contains a loop."); + } + redirectsRemaining--; + // 303 (and, per browser convention, 301/302) turn the follow-up + // request into a bodyless GET; 307/308 preserve method and body. + if (hop.Redirect is System.Net.HttpStatusCode.MovedPermanently or + System.Net.HttpStatusCode.Found or System.Net.HttpStatusCode.SeeOther) + { + currentMethod = HttpMethod.Get; + currentContent = null; + } + current = next; + } + } + catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + return (StatusCodes.BadTimeout, Array.Empty(), "The HTTP request timed out."); + } + catch (HttpRequestException ex) + { + return (StatusCodes.BadCommunicationError, Array.Empty(), ex.Message); + } + catch (InvalidOperationException ex) + { + return (StatusCodes.BadEncodingLimitsExceeded, Array.Empty(), ex.Message); + } + } + + /// + /// The outcome of a single request hop: either a terminal result or a redirect. + /// + private readonly struct HopResult + { + private HopResult( + System.Net.HttpStatusCode? redirect, Uri? location, + StatusCode status, byte[] body, string? error) + { + Redirect = redirect; + Location = location; + Status = status; + Body = body; + Error = error; + } + + public System.Net.HttpStatusCode? Redirect { get; } + + public Uri? Location { get; } + + public StatusCode Status { get; } + + public byte[] Body { get; } + + public string? Error { get; } + + public static HopResult Terminal(StatusCode status, byte[] body, string? error) + { + return new HopResult(null, null, status, body, error); + } + + public static HopResult RedirectTo(System.Net.HttpStatusCode redirect, Uri? location) + { + return new HopResult(redirect, location, StatusCodes.Good, [], null); + } + } + + private async Task SendOnceAsync( + HttpMethod method, Uri requestUri, bool sameOrigin, + ReadOnlyMemory? content, CancellationToken cancellationToken) + { + using var request = new HttpRequestMessage(method, requestUri); + ApplyHeaders(request, sameOrigin); + if (content is { } body && method != HttpMethod.Get && method != HttpMethod.Head) + { + var byteContent = new ByteArrayContent(body.ToArray()); + if (!string.IsNullOrEmpty(Form.Payload.ContentType)) + { + byteContent.Headers.TryAddWithoutValidation("Content-Type", Form.Payload.ContentType); + } + request.Content = byteContent; + } + + using HttpResponseMessage response = await m_client + .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken) + .ConfigureAwait(false); + + if (m_manualRedirects && IsRedirect(response.StatusCode)) + { + return HopResult.RedirectTo(response.StatusCode, response.Headers.Location); + } + + StatusCode status = HttpStatusMapper.Map(response.StatusCode); + if (!response.IsSuccessStatusCode) + { + return HopResult.Terminal(status, [], + $"HTTP {(int)response.StatusCode} {response.ReasonPhrase}"); + } + byte[] payload = await ReadBoundedAsync(response, cancellationToken).ConfigureAwait(false); + return HopResult.Terminal(StatusCodes.Good, payload, null); + } + + private static bool IsRedirect(System.Net.HttpStatusCode status) + { + return status is System.Net.HttpStatusCode.MovedPermanently or + System.Net.HttpStatusCode.Found or + System.Net.HttpStatusCode.SeeOther or + System.Net.HttpStatusCode.TemporaryRedirect or + System.Net.HttpStatusCode.PermanentRedirect; + } + + private Uri? ResolveRedirectTarget(Uri current, Uri? location, out string? error) + { + error = null; + if (location is null) + { + error = "The HTTP redirect response carried no Location header."; + return null; + } + if (!location.IsAbsoluteUri) + { + location = new Uri(current, location); + } + if (!string.Equals(location.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) && + !string.Equals(location.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase)) + { + error = $"The HTTP redirect targets a disallowed scheme '{location.Scheme}'."; + return null; + } + if (string.Equals(current.Scheme, Uri.UriSchemeHttps, StringComparison.OrdinalIgnoreCase) && + string.Equals(location.Scheme, Uri.UriSchemeHttp, StringComparison.OrdinalIgnoreCase) && + !m_options.AllowInsecureRedirectDowngrade) + { + error = "The HTTP redirect downgrades https to http, which is refused."; + return null; + } + return location; + } + + private static bool IsSameOrigin(Uri a, Uri b) + { + return string.Equals(a.Scheme, b.Scheme, StringComparison.OrdinalIgnoreCase) && + string.Equals(a.Host, b.Host, StringComparison.OrdinalIgnoreCase) && + a.Port == b.Port; + } + + private async Task ReadBoundedAsync(HttpResponseMessage response, CancellationToken cancellationToken) + { + using Stream stream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false); + using var buffer = new MemoryStream(); + byte[] chunk = new byte[8192]; + int max = m_context.Bounds.MaxPayloadBytes; + int total = 0; + int read; + while ((read = await stream.ReadAsync(chunk.AsMemory(0, chunk.Length), cancellationToken) + .ConfigureAwait(false)) > 0) + { + total += read; + if (total > max) + { + throw new InvalidOperationException( + $"The HTTP response exceeds the maximum payload size of {max} bytes."); + } + buffer.Write(chunk, 0, read); + } + return buffer.ToArray(); + } + + private async ValueTask EnsureCredentialAsync(CancellationToken cancellationToken) + { + Task task; + lock (m_credentialLock) + { + // Start (or reuse) a single shared resolution. Concurrent callers + // all await the same task, so the resolved credential and the + // effective target are published exactly once and no request is + // ever sent before that state is ready. + task = m_credentialTask ??= ResolveCredentialAsync(cancellationToken); + } + try + { + await task.ConfigureAwait(false); + } + catch + { + // Failure retry policy: a failed (or cancelled) resolution is not + // cached, so the next request re-attempts resolution instead of + // being permanently wedged on the fault. + lock (m_credentialLock) + { + if (ReferenceEquals(m_credentialTask, task)) + { + m_credentialTask = null; + } + } + throw; + } + } + + private async Task ResolveCredentialAsync(CancellationToken cancellationToken) + { + WotCredential? credential = null; + if (!Form.Security.IsEmpty) + { + credential = await m_context.Credentials + .ResolveAsync(Form.Security[0], cancellationToken).ConfigureAwait(false); + } + // Publish the resolved credential only after resolution has completed. A + // caller reads m_credential in SendAsync only after awaiting the shared + // task, so it can never observe a half-initialized state or send a + // request without the resolved credential applied. + m_credential = credential; + } + + private void ApplyHeaders(HttpRequestMessage request, bool includeCredentials) + { + // A cross-origin redirect must not carry any custom (potentially + // credential-bearing) header, so both the caller's default headers and + // the resolved credential headers are only applied on the original + // origin. + if (!includeCredentials) + { + return; + } + foreach (KeyValuePair header in m_defaultHeaders) + { + request.Headers.TryAddWithoutValidation(header.Key, header.Value); + } + if (m_credential is { } credential) + { + foreach (KeyValuePair header in credential.Headers) + { + request.Headers.TryAddWithoutValidation(header.Key, header.Value); + } + } + } + + private Uri AppendCredentialQuery(Uri target) + { + WotCredential? credential = m_credential; + if (credential is null || credential.QueryParameters.Count == 0) + { + return target; + } + var query = new StringBuilder(); + foreach (KeyValuePair parameter in credential.QueryParameters) + { + if (query.Length > 0) + { + query.Append('&'); + } + query.Append(Uri.EscapeDataString(parameter.Key)).Append('=') + .Append(Uri.EscapeDataString(parameter.Value)); + } + var builder = new UriBuilder(target); + builder.Query = string.IsNullOrEmpty(builder.Query) + ? query.ToString() + : builder.Query.TrimStart('?') + "&" + query; + return builder.Uri; + } + + private readonly HttpClient m_client; + private readonly bool m_ownsClient; + private readonly bool m_manualRedirects; + private readonly ImmutableArray> m_defaultHeaders; + private readonly WotExecutorContext m_context; + private readonly HttpWotBindingOptions m_options; + private readonly IWotPayloadCodec m_codec; + private readonly string m_baseTarget; + private WotCredential? m_credential; + private readonly Lock m_credentialLock = new(); + private Task? m_credentialTask; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingExecutor.cs b/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingExecutor.cs new file mode 100644 index 0000000000..2cc73e0e24 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingExecutor.cs @@ -0,0 +1,128 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Http +{ + /// + /// Executes HTTP / HTTPS WoT binding forms compiled by the + /// . It opens a per-form + /// using an injectable + /// factory. + /// + public sealed class HttpWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new HTTP executor. + /// + public HttpWotBindingExecutor(HttpWotBindingOptions? options = null) + { + m_options = options ?? new HttpWotBindingOptions(); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.http", "1.1", HttpBindingPlanner.BindingUri, "W3C WoT HTTP Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + if (form is null) + { + return false; + } + return string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal) && + (string.Equals(form.Endpoint.Scheme, "http", StringComparison.OrdinalIgnoreCase) || + string.Equals(form.Endpoint.Scheme, "https", StringComparison.OrdinalIgnoreCase)); + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "The client and channel are owned by the returned channel, disposed via DisposeAsync.")] + public ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + ImmutableArray> defaultHeaders = + SnapshotDefaultHeaders(m_options.DefaultHeaders); + Func? clientFactory = m_options.ClientFactory; + bool ownsClient = clientFactory is null; + if (!ownsClient && !m_options.CallerClientHandlesRedirectSafety) + { + // Fail closed: the executor cannot control a caller-supplied client's + // redirect handler, cookie jar, DefaultRequestHeaders or later + // mutations. Require explicit confirmation even when the current form + // and options appear not to carry credentials. + throw new InvalidOperationException( + "Every caller-supplied HttpClient requires " + + "HttpWotBindingOptions.CallerClientHandlesRedirectSafety to be set. The supplied client must " + + "disable automatic redirects, or follow them without forwarding cookies or credentials " + + "across origins, " + + "because its handler, cookie behavior, mutable DefaultRequestHeaders and later mutations " + + "are outside the executor's control."); + } + HttpClient client = ownsClient + ? new HttpClient(new HttpClientHandler + { + AllowAutoRedirect = false, + UseCookies = false, + CheckCertificateRevocationList = true + }) + : clientFactory!.Invoke(); + IWotBindingChannel channel = new HttpWotBindingChannel( + client, ownsClient, manualRedirects: ownsClient, defaultHeaders, form, context, m_options); + return new ValueTask(channel); + } + + private static ImmutableArray> SnapshotDefaultHeaders( + IReadOnlyDictionary? defaultHeaders) + { + return defaultHeaders is null + ? [] + : ImmutableArray.CreateRange(defaultHeaders); + } + + private readonly HttpWotBindingOptions m_options; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingOptions.cs b/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingOptions.cs new file mode 100644 index 0000000000..29c55285f2 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Http/HttpWotBindingOptions.cs @@ -0,0 +1,112 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Net.Http; + +namespace Opc.Ua.WotCon.Bindings.Http +{ + /// + /// Options for the HTTP WoT binding executor. The client factory is injectable + /// so callers can supply a pooled, mutually-authenticated or test + /// ; when none is supplied the executor owns a private + /// client. Default headers are applied to every request in addition to any + /// credential the provider resolves and are treated as sensitive by the + /// redirect policy. + /// + public sealed class HttpWotBindingOptions + { + /// + /// Gets or sets the factory that supplies the . When + /// null the executor creates and owns a private client whose handler + /// disables automatic redirects and ambient cookie handling, so the executor + /// can apply a bounded, origin-aware redirect policy that never leaks + /// credentials across origins. A supplied client is treated as caller-owned + /// and is never disposed or mutated by the executor. Every supplied client + /// must satisfy + /// , regardless of the + /// currently configured headers or form security. + /// + public Func? ClientFactory { get; set; } + + /// + /// Gets or sets default headers applied to requests on the original origin + /// and any same-origin redirect. All configured headers are treated as + /// sensitive and are stripped from cross-origin redirects. The collection is + /// copied into immutable per-channel state during activation; later changes + /// to this property or its original collection do not affect an active + /// channel. + /// + public IReadOnlyDictionary? DefaultHeaders { get; set; } + + /// + /// Gets or sets the poll interval used for observe / event operations. + /// + public TimeSpan ObserveInterval { get; set; } = TimeSpan.FromSeconds(1); + + /// + /// Gets or sets the retry policy applied after consecutive unhealthy polls during an + /// observe operation. Defaults to the stack's exponential backoff + /// (, 500 ms doubling to 30 s), so an + /// asset that has gone offline is not polled once per interval. The backoff never polls + /// faster than . + /// + public IChannelReconnectPolicy? RetryPolicy { get; set; } + + /// + /// Gets or sets the maximum number of redirects the executor-owned client + /// follows for a single request. The default is 5; 0 disables + /// redirect following entirely. Default headers and custom header / query + /// credentials are stripped whenever a redirect crosses to a different + /// origin. + /// + public int MaxAutomaticRedirects { get; set; } = 5; + + /// + /// Gets or sets whether the executor-owned client may follow a redirect that + /// downgrades the scheme from https to http. The default is + /// false: an insecure downgrade is refused. + /// + public bool AllowInsecureRedirectDowngrade { get; set; } + + /// + /// Gets or sets whether a caller-supplied is trusted + /// to handle redirects safely. The default is false: every + /// caller-supplied client fails closed because the executor cannot inspect or + /// control its redirect handler, automatic cookie handling and + /// , mutable + /// , or later caller + /// mutations. Set to true only when the supplied client is known to + /// disable automatic redirects, or to follow them without forwarding + /// credentials to a different origin. + /// + public bool CallerClientHandlesRedirectSafety { get; set; } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Http/OpcUaHttpWotBindingBuilderExtensions.cs b/src/Opc.Ua.WotCon.Bindings/Http/OpcUaHttpWotBindingBuilderExtensions.cs new file mode 100644 index 0000000000..32029a4b38 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Http/OpcUaHttpWotBindingBuilderExtensions.cs @@ -0,0 +1,61 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Opc.Ua; +using Opc.Ua.WotCon.Bindings.Http; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// extensions that register the HTTP WoT binding + /// executor alongside the shipped planner binders. + /// + public static class OpcUaHttpWotBindingBuilderExtensions + { + /// + /// Registers the eight shipped planner binders and the HTTP executor, so + /// HTTP binding forms are validated, compiled and executable. + /// + /// + public static IOpcUaBuilder AddHttpWotBinding( + this IOpcUaBuilder builder, Action? configure = null) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + var options = new HttpWotBindingOptions(); + configure?.Invoke(options); + return builder + .AddWotProtocolBinders() + .AddWotBindingExecutor(new HttpWotBindingExecutor(options)); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotBinderRegistry.cs b/src/Opc.Ua.WotCon.Bindings/IWotBinderRegistry.cs new file mode 100644 index 0000000000..594efd12db --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotBinderRegistry.cs @@ -0,0 +1,123 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The runtime-neutral binder seam the materialization coordinator uses to + /// discover binding capabilities and to prepare / activate / deactivate + /// bindings around a projection. Concrete binders and executors are registered + /// with ; the default + /// reports no binders, so every form is + /// unsupported (strict closures fail; non-strict closures materialize degraded + /// nodes with ). + /// + public interface IWotBinderRegistry + { + /// + /// Gets the binding capability snapshots advertised by the registry. + /// + IReadOnlyList Capabilities { get; } + + /// + /// Validates and compiles a resource's forms into an immutable binding + /// plan. Prepare is side-effect free: it classifies forms as supported or + /// unsupported and compiles supported forms, but never performs transport + /// I/O. + /// + WotBindingPlan Prepare(WotBindingPlanRequest request); + + /// + /// Activates a prepared plan after the projection has been committed as the + /// active generation. + /// + ValueTask ActivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default); + + /// + /// Deactivates a plan when its projection is retired. + /// + ValueTask DeactivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default); + } + + /// + /// The default binder registry: it advertises no capabilities and treats every + /// form as unsupported. It provides the "no concrete network protocol" + /// baseline used when no binders are registered. + /// + public sealed class NullWotBinderRegistry : IWotBinderRegistry + { + /// + /// Gets the shared instance. + /// + public static NullWotBinderRegistry Instance { get; } = new NullWotBinderRegistry(); + + /// + public IReadOnlyList Capabilities { get; } + = []; + + /// + public WotBindingPlan Prepare(WotBindingPlanRequest request) + { + if (request is null) + { + throw new ArgumentNullException(nameof(request)); + } + if (request.Forms.IsEmpty) + { + return WotBindingPlan.Empty; + } + return new WotBindingPlan( + request.ResourceXid, + [], + [], + request.Forms, + [WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.NonExecutableBinding, + "No binder is registered; affordance forms are materialized as " + + "degraded nodes (BadConfigurationError) or fail a strict closure.")]); + } + + /// + public ValueTask ActivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + return default; + } + + /// + public ValueTask DeactivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + return default; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotBindingChannelFactory.cs b/src/Opc.Ua.WotCon.Bindings/IWotBindingChannelFactory.cs new file mode 100644 index 0000000000..24c1c601fc --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotBindingChannelFactory.cs @@ -0,0 +1,59 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The runtime-neutral seam a projection binding runtime uses to open a live + /// channel for a compiled, executable form. It is deliberately narrower than + /// : consumers that only drive live value + /// exchange (for example an OPC UA target-mapping runtime wired onto a + /// materialized NodeSet) depend on this interface instead of the full + /// registry so they cannot accidentally reach into Prepare/Activate/Deactivate + /// lifecycle concerns that belong to the materialization coordinator. + /// + public interface IWotBindingChannelFactory + { + /// + /// Opens a live channel for an executable compiled form using the + /// implementation's credential provider, codecs and safety bounds. + /// + /// The compiled, executable form to activate. + /// The cancellation token. + /// is null. + /// + /// No executor is registered for the form's binding. + /// + ValueTask OpenChannelAsync( + WotCompiledForm form, CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotBindingExecutor.cs b/src/Opc.Ua.WotCon.Bindings/IWotBindingExecutor.cs new file mode 100644 index 0000000000..1e8def508c --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotBindingExecutor.cs @@ -0,0 +1,293 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Runtime context handed to an executor while it activates a compiled form: + /// the credential provider used to resolve secret-free references and the + /// safety bounds it must enforce. + /// + public sealed class WotExecutorContext + { + /// + /// Initializes a new executor context. + /// + public WotExecutorContext( + IWotCredentialProvider? credentials = null, + IWotCodecRegistry? codecs = null, + WotBindingBounds? bounds = null) + { + Credentials = credentials ?? NullWotCredentialProvider.Instance; + Codecs = codecs ?? WotPayloadCodecRegistry.Default; + Bounds = bounds ?? WotBindingBounds.Default; + } + + /// + /// Gets the credential provider. + /// + public IWotCredentialProvider Credentials { get; } + + /// + /// Gets the codec registry. + /// + public IWotCodecRegistry Codecs { get; } + + /// + /// Gets the enforced safety bounds. + /// + public WotBindingBounds Bounds { get; } + } + + /// + /// A push notification from an observe / event channel. + /// + public sealed class WotNotification + { + /// + /// Initializes a new notification. + /// + /// + /// The notified value. For a property observe this is the reported + /// . For an event this is a deterministic + /// projection of the event (see for the full + /// per-field envelope) carrying the mapped and + /// the event's source / receive timestamps. + /// + /// + /// The optional event field envelope: every EventFilter + /// select-clause field (browse path, '/'-joined for nested paths) + /// mapped to its own . Empty for a property + /// observe notification. + /// + public WotNotification( + DataValue value, IReadOnlyDictionary? eventFields = null) + { + Value = value; + EventFields = eventFields ?? ImmutableDictionary.Empty; + } + + /// + /// Gets the notified value together with its status and timestamps. + /// + public DataValue Value { get; } + + /// + /// Gets the event field envelope, keyed by the select-clause browse + /// path. Empty for a property observe notification. + /// + public IReadOnlyDictionary EventFields { get; } + } + + /// + /// The result of a read operation. + /// + public sealed class WotReadResult + { + /// + /// Initializes a new read result. + /// + public WotReadResult(StatusCode status, DataValue value, string? error = null) + { + Status = status; + Value = value; + Error = error; + } + + /// + /// Gets the mapped status code. + /// + public StatusCode Status { get; } + + /// + /// Gets the read value with status and timestamps. + /// + public DataValue Value { get; } + + /// + /// Gets the error message on failure, if any. + /// + public string? Error { get; } + + /// + /// Gets whether the operation succeeded. + /// + public bool Success => StatusCode.IsGood(Status); + } + + /// + /// The result of a write operation. + /// + public sealed class WotWriteResult + { + /// + /// Initializes a new write result. + /// + public WotWriteResult(StatusCode status, string? error = null) + { + Status = status; + Error = error; + } + + /// + /// Gets the mapped status code. + /// + public StatusCode Status { get; } + + /// + /// Gets the error message on failure, if any. + /// + public string? Error { get; } + + /// + /// Gets whether the operation succeeded. + /// + public bool Success => StatusCode.IsGood(Status); + } + + /// + /// The result of an action invocation. + /// + public sealed class WotInvokeResult + { + /// + /// Initializes a new invoke result. + /// + public WotInvokeResult(StatusCode status, IReadOnlyList? outputs = null, string? error = null) + { + Status = status; + Outputs = outputs ?? []; + Error = error; + } + + /// + /// Gets the mapped status code. + /// + public StatusCode Status { get; } + + /// + /// Gets the action outputs in declaration order. + /// + public IReadOnlyList Outputs { get; } + + /// + /// Gets the error message on failure, if any. + /// + public string? Error { get; } + + /// + /// Gets whether the operation succeeded. + /// + public bool Success => StatusCode.IsGood(Status); + } + + /// + /// A running observe / event subscription. Disposing it stops delivery. + /// + public interface IWotSubscription : IAsyncDisposable + { + /// + /// Gets the compiled form the subscription observes. + /// + WotCompiledForm Form { get; } + } + + /// + /// A live per-form binding channel opened by an executor. It exposes the + /// read / write / invoke / observe / event operations the binding supports. + /// Operations not supported by the channel's compiled operation return a + /// result. Disposing the channel + /// releases the underlying transport resource. + /// + public interface IWotBindingChannel : IAsyncDisposable + { + /// + /// Gets the compiled form the channel binds. + /// + WotCompiledForm Form { get; } + + /// + /// Reads the current value. + /// + ValueTask ReadAsync(CancellationToken cancellationToken = default); + + /// + /// Writes a value. + /// + ValueTask WriteAsync(DataValue value, CancellationToken cancellationToken = default); + + /// + /// Invokes an action with ordered inputs. + /// + ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default); + + /// + /// Observes property-value changes. + /// + ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default); + + /// + /// Subscribes to events. + /// + ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default); + } + + /// + /// Executes a compiled binding form against a live transport. Executors are + /// registered independently from planners so a protocol can be validated + /// without an executor and executed once one is present. + /// + public interface IWotBindingExecutor + { + /// + /// Gets the identity of the binder this executor serves. + /// + WotBindingIdentity Identity { get; } + + /// + /// Gets whether the executor can run the supplied compiled form. + /// + bool CanExecute(WotCompiledForm form); + + /// + /// Opens a live channel for the supplied compiled form. + /// + ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/IWotBindingPlanner.cs new file mode 100644 index 0000000000..41bf99397b --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotBindingPlanner.cs @@ -0,0 +1,303 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Linq; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Read-only context handed to a planner while it validates and compiles a + /// form. It exposes the document security definitions (secret-free), the codec + /// registry, the document kind, the Thing base URI for relative href + /// resolution and the applied safety bounds. + /// + public sealed class WotBindingPlanContext + { + /// + /// Initializes a new plan context. + /// + public WotBindingPlanContext( + ImmutableDictionary? securityDefinitions = null, + IWotCodecRegistry? codecs = null, + WoTDocumentKindEnum documentKind = WoTDocumentKindEnum.ThingDescription, + string? baseUri = null, + WotBindingBounds? bounds = null) + { + SecurityDefinitions = securityDefinitions ?? []; + Codecs = codecs ?? WotPayloadCodecRegistry.Default; + DocumentKind = documentKind; + BaseUri = baseUri; + Bounds = bounds ?? WotBindingBounds.Default; + } + + /// + /// Gets the secret-free security definitions declared by the document. + /// + public ImmutableDictionary SecurityDefinitions { get; } + + /// + /// Gets the codec registry used to select payload codecs. + /// + public IWotCodecRegistry Codecs { get; } + + /// + /// Gets the document kind being compiled. + /// + public WoTDocumentKindEnum DocumentKind { get; } + + /// + /// Gets the Thing base URI used to resolve relative hrefs, if any. + /// + public string? BaseUri { get; } + + /// + /// Gets the applied safety bounds. + /// + public WotBindingBounds Bounds { get; } + } + + /// + /// The immutable compiled plan for one supported (form, operation) pair. It + /// carries the endpoint, addressing, operation and payload metadata plus the + /// secret-free credential references the runtime resolves at activation time. + /// A non-executable entry is a validated plan for which no runtime executor is + /// available (for example a BACnet, PROFINET or LoRaWAN binding). + /// + public sealed class WotCompiledForm + { + /// + /// Initializes a new immutable compiled form. + /// + public WotCompiledForm( + WotBindingIdentity binding, + WotAffordanceKind affordanceKind, + string affordanceName, + string jsonPointer, + WoTBindingCapabilityEnum operation, + string opToken, + WotEndpointDescriptor endpoint, + WotAddressingDescriptor addressing, + WotOperationDescriptor operationInfo, + WotPayloadDescriptor payload, + ImmutableArray security, + bool isExecutable, + WotTargetMappingDescriptor? targetMapping = null) + { + Binding = binding ?? throw new ArgumentNullException(nameof(binding)); + AffordanceKind = affordanceKind; + AffordanceName = affordanceName ?? string.Empty; + JsonPointer = jsonPointer ?? string.Empty; + Operation = operation; + OpToken = opToken ?? string.Empty; + Endpoint = endpoint ?? throw new ArgumentNullException(nameof(endpoint)); + Addressing = addressing ?? throw new ArgumentNullException(nameof(addressing)); + OperationInfo = operationInfo ?? throw new ArgumentNullException(nameof(operationInfo)); + Payload = payload ?? throw new ArgumentNullException(nameof(payload)); + Security = security.IsDefault ? [] : security; + IsExecutable = isExecutable; + TargetMapping = targetMapping ?? WotTargetMappingDescriptor.Empty; + } + + /// + /// Gets the identity of the binder that compiled the form. + /// + public WotBindingIdentity Binding { get; } + + /// + /// Gets the affordance kind. + /// + public WotAffordanceKind AffordanceKind { get; } + + /// + /// Gets the affordance name. + /// + public string AffordanceName { get; } + + /// + /// Gets the JSON Pointer of the originating form. + /// + public string JsonPointer { get; } + + /// + /// Gets the resolved capability operation. + /// + public WoTBindingCapabilityEnum Operation { get; } + + /// + /// Gets the originating WoT op token. + /// + public string OpToken { get; } + + /// + /// Gets the compiled endpoint metadata. + /// + public WotEndpointDescriptor Endpoint { get; } + + /// + /// Gets the compiled addressing metadata. + /// + public WotAddressingDescriptor Addressing { get; } + + /// + /// Gets the compiled operation metadata. + /// + public WotOperationDescriptor OperationInfo { get; } + + /// + /// Gets the compiled payload metadata. + /// + public WotPayloadDescriptor Payload { get; } + + /// + /// Gets the secret-free credential references for the operation. + /// + public ImmutableArray Security { get; } + + /// + /// Gets whether a runtime executor is available for the entry. + /// + public bool IsExecutable { get; } + + /// + /// Gets the protocol-neutral OPC 10101 §6.5.4 target-mapping descriptor + /// carried from the originating property affordance. It is empty unless + /// the affordance authors uav:mapToNodeId, uav:mapToType or + /// uav:mapByFieldPath. + /// + public WotTargetMappingDescriptor TargetMapping { get; } + + /// + /// Returns a copy of this entry with the supplied executability. + /// + public WotCompiledForm WithExecutable(bool isExecutable) + { + if (isExecutable == IsExecutable) + { + return this; + } + return new WotCompiledForm( + Binding, AffordanceKind, AffordanceName, JsonPointer, Operation, OpToken, + Endpoint, Addressing, OperationInfo, Payload, Security, isExecutable, TargetMapping); + } + + /// + /// Returns a copy of this entry with the supplied target-mapping descriptor. + /// + /// + public WotCompiledForm WithTargetMapping(WotTargetMappingDescriptor targetMapping) + { + if (targetMapping is null) + { + throw new ArgumentNullException(nameof(targetMapping)); + } + if (ReferenceEquals(targetMapping, TargetMapping)) + { + return this; + } + return new WotCompiledForm( + Binding, AffordanceKind, AffordanceName, JsonPointer, Operation, OpToken, + Endpoint, Addressing, OperationInfo, Payload, Security, IsExecutable, targetMapping); + } + } + + /// + /// The result of compiling a single form with a binder: the compiled entries + /// (one per supported operation), the structured diagnostics and whether the + /// form was validated (supported) at all. + /// + public sealed class WotBindingCompilation + { + /// + /// Initializes a new compilation result. + /// + public WotBindingCompilation( + bool isSupported, + ImmutableArray entries, + ImmutableArray diagnostics) + { + IsSupported = isSupported; + Entries = entries.IsDefault ? [] : entries; + Diagnostics = diagnostics.IsDefault ? [] : diagnostics; + } + + /// + /// Gets whether the form was validated and compiled. A supported form has + /// at least one compiled entry and no error diagnostics. + /// + public bool IsSupported { get; } + + /// + /// Gets the compiled entries. + /// + public ImmutableArray Entries { get; } + + /// + /// Gets the structured diagnostics. + /// + public ImmutableArray Diagnostics { get; } + + /// + /// Gets whether any error diagnostic was produced. + /// + public bool HasErrors => Diagnostics.Any(d => d.IsError); + + /// + /// Creates an unsupported result (a binder declined or rejected the form). + /// + public static WotBindingCompilation Unsupported(params WotBindingDiagnostic[] diagnostics) + { + return new WotBindingCompilation(false, [], + diagnostics is null ? [] : [.. diagnostics]); + } + + /// + /// Creates a supported result. + /// + public static WotBindingCompilation Supported( + ImmutableArray entries, ImmutableArray diagnostics) + { + return new WotBindingCompilation(true, entries, diagnostics); + } + } + + /// + /// Validates and compiles WoT interaction forms into immutable binding plans. + /// A planner performs no transport I/O, so a planner-only binder can validate + /// and compile forms for protocols the runtime cannot execute. + /// + public interface IWotBindingPlanner + { + /// + /// Validates and compiles a single form into a binding plan. + /// + WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context); + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotCredentialProvider.cs b/src/Opc.Ua.WotCon.Bindings/IWotCredentialProvider.cs new file mode 100644 index 0000000000..1cff3a18df --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotCredentialProvider.cs @@ -0,0 +1,364 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Security.Cryptography.X509Certificates; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The WoT security scheme kind referenced by a form (no secrets). + /// + public enum WotSecurityScheme + { + /// + /// No security (nosec). + /// + NoSecurity, + + /// + /// HTTP Basic authentication. + /// + Basic, + + /// + /// HTTP Digest authentication. + /// + Digest, + + /// + /// Bearer token authentication. + /// + Bearer, + + /// + /// API-key authentication. + /// + ApiKey, + + /// + /// Pre-shared-key authentication. + /// + Psk, + + /// + /// OAuth 2.0 authentication. + /// + OAuth2, + + /// + /// Automatic security provisioned out-of-band. + /// + Auto, + + /// + /// A combination of other schemes. + /// + Combo, + + /// + /// A scheme not otherwise enumerated. + /// + Other + } + + /// + /// An immutable, secret-free security definition parsed from a Thing + /// Description securityDefinitions entry. It records only the scheme + /// kind and where the credential is carried (for example an HTTP header + /// name); the actual secret is never present in the document or on registry + /// nodes and is resolved at runtime by an . + /// + public sealed class WotSecurityDefinition + { + /// + /// The well-known no-security definition. + /// + public static WotSecurityDefinition NoSecurity { get; } = + new WotSecurityDefinition("nosec_sc", WotSecurityScheme.NoSecurity, null, null); + + /// + /// Initializes a new immutable security definition. + /// + public WotSecurityDefinition(string name, WotSecurityScheme scheme, string? @in, string? parameterName) + { + Name = name ?? string.Empty; + Scheme = scheme; + In = @in; + ParameterName = parameterName; + } + + /// + /// Gets the definition name (the scheme reference used by forms). + /// + public string Name { get; } + + /// + /// Gets the security scheme kind. + /// + public WotSecurityScheme Scheme { get; } + + /// + /// Gets where the credential is carried (header, query, ...). + /// + public string? In { get; } + + /// + /// Gets the parameter name (for example the header name), if any. + /// + public string? ParameterName { get; } + + /// + /// Parses a securityDefinitions entry into a definition. + /// + public static WotSecurityDefinition Parse(string name, JsonElement definition) + { + WotSecurityScheme scheme = WotSecurityScheme.Other; + string? @in = null; + string? parameterName = null; + if (definition.ValueKind == JsonValueKind.Object) + { + if (definition.TryGetProperty("scheme", out JsonElement schemeElement) && + schemeElement.ValueKind == JsonValueKind.String) + { + scheme = MapScheme(schemeElement.GetString()); + } + if (definition.TryGetProperty("in", out JsonElement inElement) && + inElement.ValueKind == JsonValueKind.String) + { + @in = inElement.GetString(); + } + if (definition.TryGetProperty("name", out JsonElement nameElement) && + nameElement.ValueKind == JsonValueKind.String) + { + parameterName = nameElement.GetString(); + } + } + return new WotSecurityDefinition(name, scheme, @in, parameterName); + } + + private static WotSecurityScheme MapScheme(string? scheme) + { + return scheme switch + { + "nosec" => WotSecurityScheme.NoSecurity, + "basic" => WotSecurityScheme.Basic, + "digest" => WotSecurityScheme.Digest, + "bearer" => WotSecurityScheme.Bearer, + "apikey" => WotSecurityScheme.ApiKey, + "psk" => WotSecurityScheme.Psk, + "oauth2" => WotSecurityScheme.OAuth2, + "auto" => WotSecurityScheme.Auto, + "combo" => WotSecurityScheme.Combo, + _ => WotSecurityScheme.Other + }; + } + } + + /// + /// A secret-free reference the runtime resolves against an out-of-band secret + /// store. It carries the scheme name and endpoint context so a provider can + /// select the correct credential without any secret ever appearing in the + /// Thing Description or on registry nodes. + /// + public sealed class WotCredentialReference + { + /// + /// Initializes a new immutable credential reference. + /// + public WotCredentialReference( + string schemeName, + WotSecurityScheme scheme, + string bindingUri, + string? endpoint, + string? @in = null, + string? parameterName = null) + { + SchemeName = schemeName ?? string.Empty; + Scheme = scheme; + BindingUri = bindingUri ?? string.Empty; + Endpoint = endpoint; + In = @in; + ParameterName = parameterName; + } + + /// + /// Gets the referenced security scheme name. + /// + public string SchemeName { get; } + + /// + /// Gets the security scheme kind. + /// + public WotSecurityScheme Scheme { get; } + + /// + /// Gets the binding vocabulary URI requesting the credential. + /// + public string BindingUri { get; } + + /// + /// Gets the endpoint the credential is scoped to, if any. + /// + public string? Endpoint { get; } + + /// + /// Gets where the credential is carried, if known. + /// + public string? In { get; } + + /// + /// Gets the parameter / header name, if known. + /// + public string? ParameterName { get; } + + /// + /// Creates a reference from a security definition and endpoint. + /// + public static WotCredentialReference FromDefinition( + WotSecurityDefinition definition, string bindingUri, string? endpoint) + { + return new WotCredentialReference( + definition.Name, + definition.Scheme, + bindingUri, + endpoint, + definition.In, + definition.ParameterName); + } + } + + /// + /// Resolved credential material produced only at runtime by an + /// . Instances are short-lived and never + /// serialized to the Thing Description or registry nodes. The material is + /// expressed as headers, query parameters and opaque properties so it can + /// drive HTTP, MQTT and other transports uniformly. + /// + public sealed class WotCredential + { + /// + /// Initializes a new resolved credential. + /// + public WotCredential( + WotSecurityScheme scheme, + ImmutableDictionary? headers = null, + ImmutableDictionary? queryParameters = null, + ImmutableDictionary? properties = null, + X509Certificate2? clientCertificate = null, + IReadOnlyList? trustedCertificates = null) + { + Scheme = scheme; + Headers = headers ?? []; + QueryParameters = queryParameters ?? []; + Properties = properties ?? []; + ClientCertificate = clientCertificate; + TrustedCertificates = trustedCertificates is null + ? [] + : [.. trustedCertificates]; + } + + /// + /// Gets the scheme this credential satisfies. + /// + public WotSecurityScheme Scheme { get; } + + /// + /// Gets transport headers to apply (for example Authorization). + /// + public ImmutableDictionary Headers { get; } + + /// + /// Gets query parameters to apply (for example an API key). + /// + public ImmutableDictionary QueryParameters { get; } + + /// + /// Gets opaque credential properties (for example username / + /// password for MQTT, or a token reference id). + /// + public ImmutableDictionary Properties { get; } + + /// + /// Gets the resolved client certificate used for mutual TLS (for example + /// an mqtts connection), or null when none is configured. + /// Runtime-only material that is never serialized to the Thing Description + /// or registry nodes. + /// + public X509Certificate2? ClientCertificate { get; } + + /// + /// Gets the resolved trust anchors used to validate the peer's TLS + /// certificate (for example an mqtts broker). Empty when the + /// transport should rely on the platform default trust store. Runtime-only + /// material that is never serialized to the Thing Description or registry + /// nodes. + /// + public ImmutableArray TrustedCertificates { get; } + } + + /// + /// Resolves secret-free credential references into runtime credential + /// material. Implementations look the secret up in a trust / secret store + /// out-of-band; the Thing Description and registry nodes only ever carry the + /// scheme reference. + /// + public interface IWotCredentialProvider + { + /// + /// Resolves a credential for the supplied reference, or null when + /// no credential is required (for example nosec) or none is + /// configured. + /// + ValueTask ResolveAsync( + WotCredentialReference reference, CancellationToken cancellationToken = default); + } + + /// + /// A credential provider that resolves nothing (no security). + /// + public sealed class NullWotCredentialProvider : IWotCredentialProvider + { + /// + /// Gets the shared instance. + /// + public static NullWotCredentialProvider Instance { get; } = new NullWotCredentialProvider(); + + /// + public ValueTask ResolveAsync( + WotCredentialReference reference, CancellationToken cancellationToken = default) + { + return new ValueTask((WotCredential?)null); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotPayloadCodec.cs b/src/Opc.Ua.WotCon.Bindings/IWotPayloadCodec.cs new file mode 100644 index 0000000000..3bcd171bd2 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotPayloadCodec.cs @@ -0,0 +1,453 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Text.Json; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The result of encoding a value to a payload. + /// + public sealed class WotEncodeResult + { + private WotEncodeResult(bool success, ReadOnlyMemory data, string? error) + { + Success = success; + Data = data; + Error = error; + } + + /// + /// Gets whether encoding succeeded. + /// + public bool Success { get; } + + /// + /// Gets the encoded bytes. + /// + public ReadOnlyMemory Data { get; } + + /// + /// Gets the error message on failure. + /// + public string? Error { get; } + + /// + /// Creates a successful encode result. + /// + public static WotEncodeResult Ok(ReadOnlyMemory data) + { + return new WotEncodeResult(true, data, null); + } + + /// + /// Creates a failed encode result. + /// + public static WotEncodeResult Fail(string error) + { + return new WotEncodeResult(false, ReadOnlyMemory.Empty, error); + } + } + + /// + /// The result of decoding a payload to a value. + /// + public sealed class WotDecodeResult + { + private WotDecodeResult(bool success, Variant value, string? error) + { + Success = success; + Value = value; + Error = error; + } + + /// + /// Gets whether decoding succeeded. + /// + public bool Success { get; } + + /// + /// Gets the decoded value. + /// + public Variant Value { get; } + + /// + /// Gets the error message on failure. + /// + public string? Error { get; } + + /// + /// Creates a successful decode result. + /// + public static WotDecodeResult Ok(Variant value) + { + return new WotDecodeResult(true, value, null); + } + + /// + /// Creates a failed decode result. + /// + public static WotDecodeResult Fail(string error) + { + return new WotDecodeResult(false, Variant.Null, error); + } + } + + /// + /// Encodes and decodes payloads between OPC UA values and transport bytes for + /// a content type. Codecs are reflection-free and AOT-safe. + /// + public interface IWotPayloadCodec + { + /// + /// Gets the stable codec id (recorded on the compiled plan). + /// + string Id { get; } + + /// + /// Gets whether the codec handles the supplied content type. + /// + bool CanHandle(string? contentType); + + /// + /// Encodes a value to bytes for the supplied payload metadata. + /// + WotEncodeResult Encode(Variant value, WotPayloadDescriptor payload); + + /// + /// Decodes bytes into a value for the supplied payload metadata. + /// + WotDecodeResult Decode(ReadOnlyMemory data, WotPayloadDescriptor payload); + } + + /// + /// Selects a payload codec for a content type. + /// + public interface IWotCodecRegistry + { + /// + /// Attempts to select a codec for the supplied content type. + /// + bool TrySelect(string? contentType, out IWotPayloadCodec codec); + } + + /// + /// The default codec registry: it selects the first registered codec whose + /// returns true, and + /// ships JSON, plain-text and octet-stream codecs. Additional codecs can be + /// registered by protocol executors. + /// + public sealed class WotPayloadCodecRegistry : IWotCodecRegistry + { + /// + /// Initializes a registry with the built-in codecs. + /// + public WotPayloadCodecRegistry() + { + m_codecs.Add(JsonWotPayloadCodec.Instance); + m_codecs.Add(TextWotPayloadCodec.Instance); + m_codecs.Add(OctetStreamWotPayloadCodec.Instance); + } + + /// + /// Gets the shared registry with the built-in codecs. + /// + public static WotPayloadCodecRegistry Default { get; } = new WotPayloadCodecRegistry(); + + /// + /// Registers a codec at the front of the selection order. + /// + /// + public WotPayloadCodecRegistry Register(IWotPayloadCodec codec) + { + if (codec is null) + { + throw new ArgumentNullException(nameof(codec)); + } + m_codecs.Insert(0, codec); + return this; + } + + /// + public bool TrySelect(string? contentType, out IWotPayloadCodec codec) + { + foreach (IWotPayloadCodec candidate in m_codecs) + { + if (candidate.CanHandle(contentType)) + { + codec = candidate; + return true; + } + } + codec = JsonWotPayloadCodec.Instance; + return false; + } + + private readonly List m_codecs = []; + } + + /// + /// A reflection-free JSON scalar payload codec (application/json). + /// + public sealed class JsonWotPayloadCodec : IWotPayloadCodec + { + /// + /// Gets the shared instance. + /// + public static JsonWotPayloadCodec Instance { get; } = new JsonWotPayloadCodec(); + + /// + public string Id => "json"; + + /// + public bool CanHandle(string? contentType) + { + if (string.IsNullOrEmpty(contentType)) + { + return true; + } + string media = MediaType(contentType!); + return media.Equals("application/json", StringComparison.OrdinalIgnoreCase) || + media.EndsWith("+json", StringComparison.OrdinalIgnoreCase); + } + + /// + public WotEncodeResult Encode(Variant value, WotPayloadDescriptor payload) + { + try + { + using var buffer = new MemoryStream(); + using (var writer = new Utf8JsonWriter(buffer)) + { + WriteValue(writer, value.AsBoxedObject()); + } + return WotEncodeResult.Ok(buffer.ToArray()); + } + catch (Exception ex) when (ex is JsonException or InvalidOperationException or NotSupportedException) + { + return WotEncodeResult.Fail(ex.Message); + } + } + + /// + public WotDecodeResult Decode(ReadOnlyMemory data, WotPayloadDescriptor payload) + { + if (data.IsEmpty) + { + return WotDecodeResult.Ok(Variant.Null); + } + try + { + using var document = JsonDocument.Parse(data); + JsonElement root = document.RootElement; + switch (root.ValueKind) + { + case JsonValueKind.True: + case JsonValueKind.False: + return WotDecodeResult.Ok(new Variant(root.GetBoolean())); + case JsonValueKind.String: + return WotDecodeResult.Ok(new Variant(root.GetString() ?? string.Empty)); + case JsonValueKind.Null: + return WotDecodeResult.Ok(Variant.Null); + case JsonValueKind.Number: + if (root.TryGetInt64(out long l)) + { + return WotDecodeResult.Ok(new Variant(l)); + } + if (root.TryGetDouble(out double d)) + { + return WotDecodeResult.Ok(new Variant(d)); + } + return WotDecodeResult.Ok(new Variant(root.GetRawText())); + default: + // Objects and arrays are preserved as their raw JSON text. + return WotDecodeResult.Ok(new Variant(root.GetRawText())); + } + } + catch (JsonException ex) + { + return WotDecodeResult.Fail(ex.Message); + } + } + + private static void WriteValue(Utf8JsonWriter writer, object? value) + { + switch (value) + { + case null: + writer.WriteNullValue(); + break; + case bool b: + writer.WriteBooleanValue(b); + break; + case string s: + writer.WriteStringValue(s); + break; + case sbyte sb: + writer.WriteNumberValue(sb); + break; + case byte by: + writer.WriteNumberValue(by); + break; + case short sh: + writer.WriteNumberValue(sh); + break; + case ushort us: + writer.WriteNumberValue(us); + break; + case int i: + writer.WriteNumberValue(i); + break; + case uint ui: + writer.WriteNumberValue(ui); + break; + case long lo: + writer.WriteNumberValue(lo); + break; + case ulong ul: + writer.WriteNumberValue(ul); + break; + case float f: + writer.WriteNumberValue(f); + break; + case double dou: + writer.WriteNumberValue(dou); + break; + case decimal de: + writer.WriteNumberValue(de); + break; + default: + writer.WriteStringValue(Convert.ToString(value, CultureInfo.InvariantCulture)); + break; + } + } + + private static string MediaType(string contentType) + { + int semicolon = -1; + for (int i = 0; i < contentType.Length; i++) + { + if (contentType[i] == ';') + { + semicolon = i; + break; + } + } + return (semicolon >= 0 ? contentType[..semicolon] : contentType).Trim(); + } + } + + /// + /// A plain-text payload codec (text/plain). + /// + public sealed class TextWotPayloadCodec : IWotPayloadCodec + { + /// + /// Gets the shared instance. + /// + public static TextWotPayloadCodec Instance { get; } = new TextWotPayloadCodec(); + + /// + public string Id => "text"; + + /// + public bool CanHandle(string? contentType) + { + return !string.IsNullOrEmpty(contentType) && + contentType!.StartsWith("text/", StringComparison.OrdinalIgnoreCase); + } + + /// + public WotEncodeResult Encode(Variant value, WotPayloadDescriptor payload) + { + object? boxed = value.AsBoxedObject(); + string text = boxed is null + ? string.Empty + : Convert.ToString(boxed, CultureInfo.InvariantCulture) ?? string.Empty; + return WotEncodeResult.Ok(Encoding.UTF8.GetBytes(text)); + } + + /// + public WotDecodeResult Decode(ReadOnlyMemory data, WotPayloadDescriptor payload) + { + string text = Encoding.UTF8.GetString(data.ToArray()); + return WotDecodeResult.Ok(new Variant(text)); + } + } + + /// + /// An octet-stream payload codec (application/octet-stream). + /// + public sealed class OctetStreamWotPayloadCodec : IWotPayloadCodec + { + /// + /// Gets the shared instance. + /// + public static OctetStreamWotPayloadCodec Instance { get; } = new OctetStreamWotPayloadCodec(); + + /// + public string Id => "octet-stream"; + + /// + public bool CanHandle(string? contentType) + { + return !string.IsNullOrEmpty(contentType) && + contentType!.StartsWith("application/octet-stream", StringComparison.OrdinalIgnoreCase); + } + + /// + public WotEncodeResult Encode(Variant value, WotPayloadDescriptor payload) + { + if (value.TryGetValue(out ByteString byteString)) + { + return WotEncodeResult.Ok(byteString.Memory.ToArray()); + } + object? boxed = value.AsBoxedObject(); + if (boxed is byte[] bytes) + { + return WotEncodeResult.Ok(bytes); + } + string text = boxed is null + ? string.Empty + : Convert.ToString(boxed, CultureInfo.InvariantCulture) ?? string.Empty; + return WotEncodeResult.Ok(Encoding.UTF8.GetBytes(text)); + } + + /// + public WotDecodeResult Decode(ReadOnlyMemory data, WotPayloadDescriptor payload) + { + return WotDecodeResult.Ok(new Variant(new ByteString(data.ToArray()))); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/IWotProtocolBinder.cs b/src/Opc.Ua.WotCon.Bindings/IWotProtocolBinder.cs new file mode 100644 index 0000000000..a0c167f4eb --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/IWotProtocolBinder.cs @@ -0,0 +1,353 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// A replaceable protocol binder: the composition of a stable identity, a + /// capability snapshot, deterministic identification and a planner. Binders + /// are injected independently and selected by identity and pinned rules, so + /// multiple versions of the same binding can coexist. Concrete executors are + /// registered separately, so a binder can validate and compile plans for + /// protocols the runtime cannot execute. + /// + public interface IWotProtocolBinder + { + /// + /// Gets the stable binder identity (id + version). + /// + WotBindingIdentity Identity { get; } + + /// + /// Gets the version-pinned capability snapshot. + /// + WotBindingCapability Capability { get; } + + /// + /// Gets the deterministic identification rules. + /// + IWotBindingIdentification Identification { get; } + + /// + /// Gets the form validator / compiler. + /// + IWotBindingPlanner Planner { get; } + } + + /// + /// Base class for protocol binders. It implements + /// , + /// and and provides shared validation helpers + /// (scheme identification, operation compatibility, codec selection and + /// secret-free security resolution) so concrete planners focus on the protocol + /// specifics. + /// + public abstract class WotProtocolBinderBase : IWotProtocolBinder, IWotBindingIdentification, IWotBindingPlanner + { + /// + public abstract WotBindingIdentity Identity { get; } + + /// + public abstract WotBindingCapability Capability { get; } + + /// + public IWotBindingIdentification Identification => this; + + /// + public IWotBindingPlanner Planner => this; + + /// + public abstract WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context); + + /// + public abstract WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context); + + /// + /// Gets the URI schemes the binder handles for scheme-based identification. + /// + protected abstract IReadOnlyCollection Schemes { get; } + + /// + /// A default scheme / vocabulary / explicit-pin identification helper. An + /// explicit pin on the resource wins with + /// ; otherwise a form + /// whose href scheme is handled matches with + /// , and a form carrying the + /// binding's vocabulary prefix matches with the stronger + /// . + /// + protected WotBindingMatch MatchStandard( + WotAffordanceForm form, WotBindingSelectionContext context, string? vocabularyPrefix) + { + if (context.IsPinned(Identity)) + { + return WotBindingMatch.Match(WotBindingMatchKind.ExplicitBindingId); + } + WotBindingMatch best = WotBindingMatch.NoMatch; + if (SchemeMatches(form)) + { + best = WotBindingMatch.Match(WotBindingMatchKind.Scheme); + } + if (!string.IsNullOrEmpty(vocabularyPrefix) && HasVocabularyPrefix(form, vocabularyPrefix!)) + { + var vocabulary = WotBindingMatch.Match(WotBindingMatchKind.Vocabulary); + if (vocabulary.Priority > best.Priority) + { + best = vocabulary; + } + } + return best; + } + + /// + /// Gets whether the form's href scheme is handled by this binder. + /// + protected bool SchemeMatches(WotAffordanceForm form) + { + string? scheme = SchemeOf(form.Href); + if (scheme is null) + { + return false; + } + foreach (string handled in Schemes) + { + if (string.Equals(scheme, handled, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + return false; + } + + /// + /// Gets whether the form object carries any member with the vocabulary prefix. + /// + protected static bool HasVocabularyPrefix(WotAffordanceForm form, string prefix) + { + if (form.FormElement.ValueKind != System.Text.Json.JsonValueKind.Object) + { + return false; + } + foreach (System.Text.Json.JsonProperty property in form.FormElement.EnumerateObject()) + { + if (property.Name.StartsWith(prefix, StringComparison.Ordinal)) + { + return true; + } + } + return false; + } + + /// + /// Attempts to parse an href as an absolute URI. + /// + protected static bool TryParseUri(string href, out Uri uri) + { + return Uri.TryCreate(href, UriKind.Absolute, out uri!) && uri is not null; + } + + /// + /// Builds an endpoint descriptor from a parsed URI authority. + /// + protected static WotEndpointDescriptor MakeEndpoint(Uri uri) + { + return new WotEndpointDescriptor( + uri.Scheme, + string.IsNullOrEmpty(uri.Host) ? null : uri.Host, + uri.Port, + uri.GetLeftPart(UriPartial.Authority)); + } + + /// + /// Builds an endpoint descriptor from an href, or a synthetic descriptor + /// carrying the raw href when it is not a parseable absolute URI (used by + /// document-level, non-executable bindings). + /// + protected static WotEndpointDescriptor MakeEndpointOrSynthetic(string? href, string scheme) + { + if (!string.IsNullOrEmpty(href) && TryParseUri(href!, out Uri uri)) + { + return MakeEndpoint(uri); + } + return new WotEndpointDescriptor(scheme, null, -1, href ?? string.Empty); + } + + /// + /// Extracts the lower-case URI scheme from an href, if present. + /// + protected static string? SchemeOf(string? href) + { + if (string.IsNullOrEmpty(href)) + { + return null; + } + int colon = -1; + for (int i = 0; i < href!.Length; i++) + { + if (href[i] == ':') + { + colon = i; + break; + } + } + if (colon <= 0) + { + return null; + } + return href[..colon].ToLowerInvariant(); + } + + /// + /// Requires a non-empty, in-bounds href and reports a diagnostic when + /// it is missing or too long. + /// + protected bool RequireHref( + WotAffordanceForm form, + WotBindingPlanContext context, + ICollection diagnostics, + out string href) + { + href = form.Href ?? string.Empty; + if (string.IsNullOrEmpty(href)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingHref, + "The form has no href.", form.Pointer("href"))); + return false; + } + if (href.Length > context.Bounds.MaxUriLength) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.BoundsExceeded, + $"The href exceeds the maximum length of {context.Bounds.MaxUriLength}.", + form.Pointer("href"))); + return false; + } + return true; + } + + /// + /// Yields the (op token, capability) pairs the binder supports for the + /// form, reporting a diagnostic for each incompatible or unsupported op. + /// + protected IEnumerable<(string Op, WoTBindingCapabilityEnum Capability)> ResolveOperations( + WotAffordanceForm form, ICollection diagnostics) + { + var seen = new HashSet(); + var results = new List<(string, WoTBindingCapabilityEnum)>(); + foreach (string op in form.Operations) + { + if (!WotOperations.IsCompatible(form.Kind, op)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.IncompatibleOperation, + $"The operation '{op}' is not compatible with a {form.Kind} affordance.", + form.Pointer("op"), op)); + continue; + } + if (!WotOperations.TryMap(op, out WoTBindingCapabilityEnum capability)) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.UnsupportedOperation, + $"The operation '{op}' is not modelled by the registry.", + form.Pointer("op"), op)); + continue; + } + if (!Capability.Supports(capability)) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.UnsupportedOperation, + $"The binding '{Identity.Id}' does not support '{op}'.", + form.Pointer("op"), op)); + continue; + } + // "unobserveproperty" and "unsubscribeevent" are teardown ops for a + // running observe / subscribe; do not emit a duplicate entry. + if (op is "unobserveproperty" or "unsubscribeevent") + { + continue; + } + if (seen.Add(capability)) + { + results.Add((op, capability)); + } + } + return results; + } + + /// + /// Selects a codec for a content type, reporting when none is available. + /// + protected string ResolveCodec( + WotAffordanceForm form, WotBindingPlanContext context, out WotPayloadDescriptor payload) + { + string contentType = string.IsNullOrEmpty(form.ContentType) ? "application/json" : form.ContentType!; + context.Codecs.TrySelect(form.ContentType, out IWotPayloadCodec codec); + payload = new WotPayloadDescriptor(contentType, codec.Id); + return codec.Id; + } + + /// + /// Resolves the form's security scheme references into secret-free + /// credential references, reporting a diagnostic for any scheme not + /// declared in the document's securityDefinitions. + /// + protected ImmutableArray ResolveSecurity( + WotAffordanceForm form, WotBindingPlanContext context, string? endpoint, + ICollection diagnostics) + { + if (form.SecuritySchemes.IsEmpty) + { + return []; + } + ImmutableArray.Builder builder = + ImmutableArray.CreateBuilder(); + foreach (string scheme in form.SecuritySchemes) + { + if (context.SecurityDefinitions.TryGetValue(scheme, out WotSecurityDefinition? definition)) + { + builder.Add(WotCredentialReference.FromDefinition( + definition, Identity.BindingUri, endpoint)); + } + else if (!string.Equals(scheme, "nosec_sc", StringComparison.Ordinal)) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.UnknownSecurityScheme, + $"The security scheme '{scheme}' is not declared in securityDefinitions.", + form.Pointer("security"), scheme)); + } + } + return builder.ToImmutable(); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusAddressing.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusAddressing.cs new file mode 100644 index 0000000000..4cb52046db --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusAddressing.cs @@ -0,0 +1,371 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Globalization; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// A validated Modbus operation. The numeric values are the function codes. + /// + internal enum ModbusOperation : byte + { + ReadCoils = 1, + ReadDiscreteInputs = 2, + ReadHoldingRegisters = 3, + ReadInputRegisters = 4, + WriteSingleCoil = 5, + WriteSingleHoldingRegister = 6, + WriteMultipleCoils = 15, + WriteMultipleHoldingRegisters = 16 + } + + /// + /// The validated Modbus operation and addressing parsed from a compiled form. + /// The executor checks method, entity, direction, function metadata and bounds + /// before values are narrowed to / , so + /// a hand-built or tampered form cannot select a fallback function or silently + /// truncate an out-of-range value. + /// + internal readonly struct ModbusAddressing + { + private ModbusAddressing( + ModbusOperation operation, ushort address, ushort quantity, byte unitId, + string type, bool msbFirst, bool mswFirst) + { + Operation = operation; + Address = address; + Quantity = quantity; + UnitId = unitId; + Type = type; + MsbFirst = msbFirst; + MswFirst = mswFirst; + } + + public ModbusOperation Operation { get; } + + public ushort Address { get; } + + public ushort Quantity { get; } + + public byte UnitId { get; } + + public string Type { get; } + + public bool MsbFirst { get; } + + public bool MswFirst { get; } + + /// + /// Parses and validates the addressing carried by a compiled Modbus form, + /// including operation consistency and protocol bounds. + /// + /// + /// + /// + public static ModbusAddressing FromForm(WotCompiledForm form, WotBindingBounds? bounds = null) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + ImmutableDictionary map = form.Addressing.Metadata; + string entity = GetRequiredString(map, "entity", form); + int address = GetRequiredInt(map, "address", form); + int quantity = GetRequiredInt(map, "quantity", form); + int unitId = GetRequiredInt(map, "unitId", form); + bounds ??= WotBindingBounds.Default; + + if (address is < 0 or > ModbusProtocolLimits.MaxAddress) + { + throw new ArgumentOutOfRangeException( + nameof(form), address, + $"The Modbus address must be between 0 and {ModbusProtocolLimits.MaxAddress}."); + } + if (quantity is < 1 or > ushort.MaxValue) + { + throw new ArgumentOutOfRangeException( + nameof(form), quantity, $"The Modbus quantity must be between 1 and {ushort.MaxValue}."); + } + ModbusOperation operation = ValidateOperation(form, map, entity); + bool bitOperation = IsBitOperation(operation); + int configuredMaxQuantity = bitOperation + ? bounds.MaxCoilQuantity + : bounds.MaxRegisterQuantity; + int protocolMaxQuantity = ProtocolMaximum(operation); + int maxQuantity = Math.Min(configuredMaxQuantity, protocolMaxQuantity); + if (IsSingleWrite(operation) && quantity != 1) + { + throw new ArgumentOutOfRangeException( + nameof(form), quantity, + $"The Modbus {CanonicalMethod(operation)} function requires a quantity of 1."); + } + if (quantity > maxQuantity) + { + throw new ArgumentOutOfRangeException( + nameof(form), quantity, + $"The Modbus quantity must not exceed {maxQuantity} for '{form.OperationInfo.Method}'."); + } + if (address + quantity - 1 > ModbusProtocolLimits.MaxAddress) + { + throw new ArgumentOutOfRangeException( + nameof(form), address, + $"The Modbus range starting at {address} for {quantity} items exceeds the maximum " + + $"address {ModbusProtocolLimits.MaxAddress}."); + } + if (unitId is < 0 or > 255) + { + throw new ArgumentOutOfRangeException( + nameof(form), unitId, "The Modbus unit id must be between 0 and 255."); + } + + string type = GetString(form.Payload.Metadata, "type", "uint16"); + bool msbFirst = GetBool(form.Payload.Metadata, "mostSignificantByte", true); + bool mswFirst = GetBool(form.Payload.Metadata, "mostSignificantWord", true); + if (operation is + ModbusOperation.WriteSingleHoldingRegister or + ModbusOperation.WriteMultipleHoldingRegisters) + { + int encodedRegisterCount = ModbusDataTypes.RegisterCount(type); + if (quantity != encodedRegisterCount) + { + throw new ArgumentException( + $"The compiled Modbus type '{type}' encodes {encodedRegisterCount} register(s), " + + $"which does not match quantity {quantity} for '{CanonicalMethod(operation)}'.", + nameof(form)); + } + } + + return new ModbusAddressing( + operation, + (ushort)address, + (ushort)quantity, + (byte)unitId, + type, + msbFirst, + mswFirst); + } + + private static ModbusOperation ValidateOperation( + WotCompiledForm form, + ImmutableDictionary map, + string entity) + { + if (!TryResolveOperation(form.OperationInfo.Method, out ModbusOperation operation)) + { + throw new ArgumentException( + $"The compiled Modbus method '{form.OperationInfo.Method}' is not supported.", + nameof(form)); + } + if (form.OperationInfo.Operation != form.Operation) + { + throw new ArgumentException( + $"The compiled Modbus operation '{form.OperationInfo.Operation}' does not match " + + $"the form operation '{form.Operation}'.", + nameof(form)); + } + + bool writeOperation = IsWriteOperation(operation); + bool writeDirection = form.Operation == WoTBindingCapabilityEnum.WriteProperty; + bool readDirection = form.Operation is + WoTBindingCapabilityEnum.ReadProperty or WoTBindingCapabilityEnum.ObserveProperty; + if ((!writeDirection && !readDirection) || writeOperation != writeDirection) + { + throw new ArgumentException( + $"The compiled Modbus method '{form.OperationInfo.Method}' is not valid for " + + $"the '{form.Operation}' operation.", + nameof(form)); + } + + string expectedEntity = ExpectedEntity(operation); + if (!string.Equals(entity, expectedEntity, StringComparison.OrdinalIgnoreCase)) + { + throw new ArgumentException( + $"The compiled Modbus method '{form.OperationInfo.Method}' operates on " + + $"'{expectedEntity}', not '{entity}'.", + nameof(form)); + } + + if (map.TryGetValue("functionCode", out string? functionCodeText) && + (!int.TryParse( + functionCodeText, + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out int functionCode) || + functionCode != (int)operation)) + { + throw new ArgumentException( + $"The compiled Modbus function code '{functionCodeText}' does not match " + + $"the method '{form.OperationInfo.Method}'.", + nameof(form)); + } + if (map.TryGetValue("function", out string? functionName) && + !string.Equals(functionName, CanonicalMethod(operation), StringComparison.OrdinalIgnoreCase)) + { + throw new ArgumentException( + $"The compiled Modbus function '{functionName}' does not match " + + $"the method '{form.OperationInfo.Method}'.", + nameof(form)); + } + return operation; + } + + private static bool TryResolveOperation(string method, out ModbusOperation operation) + { + operation = method.ToLowerInvariant() switch + { + "readcoil" => ModbusOperation.ReadCoils, + "readdiscreteinput" => ModbusOperation.ReadDiscreteInputs, + "readholdingregisters" => ModbusOperation.ReadHoldingRegisters, + "readinputregister" => ModbusOperation.ReadInputRegisters, + "writesinglecoil" => ModbusOperation.WriteSingleCoil, + "writesingleholdingregister" => ModbusOperation.WriteSingleHoldingRegister, + "writemultiplecoils" => ModbusOperation.WriteMultipleCoils, + "writemultipleholdingregisters" => ModbusOperation.WriteMultipleHoldingRegisters, + _ => default + }; + return operation != default && + method.Equals(CanonicalMethod(operation), StringComparison.OrdinalIgnoreCase); + } + + private static string CanonicalMethod(ModbusOperation operation) + { + return operation switch + { + ModbusOperation.ReadCoils => "readCoil", + ModbusOperation.ReadDiscreteInputs => "readDiscreteInput", + ModbusOperation.ReadHoldingRegisters => "readHoldingRegisters", + ModbusOperation.ReadInputRegisters => "readInputRegister", + ModbusOperation.WriteSingleCoil => "writeSingleCoil", + ModbusOperation.WriteSingleHoldingRegister => "writeSingleHoldingRegister", + ModbusOperation.WriteMultipleCoils => "writeMultipleCoils", + ModbusOperation.WriteMultipleHoldingRegisters => "writeMultipleHoldingRegisters", + _ => string.Empty + }; + } + + private static string ExpectedEntity(ModbusOperation operation) + { + return operation switch + { + ModbusOperation.ReadCoils or + ModbusOperation.WriteSingleCoil or + ModbusOperation.WriteMultipleCoils => "coil", + ModbusOperation.ReadDiscreteInputs => "discreteInput", + ModbusOperation.ReadInputRegisters => "inputRegister", + _ => "holdingRegister" + }; + } + + private static int ProtocolMaximum(ModbusOperation operation) + { + return operation switch + { + ModbusOperation.ReadCoils or + ModbusOperation.ReadDiscreteInputs => ModbusProtocolLimits.MaxReadBits, + ModbusOperation.WriteMultipleCoils => ModbusProtocolLimits.MaxWriteCoils, + ModbusOperation.WriteMultipleHoldingRegisters => ModbusProtocolLimits.MaxWriteRegisters, + ModbusOperation.WriteSingleCoil or + ModbusOperation.WriteSingleHoldingRegister => 1, + _ => ModbusProtocolLimits.MaxReadRegisters + }; + } + + private static bool IsBitOperation(ModbusOperation operation) + { + return operation is + ModbusOperation.ReadCoils or + ModbusOperation.ReadDiscreteInputs or + ModbusOperation.WriteSingleCoil or + ModbusOperation.WriteMultipleCoils; + } + + private static bool IsWriteOperation(ModbusOperation operation) + { + return operation is + ModbusOperation.WriteSingleCoil or + ModbusOperation.WriteSingleHoldingRegister or + ModbusOperation.WriteMultipleCoils or + ModbusOperation.WriteMultipleHoldingRegisters; + } + + private static bool IsSingleWrite(ModbusOperation operation) + { + return operation is + ModbusOperation.WriteSingleCoil or + ModbusOperation.WriteSingleHoldingRegister; + } + + private static string GetRequiredString( + ImmutableDictionary map, + string key, + WotCompiledForm form) + { + if (map.TryGetValue(key, out string? value) && !string.IsNullOrWhiteSpace(value)) + { + return value; + } + throw new ArgumentException( + $"The compiled Modbus form requires '{key}' metadata.", + nameof(form)); + } + + private static int GetRequiredInt( + ImmutableDictionary map, + string key, + WotCompiledForm form) + { + if (map.TryGetValue(key, out string? value) && + int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out int result)) + { + return result; + } + throw new ArgumentException( + $"The compiled Modbus form requires integer '{key}' metadata.", + nameof(form)); + } + + private static string GetString( + ImmutableDictionary map, + string key, + string fallback) + { + return map.TryGetValue(key, out string? value) && !string.IsNullOrEmpty(value) + ? value + : fallback; + } + + private static bool GetBool(ImmutableDictionary map, string key, bool fallback) + { + return map.TryGetValue(key, out string? value) && bool.TryParse(value, out bool result) ? result : fallback; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusDataConverter.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusDataConverter.cs new file mode 100644 index 0000000000..666115bd59 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusDataConverter.cs @@ -0,0 +1,180 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// Converts between Modbus register words and OPC UA values, honouring the + /// modv:type data type and the byte / word order flags + /// (modv:mostSignificantByte / modv:mostSignificantWord). + /// + internal static class ModbusDataConverter + { + public static int RegisterCount(string type) + { + return ModbusDataTypes.RegisterCount(type); + } + + public static Variant ToVariant(ushort[] registers, string type, bool msbFirst, bool mswFirst) + { + string normalized = ModbusDataTypes.Normalize(type); + int needed = RegisterCount(normalized); + if (registers.Length < needed) + { + throw new ModbusException( + $"The Modbus data type '{type}' requires {needed} registers but {registers.Length} were read."); + } + ushort[] slice = new ushort[needed]; + Array.Copy(registers, slice, needed); + byte[] bigEndian = Canonical(slice, msbFirst, mswFirst); + byte[] host = ToHostOrder(bigEndian); + return normalized switch + { + "int16" => new Variant(BitConverter.ToInt16(host, 0)), + "uint16" => new Variant(BitConverter.ToUInt16(host, 0)), + "int32" => new Variant(BitConverter.ToInt32(host, 0)), + "uint32" => new Variant(BitConverter.ToUInt32(host, 0)), + "float32" => new Variant(BitConverter.ToSingle(host, 0)), + "int64" => new Variant(BitConverter.ToInt64(host, 0)), + "uint64" => new Variant(BitConverter.ToUInt64(host, 0)), + "float64" => new Variant(BitConverter.ToDouble(host, 0)), + _ => new Variant(BitConverter.ToUInt16(host, 0)) + }; + } + + public static ushort[] ToRegisters(Variant value, string type, bool msbFirst, bool mswFirst) + { + string normalized = ModbusDataTypes.Normalize(type); + byte[] bigEndian = normalized switch + { + "int16" => BigEndianBytes(BitConverter.GetBytes(ToInt16(value))), + "uint16" => BigEndianBytes(BitConverter.GetBytes(ToUInt16(value))), + "int32" => BigEndianBytes( + BitConverter.GetBytes(Convert.ToInt32(BoxOf(value), CultureInfo.InvariantCulture))), + "uint32" => BigEndianBytes( + BitConverter.GetBytes(Convert.ToUInt32(BoxOf(value), CultureInfo.InvariantCulture))), + "float32" => BigEndianBytes( + BitConverter.GetBytes(Convert.ToSingle(BoxOf(value), CultureInfo.InvariantCulture))), + "int64" => BigEndianBytes( + BitConverter.GetBytes(Convert.ToInt64(BoxOf(value), CultureInfo.InvariantCulture))), + "uint64" => BigEndianBytes( + BitConverter.GetBytes(Convert.ToUInt64(BoxOf(value), CultureInfo.InvariantCulture))), + "float64" => BigEndianBytes( + BitConverter.GetBytes(Convert.ToDouble(BoxOf(value), CultureInfo.InvariantCulture))), + _ => BigEndianBytes(BitConverter.GetBytes(ToUInt16(value))) + }; + return FromCanonical(bigEndian, msbFirst, mswFirst); + } + + private static byte[] Canonical(ushort[] registers, bool msbFirst, bool mswFirst) + { + int words = registers.Length; + byte[][] wordBytes = new byte[words][]; + for (int i = 0; i < words; i++) + { + byte hi = (byte)(registers[i] >> 8); + byte lo = (byte)(registers[i] & 0xFF); + wordBytes[i] = msbFirst ? [hi, lo] : [lo, hi]; + } + if (!mswFirst) + { + Array.Reverse(wordBytes); + } + byte[] result = new byte[words * 2]; + for (int i = 0; i < words; i++) + { + result[i * 2] = wordBytes[i][0]; + result[(i * 2) + 1] = wordBytes[i][1]; + } + return result; + } + + private static ushort[] FromCanonical(byte[] bigEndian, bool msbFirst, bool mswFirst) + { + int words = bigEndian.Length / 2; + byte[][] wordBytes = new byte[words][]; + for (int i = 0; i < words; i++) + { + wordBytes[i] = [bigEndian[i * 2], bigEndian[(i * 2) + 1]]; + } + if (!mswFirst) + { + Array.Reverse(wordBytes); + } + ushort[] registers = new ushort[words]; + for (int i = 0; i < words; i++) + { + byte b0 = wordBytes[i][0]; + byte b1 = wordBytes[i][1]; + byte hi = msbFirst ? b0 : b1; + byte lo = msbFirst ? b1 : b0; + registers[i] = (ushort)((hi << 8) | lo); + } + return registers; + } + + private static byte[] ToHostOrder(byte[] bigEndian) + { + byte[] copy = (byte[])bigEndian.Clone(); + if (BitConverter.IsLittleEndian) + { + Array.Reverse(copy); + } + return copy; + } + + private static byte[] BigEndianBytes(byte[] hostOrder) + { + byte[] copy = (byte[])hostOrder.Clone(); + if (BitConverter.IsLittleEndian) + { + Array.Reverse(copy); + } + return copy; + } + + private static object BoxOf(Variant value) + { + return value.AsBoxedObject() ?? 0; + } + + private static short ToInt16(Variant value) + { + return Convert.ToInt16(BoxOf(value), CultureInfo.InvariantCulture); + } + + private static ushort ToUInt16(Variant value) + { + return Convert.ToUInt16(BoxOf(value), CultureInfo.InvariantCulture); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusException.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusException.cs new file mode 100644 index 0000000000..b6e8b72a6d --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusException.cs @@ -0,0 +1,76 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// A Modbus protocol exception carrying the device exception code. + /// + public sealed class ModbusException : Exception + { + /// + /// Initializes a new Modbus exception. + /// + public ModbusException(byte exceptionCode, string message) + : base(message) + { + ExceptionCode = exceptionCode; + } + + /// + /// Initializes a new Modbus exception without a device code. + /// + public ModbusException(string message) + : base(message) + { + } + + /// + /// Initializes a new Modbus exception. + /// + public ModbusException() + { + } + + /// + /// Initializes a new Modbus exception with an inner exception. + /// + public ModbusException(string message, Exception innerException) + : base(message, innerException) + { + } + + /// + /// Gets the Modbus exception code, or 0 for a transport fault. + /// + public byte ExceptionCode { get; } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusTcpClient.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusTcpClient.cs new file mode 100644 index 0000000000..4982a34c94 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusTcpClient.cs @@ -0,0 +1,467 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// A minimal, robust Modbus TCP client sufficient for the WoT Modbus binding + /// forms: read coils / discrete inputs / holding registers / input registers + /// and write single / multiple coils and holding registers. It manages the + /// MBAP header, monotonically increasing transaction ids, request timeouts and + /// device exception decoding. + /// + public sealed class ModbusTcpClient : IDisposable + { + /// + /// Initializes a new Modbus TCP client. + /// + public ModbusTcpClient(string host, int port, TimeSpan timeout) + { + m_host = host ?? throw new ArgumentNullException(nameof(host)); + m_port = port <= 0 ? 502 : port; + m_timeout = timeout <= TimeSpan.Zero ? TimeSpan.FromSeconds(10) : timeout; + } + + /// + /// Connects (or reconnects) the underlying TCP socket. The connect is + /// serialized with in-flight transactions so a reconnect after a fault is + /// deterministic and thread-safe: any prior (possibly faulted) socket is + /// disposed first and a fresh connection replaces it atomically. + /// + public async ValueTask ConnectAsync(CancellationToken cancellationToken) + { + using var timeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + timeout.CancelAfter(m_timeout); + await m_writeLock.WaitAsync(timeout.Token).ConfigureAwait(false); + try + { + await ReconnectCoreAsync(timeout.Token).ConfigureAwait(false); + } + finally + { + m_writeLock.Release(); + } + } + + /// + /// Reads holding registers (function code 3). + /// + public ValueTask ReadHoldingRegistersAsync( + byte unitId, ushort address, ushort quantity, CancellationToken cancellationToken) + { + return ReadRegistersAsync(0x03, unitId, address, quantity, cancellationToken); + } + + /// + /// Reads input registers (function code 4). + /// + public ValueTask ReadInputRegistersAsync( + byte unitId, ushort address, ushort quantity, CancellationToken cancellationToken) + { + return ReadRegistersAsync(0x04, unitId, address, quantity, cancellationToken); + } + + /// + /// Reads coils (function code 1). + /// + public ValueTask ReadCoilsAsync( + byte unitId, ushort address, ushort quantity, CancellationToken cancellationToken) + { + return ReadBitsAsync(0x01, unitId, address, quantity, cancellationToken); + } + + /// + /// Reads discrete inputs (function code 2). + /// + public ValueTask ReadDiscreteInputsAsync( + byte unitId, ushort address, ushort quantity, CancellationToken cancellationToken) + { + return ReadBitsAsync(0x02, unitId, address, quantity, cancellationToken); + } + + /// + /// Writes a single holding register (function code 6). + /// + public async ValueTask WriteSingleRegisterAsync( + byte unitId, ushort address, ushort value, CancellationToken cancellationToken) + { + byte[] pdu = [0x06, Hi(address), Lo(address), Hi(value), Lo(value)]; + await TransactAsync(unitId, pdu, 0x06, cancellationToken).ConfigureAwait(false); + } + + /// + /// Writes multiple holding registers (function code 16). + /// + public async ValueTask WriteMultipleRegistersAsync( + byte unitId, ushort address, ushort[] values, CancellationToken cancellationToken) + { + int count = values.Length; + byte byteCount = (byte)(count * 2); + byte[] pdu = new byte[6 + byteCount]; + pdu[0] = 0x10; + pdu[1] = Hi(address); + pdu[2] = Lo(address); + pdu[3] = Hi((ushort)count); + pdu[4] = Lo((ushort)count); + pdu[5] = byteCount; + for (int i = 0; i < count; i++) + { + pdu[6 + (i * 2)] = Hi(values[i]); + pdu[7 + (i * 2)] = Lo(values[i]); + } + await TransactAsync(unitId, pdu, 0x10, cancellationToken).ConfigureAwait(false); + } + + /// + /// Writes a single coil (function code 5). + /// + public async ValueTask WriteSingleCoilAsync( + byte unitId, ushort address, bool value, CancellationToken cancellationToken) + { + ushort encodedValue = value ? (ushort)0xFF00 : (ushort)0x0000; + byte[] pdu = [0x05, Hi(address), Lo(address), Hi(encodedValue), Lo(encodedValue)]; + byte[] response = await TransactAsync(unitId, pdu, 0x05, cancellationToken).ConfigureAwait(false); + ValidateWriteAcknowledgement(response, address, encodedValue, "single-coil"); + } + + /// + /// Writes multiple coils (function code 15). + /// + public async ValueTask WriteMultipleCoilsAsync( + byte unitId, ushort address, bool[] values, CancellationToken cancellationToken) + { + if (values is null) + { + throw new ArgumentNullException(nameof(values)); + } + int count = values.Length; + ValidateBitRange(address, count, ModbusProtocolLimits.MaxWriteCoils, nameof(values)); + byte byteCount = (byte)((count + 7) / 8); + byte[] pdu = new byte[6 + byteCount]; + pdu[0] = 0x0F; + pdu[1] = Hi(address); + pdu[2] = Lo(address); + pdu[3] = Hi((ushort)count); + pdu[4] = Lo((ushort)count); + pdu[5] = byteCount; + for (int i = 0; i < count; i++) + { + if (values[i]) + { + pdu[6 + (i / 8)] |= (byte)(1 << (i % 8)); + } + } + byte[] response = await TransactAsync(unitId, pdu, 0x0F, cancellationToken).ConfigureAwait(false); + ValidateWriteAcknowledgement(response, address, (ushort)count, "multiple-coil"); + } + + private static void ValidateWriteAcknowledgement( + byte[] response, + ushort address, + ushort value, + string operation) + { + if (response.Length != 5) + { + throw new ModbusException( + $"The Modbus {operation} acknowledgement must contain exactly 5 bytes."); + } + ushort echoedAddress = (ushort)((response[1] << 8) | response[2]); + if (echoedAddress != address) + { + throw new ModbusException( + $"The Modbus {operation} acknowledgement did not echo the requested address."); + } + ushort echoedValue = (ushort)((response[3] << 8) | response[4]); + if (echoedValue != value) + { + throw new ModbusException( + $"The Modbus {operation} acknowledgement did not echo the requested value or quantity."); + } + } + + private static void ValidateBitRange(ushort address, int quantity, int maximum, string parameterName) + { + if (quantity is < 1 || quantity > maximum) + { + throw new ArgumentOutOfRangeException( + parameterName, + quantity, + $"The Modbus bit quantity must be between 1 and {maximum}."); + } + if (address + quantity - 1 > ModbusProtocolLimits.MaxAddress) + { + throw new ArgumentOutOfRangeException( + parameterName, + quantity, + $"The Modbus range starting at {address} for {quantity} bits exceeds the maximum " + + $"address {ModbusProtocolLimits.MaxAddress}."); + } + } + + /// + public void Dispose() + { + m_stream?.Dispose(); + m_client?.Dispose(); + m_writeLock.Dispose(); + } + + private async ValueTask ReadRegistersAsync( + byte function, byte unitId, ushort address, ushort quantity, CancellationToken cancellationToken) + { + byte[] pdu = [function, Hi(address), Lo(address), Hi(quantity), Lo(quantity)]; + byte[] response = await TransactAsync(unitId, pdu, function, cancellationToken).ConfigureAwait(false); + // response[0] is the (already validated) function code; response[1] is + // the byte count. Validate both the byte count and the overall length + // before indexing so a hostile or truncated frame cannot read out of + // bounds. + if (response.Length < 2) + { + throw new ModbusException("The Modbus register response is missing its byte count."); + } + int byteCount = response[1]; + int expected = quantity * 2; + if (byteCount != expected || (byteCount & 1) != 0 || response.Length < 2 + byteCount) + { + throw new ModbusException( + "The Modbus register response byte count is inconsistent with the request."); + } + ushort[] registers = new ushort[byteCount / 2]; + for (int i = 0; i < registers.Length; i++) + { + registers[i] = (ushort)((response[2 + (i * 2)] << 8) | response[3 + (i * 2)]); + } + return registers; + } + + private async ValueTask ReadBitsAsync( + byte function, byte unitId, ushort address, ushort quantity, CancellationToken cancellationToken) + { + ValidateBitRange(address, quantity, ModbusProtocolLimits.MaxReadBits, nameof(quantity)); + byte[] pdu = [function, Hi(address), Lo(address), Hi(quantity), Lo(quantity)]; + byte[] response = await TransactAsync(unitId, pdu, function, cancellationToken).ConfigureAwait(false); + // response[1] is the packed-bit byte count. Validate it against the + // requested quantity and the frame length before indexing. + if (response.Length < 2) + { + throw new ModbusException("The Modbus bit response is missing its byte count."); + } + int byteCount = response[1]; + int expected = (quantity + 7) / 8; + if (byteCount != expected || response.Length < 2 + byteCount) + { + throw new ModbusException( + "The Modbus bit response byte count is inconsistent with the request."); + } + bool[] bits = new bool[quantity]; + for (int i = 0; i < quantity; i++) + { + int byteIndex = 2 + (i / 8); + bits[i] = (response[byteIndex] & (1 << (i % 8))) != 0; + } + return bits; + } + + private async ValueTask TransactAsync( + byte unitId, byte[] pdu, byte expectedFunction, CancellationToken cancellationToken) + { + ushort transactionId = unchecked((ushort)Interlocked.Increment(ref m_transaction)); + int length = pdu.Length + 1; + byte[] frame = new byte[7 + pdu.Length]; + frame[0] = Hi(transactionId); + frame[1] = Lo(transactionId); + frame[2] = 0x00; + frame[3] = 0x00; + frame[4] = Hi((ushort)length); + frame[5] = Lo((ushort)length); + frame[6] = unitId; + Buffer.BlockCopy(pdu, 0, frame, 7, pdu.Length); + + using var timeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + timeout.CancelAfter(m_timeout); + await m_writeLock.WaitAsync(timeout.Token).ConfigureAwait(false); + try + { + if (m_stream is null && m_faulted) + { + await ReconnectCoreAsync(timeout.Token).ConfigureAwait(false); + } + + NetworkStream? stream = m_stream ?? + throw new ModbusException("The Modbus client is not connected."); + + byte[] responsePdu; + try + { + await stream.WriteAsync(frame.AsMemory(), timeout.Token).ConfigureAwait(false); + await stream.FlushAsync(timeout.Token).ConfigureAwait(false); + + byte[] header = await ReadExactAsync(stream, 7, timeout.Token).ConfigureAwait(false); + if (header[0] != Hi(transactionId) || header[1] != Lo(transactionId)) + { + throw new ModbusException("The Modbus transaction id did not match."); + } + int responseLength = ((header[4] << 8) | header[5]) - 1; + if (responseLength < 1) + { + throw new ModbusException("The Modbus response length is invalid."); + } + responsePdu = await ReadExactAsync(stream, responseLength, timeout.Token).ConfigureAwait(false); + } + catch (Exception ex) when ( + ex is OperationCanceledException or System.IO.IOException or + SocketException or ObjectDisposedException or ModbusException) + { + // A timeout, cancellation, transport error, transaction-id + // mismatch or truncated/invalid frame leaves the stream in an + // unknown, desynchronized state. Fault the connection so the + // next operation establishes a fresh socket before sending. + FaultConnection(); + throw; + } + + // The response was framed by the MBAP length and read in full, so + // the stream stays synchronized: a device exception or an + // unexpected function code is a protocol result, not a desync, and + // must not fault the connection. + byte function = responsePdu[0]; + if ((function & 0x80) != 0) + { + byte exceptionCode = responsePdu.Length > 1 ? responsePdu[1] : (byte)0; + throw new ModbusException(exceptionCode, DescribeException(exceptionCode)); + } + if (function != expectedFunction) + { + throw new ModbusException( + $"Unexpected Modbus function 0x{function:X2} (expected 0x{expectedFunction:X2})."); + } + return responsePdu; + } + finally + { + m_writeLock.Release(); + } + } + + /// + /// Disposes and clears the current socket after a desynchronizing fault so + /// the next operation requires a fresh . Always + /// called while holding . + /// + private void FaultConnection() + { + m_faulted = true; + m_stream?.Dispose(); + m_client?.Dispose(); + m_stream = null; + m_client = null; + } + + private async ValueTask ReconnectCoreAsync(CancellationToken cancellationToken) + { + // Dispose any prior (possibly faulted) connection so a reconnect + // always starts from a clean, deterministic state. + m_stream?.Dispose(); + m_client?.Dispose(); + m_stream = null; + m_client = null; + + var client = new TcpClient { NoDelay = true }; + try + { + await client.ConnectAsync(m_host, m_port, cancellationToken).ConfigureAwait(false); + } + catch + { + client.Dispose(); + throw; + } + m_client = client; + m_stream = client.GetStream(); + m_faulted = false; + } + + private static async ValueTask ReadExactAsync( + NetworkStream stream, int count, CancellationToken cancellationToken) + { + byte[] buffer = new byte[count]; + int offset = 0; + while (offset < count) + { + int read = await stream + .ReadAsync(buffer.AsMemory(offset, count - offset), cancellationToken) + .ConfigureAwait(false); + if (read == 0) + { + throw new ModbusException("The Modbus connection was closed by the peer."); + } + offset += read; + } + return buffer; + } + + private static string DescribeException(byte code) + { + return code switch + { + 0x01 => "Illegal function.", + 0x02 => "Illegal data address.", + 0x03 => "Illegal data value.", + 0x04 => "Server device failure.", + 0x06 => "Server device busy.", + _ => $"Modbus exception 0x{code:X2}." + }; + } + + private static byte Hi(ushort value) + { + return (byte)(value >> 8); + } + + private static byte Lo(ushort value) + { + return (byte)(value & 0xFF); + } + + private readonly string m_host; + private readonly int m_port; + private readonly TimeSpan m_timeout; + private readonly SemaphoreSlim m_writeLock = new(1, 1); + private TcpClient? m_client; + private NetworkStream? m_stream; + private int m_transaction; + private bool m_faulted; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingChannel.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingChannel.cs new file mode 100644 index 0000000000..51e6131f21 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingChannel.cs @@ -0,0 +1,319 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// A live Modbus TCP binding channel. It reads coils / discrete inputs / + /// holding / input registers and writes coils and holding registers with the + /// data type and byte / word order compiled from the form, mapping Modbus + /// exceptions and timeouts to OPC UA status codes. + /// + internal sealed class ModbusWotBindingChannel : IWotBindingChannel + { + public ModbusWotBindingChannel( + ModbusTcpClient client, + WotCompiledForm form, + WotExecutorContext context, + ModbusWotBindingOptions options, + ModbusAddressing addressing) + { + m_client = client; + Form = form; + m_options = options; + + m_operation = addressing.Operation; + m_address = addressing.Address; + m_quantity = addressing.Quantity; + m_unitId = addressing.UnitId; + m_type = addressing.Type; + m_msbFirst = addressing.MsbFirst; + m_mswFirst = addressing.MswFirst; + } + + public WotCompiledForm Form { get; } + + public async ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + try + { + Variant value; + if (m_operation == ModbusOperation.ReadCoils) + { + bool[] bits = await m_client + .ReadCoilsAsync(m_unitId, m_address, m_quantity, cancellationToken).ConfigureAwait(false); + value = ToBitVariant(bits); + } + else if (m_operation == ModbusOperation.ReadDiscreteInputs) + { + bool[] bits = await m_client + .ReadDiscreteInputsAsync(m_unitId, m_address, m_quantity, cancellationToken) + .ConfigureAwait(false); + value = ToBitVariant(bits); + } + else if (m_operation == ModbusOperation.ReadInputRegisters) + { + ushort[] regs = await m_client + .ReadInputRegistersAsync(m_unitId, m_address, m_quantity, cancellationToken) + .ConfigureAwait(false); + value = ModbusDataConverter.ToVariant(regs, m_type, m_msbFirst, m_mswFirst); + } + else if (m_operation == ModbusOperation.ReadHoldingRegisters) + { + ushort[] regs = await m_client + .ReadHoldingRegistersAsync(m_unitId, m_address, m_quantity, cancellationToken) + .ConfigureAwait(false); + value = ModbusDataConverter.ToVariant(regs, m_type, m_msbFirst, m_mswFirst); + } + else + { + return new WotReadResult( + StatusCodes.BadNotSupported, + DataValue.FromStatusCode(StatusCodes.BadNotSupported), + $"The Modbus operation '{m_operation}' is not readable."); + } + return new WotReadResult( + StatusCodes.Good, new DataValue(value, StatusCodes.Good, DateTimeUtc.Now, DateTimeUtc.Now)); + } + catch (ModbusException ex) + { + StatusCode status = ModbusStatusMapper.Map(ex); + return new WotReadResult(status, DataValue.FromStatusCode(status), ex.Message); + } + catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + return new WotReadResult( + StatusCodes.BadTimeout, + DataValue.FromStatusCode(StatusCodes.BadTimeout), + "The Modbus request timed out."); + } + catch (System.IO.IOException ex) + { + return new WotReadResult( + StatusCodes.BadCommunicationError, + DataValue.FromStatusCode(StatusCodes.BadCommunicationError), ex.Message); + } + catch (System.Net.Sockets.SocketException ex) + { + return new WotReadResult( + StatusCodes.BadCommunicationError, + DataValue.FromStatusCode(StatusCodes.BadCommunicationError), ex.Message); + } + } + + public async ValueTask WriteAsync( + DataValue value, CancellationToken cancellationToken = default) + { + if (m_operation is + ModbusOperation.ReadCoils or + ModbusOperation.ReadDiscreteInputs or + ModbusOperation.ReadHoldingRegisters or + ModbusOperation.ReadInputRegisters) + { + return new WotWriteResult(StatusCodes.BadNotWritable, "The Modbus operation is read-only."); + } + try + { + if (m_operation == ModbusOperation.WriteSingleCoil) + { + if (!value.WrappedValue.TryGetValue(out bool on)) + { + return new WotWriteResult( + StatusCodes.BadTypeMismatch, + "The Modbus single-coil write requires a Boolean scalar."); + } + await m_client.WriteSingleCoilAsync(m_unitId, m_address, on, cancellationToken) + .ConfigureAwait(false); + } + else if (m_operation == ModbusOperation.WriteMultipleCoils) + { + bool[] coilValues; + if (m_quantity == 1) + { + if (!value.WrappedValue.TryGetValue(out bool on)) + { + return new WotWriteResult( + StatusCodes.BadTypeMismatch, + "The Modbus multiple-coil write with quantity 1 requires a Boolean scalar."); + } + coilValues = [on]; + } + else if (value.WrappedValue.TryGetValue(out ArrayOf bits)) + { + if (bits.Count != m_quantity) + { + return new WotWriteResult( + StatusCodes.BadInvalidArgument, + $"The Modbus multiple-coil write requires exactly {m_quantity} Boolean values; " + + $"the payload contains {bits.Count}."); + } + coilValues = bits.Memory.ToArray(); + } + else + { + return new WotWriteResult( + StatusCodes.BadTypeMismatch, + $"The Modbus multiple-coil write requires an array of {m_quantity} Boolean values."); + } + await m_client + .WriteMultipleCoilsAsync( + m_unitId, m_address, coilValues, cancellationToken) + .ConfigureAwait(false); + } + else if (m_operation is + ModbusOperation.WriteSingleHoldingRegister or + ModbusOperation.WriteMultipleHoldingRegisters) + { + ushort[] registers = ModbusDataConverter.ToRegisters( + value.WrappedValue, m_type, m_msbFirst, m_mswFirst); + if (m_operation == ModbusOperation.WriteSingleHoldingRegister) + { + if (registers.Length != 1) + { + return new WotWriteResult( + StatusCodes.BadTypeMismatch, + "The Modbus single-register write requires a value encoded in one register."); + } + await m_client + .WriteSingleRegisterAsync(m_unitId, m_address, registers[0], cancellationToken) + .ConfigureAwait(false); + } + else + { + if (registers.Length != m_quantity) + { + return new WotWriteResult( + StatusCodes.BadInvalidArgument, + $"The Modbus multiple-register write requires exactly {m_quantity} registers; " + + $"the payload encodes {registers.Length}."); + } + await m_client + .WriteMultipleRegistersAsync(m_unitId, m_address, registers, cancellationToken) + .ConfigureAwait(false); + } + } + return new WotWriteResult(StatusCodes.Good); + } + catch (ModbusException ex) + { + return new WotWriteResult(ModbusStatusMapper.Map(ex), ex.Message); + } + catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + return new WotWriteResult(StatusCodes.BadTimeout, "The Modbus request timed out."); + } + catch (System.IO.IOException ex) + { + return new WotWriteResult(StatusCodes.BadCommunicationError, ex.Message); + } + catch (System.Net.Sockets.SocketException ex) + { + return new WotWriteResult(StatusCodes.BadCommunicationError, ex.Message); + } + catch (Exception ex) when ( + ex is FormatException or InvalidCastException or OverflowException) + { + return new WotWriteResult(StatusCodes.BadTypeMismatch, ex.Message); + } + } + + public ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + return new ValueTask(new WotInvokeResult( + StatusCodes.BadNotSupported, null, "Modbus does not support action invocation.")); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller, who disposes it.")] + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + var subscription = new PollingWotSubscription( + Form, + async token => + { + WotReadResult result = await ReadAsync(token).ConfigureAwait(false); + // A mapped failure carries its bad StatusCode on the value, so surface it + // rather than leaving the last good value in place, and report the poll as + // unhealthy so the retry policy backs off instead of hammering the asset. + onNotification(new WotNotification(result.Value)); + return result.Success; + }, + // A form that declares the standard modv:pollingTime wins over the executor's + // configured default, so a per-affordance rate is honoured. + Form.OperationInfo.PollInterval ?? m_options.ObserveInterval, + // A transient poll fault is reported as a Bad-status notification + // so consumers observe the fault without the poll loop faulting. + onError: _ => onNotification(new WotNotification( + DataValue.FromStatusCode(StatusCodes.BadCommunicationError))), + retryPolicy: m_options.RetryPolicy); + return new ValueTask(subscription); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + return ObserveAsync(onEvent, cancellationToken); + } + + public ValueTask DisposeAsync() + { + m_client.Dispose(); + return default; + } + + private Variant ToBitVariant(bool[] bits) + { + return m_quantity == 1 + ? new Variant(bits[0]) + : new Variant((ArrayOf)bits); + } + + private readonly ModbusTcpClient m_client; + private readonly ModbusWotBindingOptions m_options; + private readonly ModbusOperation m_operation; + private readonly ushort m_address; + private readonly ushort m_quantity; + private readonly byte m_unitId; + private readonly string m_type; + private readonly bool m_msbFirst; + private readonly bool m_mswFirst; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingExecutor.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingExecutor.cs new file mode 100644 index 0000000000..41205e5968 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingExecutor.cs @@ -0,0 +1,98 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// Executes Modbus TCP WoT binding forms compiled by the + /// by opening a per-form Modbus TCP + /// connection. + /// + public sealed class ModbusWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new Modbus executor. + /// + public ModbusWotBindingExecutor(ModbusWotBindingOptions? options = null) + { + m_options = options ?? new ModbusWotBindingOptions(); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri, "W3C WoT Modbus Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + return form is not null && string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal); + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "The client is owned by the returned channel, which disposes it.")] + public async ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + // Re-validate the addressing (and perform the ushort / byte casts) before + // opening the socket so a hand-built or tampered compiled form fails fast + // and never leaks a half-open connection. + var addressing = ModbusAddressing.FromForm(form, context.Bounds); + string host = string.IsNullOrEmpty(form.Endpoint.Host) ? "127.0.0.1" : form.Endpoint.Host!; + int port = form.Endpoint.Port > 0 ? form.Endpoint.Port : 502; + var client = new ModbusTcpClient(host, port, context.Bounds.DefaultTimeout); + try + { + await client.ConnectAsync(cancellationToken).ConfigureAwait(false); + } + catch + { + client.Dispose(); + throw; + } + return new ModbusWotBindingChannel(client, form, context, m_options, addressing); + } + + private readonly ModbusWotBindingOptions m_options; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingOptions.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingOptions.cs new file mode 100644 index 0000000000..e2720044cb --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/ModbusWotBindingOptions.cs @@ -0,0 +1,72 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.WotCon.Bindings.Modbus +{ + /// + /// Options for the Modbus TCP WoT binding executor. + /// + public sealed class ModbusWotBindingOptions + { + /// + /// Gets or sets the poll interval used for observe operations. + /// + public TimeSpan ObserveInterval { get; set; } = TimeSpan.FromSeconds(1); + + /// + /// Gets or sets the retry policy applied after consecutive unhealthy polls during an + /// observe operation. Defaults to the stack's exponential backoff + /// (, 500 ms doubling to 30 s), so an + /// asset that has gone offline is not polled once per interval. The backoff never polls + /// faster than . + /// + public IChannelReconnectPolicy? RetryPolicy { get; set; } + } + + /// + /// Maps Modbus device exception codes to OPC UA status codes. + /// + internal static class ModbusStatusMapper + { + public static StatusCode Map(ModbusException exception) + { + return exception.ExceptionCode switch + { + 0x01 => StatusCodes.BadNotSupported, + 0x02 => StatusCodes.BadNodeIdUnknown, + 0x03 => StatusCodes.BadInvalidArgument, + 0x04 => StatusCodes.BadInternalError, + 0x06 => StatusCodes.BadResourceUnavailable, + _ => StatusCodes.BadCommunicationError + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Modbus/OpcUaModbusWotBindingBuilderExtensions.cs b/src/Opc.Ua.WotCon.Bindings/Modbus/OpcUaModbusWotBindingBuilderExtensions.cs new file mode 100644 index 0000000000..80ef357bbc --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Modbus/OpcUaModbusWotBindingBuilderExtensions.cs @@ -0,0 +1,61 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Opc.Ua; +using Opc.Ua.WotCon.Bindings.Modbus; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// extensions that register the Modbus TCP WoT + /// binding executor alongside the shipped planner binders. + /// + public static class OpcUaModbusWotBindingBuilderExtensions + { + /// + /// Registers the eight shipped planner binders and the Modbus TCP executor, + /// so Modbus binding forms are validated, compiled and executable. + /// + /// + public static IOpcUaBuilder AddModbusWotBinding( + this IOpcUaBuilder builder, Action? configure = null) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + var options = new ModbusWotBindingOptions(); + configure?.Invoke(options); + return builder + .AddWotProtocolBinders() + .AddWotBindingExecutor(new ModbusWotBindingExecutor(options)); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/ModbusDataTypes.cs b/src/Opc.Ua.WotCon.Bindings/ModbusDataTypes.cs new file mode 100644 index 0000000000..86f7ad206a --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/ModbusDataTypes.cs @@ -0,0 +1,84 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Normalizes Modbus scalar data types and returns their encoded register width. + /// + internal static class ModbusDataTypes + { + public static int RegisterCount(string? type) + { + return Normalize(type) switch + { + "int16" or "uint16" => 1, + "int32" or "uint32" or "float32" => 2, + "int64" or "uint64" or "float64" => 4, + _ => 1 + }; + } + + public static string Normalize(string? type) + { + switch ((type ?? "uint16").Trim().ToLowerInvariant()) + { + case "short": + case "int16": + return "int16"; + case "ushort": + case "uint16": + case "word": + return "uint16"; + case "int": + case "int32": + return "int32"; + case "uint": + case "uint32": + case "dword": + return "uint32"; + case "float": + case "float32": + case "single": + return "float32"; + case "long": + case "int64": + return "int64"; + case "ulong": + case "uint64": + return "uint64"; + case "double": + case "float64": + return "float64"; + default: + return "uint16"; + } + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/ModbusProtocolLimits.cs b/src/Opc.Ua.WotCon.Bindings/ModbusProtocolLimits.cs new file mode 100644 index 0000000000..0f6f1dde04 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/ModbusProtocolLimits.cs @@ -0,0 +1,47 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Modbus application-protocol limits used by both planning and execution. + /// + internal static class ModbusProtocolLimits + { + public const int MaxAddress = ushort.MaxValue; + + public const int MaxReadBits = 2000; + + public const int MaxWriteCoils = 1968; + + public const int MaxReadRegisters = 125; + + public const int MaxWriteRegisters = 123; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/NugetREADME.md b/src/Opc.Ua.WotCon.Bindings/NugetREADME.md new file mode 100644 index 0000000000..1d6ee7e34b --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/NugetREADME.md @@ -0,0 +1,23 @@ +# OPC UA WoT Connectivity — Protocol Binding Abstractions + +`OPCFoundation.NetStandard.Opc.Ua.WotCon.Bindings` is the protocol-binding abstraction and planner layer for the OPC UA WoT Connectivity 1.1 runtime. + +It defines the stable, replaceable protocol-binder contracts used by the materialization coordinator: + +* binding identification, version and capability descriptors; +* form validation and compilation into immutable binding plans; +* payload codec selection; +* credential / trust reference lookup (no secrets in Thing Descriptions); +* Prepare / Activate / Deactivate lifecycle; +* read / write / observe / action / event operations; +* structured diagnostics with RFC 6901 JSON Pointers. + +Planner/validator binders for HTTP, CoAP, MQTT, Modbus TCP, BACnet, PROFINET, LoRaWAN and OPC UA ship on every supported target framework. HTTP, Modbus TCP, and OPC UA executors are included when targeting net8.0 or later. MQTT remains in the optional `OPCFoundation.NetStandard.Opc.Ua.WotCon.Bindings.Mqtt` package because it carries the external MQTT transport dependency. + +## Target frameworks + +The base package targets `net472`, `net48`, `netstandard2.1`, `net8.0`, `net9.0`, and `net10.0`. The planner, plan, codec, credential, diagnostics, and registry APIs are available on all targets. The concrete `Opc.Ua.WotCon.Bindings.Http`, `Opc.Ua.WotCon.Bindings.Modbus`, and `Opc.Ua.WotCon.Bindings.OpcUa` namespaces are available only on `net8.0`, `net9.0`, and `net10.0`. + +OPC 10101 target mapping is protocol-neutral and authored on property affordances: `uav:mapToNodeId`, `uav:mapToType`, and `uav:mapByFieldPath` are validated centrally before protocol planning. + +See the [WoT protocol bindings guide](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/docs/WotBindings.md). diff --git a/src/Opc.Ua.WotCon.Bindings/Opc.Ua.WotCon.Bindings.csproj b/src/Opc.Ua.WotCon.Bindings/Opc.Ua.WotCon.Bindings.csproj new file mode 100644 index 0000000000..734341a7c2 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Opc.Ua.WotCon.Bindings.csproj @@ -0,0 +1,37 @@ + + + $(AssemblyPrefix).WotCon.Bindings + $(LibTargetFrameworks) + $(PackagePrefix).Opc.Ua.WotCon.Bindings + Opc.Ua.WotCon.Bindings + enable + OPC UA WoT Connectivity protocol-binding abstractions, planners, and net8.0+ HTTP, Modbus TCP, and OPC UA executors + true + NugetREADME.md + true + true + + + + + + + + + $(PackageId).Debug + + + + + + + + + + + + + + diff --git a/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaTargetWotBindingBuilderExtensions.cs b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaTargetWotBindingBuilderExtensions.cs new file mode 100644 index 0000000000..15ae8405b8 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaTargetWotBindingBuilderExtensions.cs @@ -0,0 +1,65 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Opc.Ua; +using Opc.Ua.WotCon.Bindings.OpcUa; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// extensions that register the OPC UA WoT binding + /// executor (OPC UA-to-OPC UA translation) alongside the shipped planner binders. + /// + public static class OpcUaTargetWotBindingBuilderExtensions + { + /// + /// Registers the eight shipped planner binders and the OPC UA executor, so + /// OPC UA binding forms are validated, compiled and executable. + /// + /// + public static IOpcUaBuilder AddOpcUaWotBinding( + this IOpcUaBuilder builder, Action configure) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (configure is null) + { + throw new ArgumentNullException(nameof(configure)); + } + var options = new OpcUaWotBindingOptions(); + configure(options); + return builder + .AddWotProtocolBinders() + .AddWotBindingExecutor(new OpcUaWotBindingExecutor(options)); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingChannel.cs b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingChannel.cs new file mode 100644 index 0000000000..e18ca4daec --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingChannel.cs @@ -0,0 +1,553 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; +using WellKnownObjectTypeIds = Opc.Ua.Types.ObjectTypeIds; + +namespace Opc.Ua.WotCon.Bindings.OpcUa +{ + /// + /// A live OPC UA binding channel that translates WoT operations onto OPC UA + /// services: read / write of a NodeId Value attribute, observe and event + /// subscription via a native / + /// pair (Part 4 §5.12 / §5.13), and action invocation via Method Call + /// preserving argument order and / + /// metadata. + /// + internal sealed class OpcUaWotBindingChannel : IWotBindingChannel + { + public OpcUaWotBindingChannel( + ISession session, + bool disposeSession, + WotCompiledForm form, + WotExecutorContext context, + OpcUaWotBindingOptions options) + { + m_session = session; + m_disposeSession = disposeSession; + Form = form; + m_options = options; + m_nodeId = form.Addressing.Target; + } + + public WotCompiledForm Form { get; } + + public async ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + if (!TryResolveNodeId(m_nodeId, out NodeId nodeId)) + { + return new WotReadResult( + StatusCodes.BadNodeIdInvalid, + DataValue.FromStatusCode(StatusCodes.BadNodeIdInvalid), + $"'{m_nodeId}' is not a valid NodeId."); + } + try + { + DataValue value = await m_session.ReadValueAsync(nodeId, cancellationToken).ConfigureAwait(false); + return new WotReadResult(value.StatusCode, value); + } + catch (ServiceResultException ex) + { + StatusCode status = ex.StatusCode; + return new WotReadResult(status, DataValue.FromStatusCode(status), ex.Message); + } + } + + public async ValueTask WriteAsync( + DataValue value, CancellationToken cancellationToken = default) + { + if (!TryResolveNodeId(m_nodeId, out NodeId nodeId)) + { + return new WotWriteResult(StatusCodes.BadNodeIdInvalid, $"'{m_nodeId}' is not a valid NodeId."); + } + try + { + var write = new WriteValue + { + NodeId = nodeId, + AttributeId = Attributes.Value, + Value = new DataValue(value.WrappedValue) + }; + WriteResponse response = await m_session + .WriteAsync(null, new WriteValue[] { write }, cancellationToken).ConfigureAwait(false); + StatusCode status = response.Results is { Count: > 0 } + ? response.Results[0] : StatusCodes.BadUnexpectedError; + return new WotWriteResult(status, StatusCode.IsBad(status) ? status.ToString() : null); + } + catch (ServiceResultException ex) + { + return new WotWriteResult(ex.StatusCode, ex.Message); + } + } + + public async ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + if (!Form.Addressing.Metadata.TryGetValue("componentOf", out string? objectRef) || + string.IsNullOrEmpty(objectRef) || + !TryResolveNodeId(objectRef!, out NodeId objectId)) + { + return new WotInvokeResult( + StatusCodes.BadNodeIdInvalid, null, + "An OPC UA action requires a uav:componentOf object NodeId."); + } + if (!TryResolveNodeId(m_nodeId, out NodeId methodId)) + { + return new WotInvokeResult( + StatusCodes.BadNodeIdInvalid, null, $"'{m_nodeId}' is not a valid method NodeId."); + } + try + { + Variant[] arguments = inputs is null ? [] : [.. inputs]; + ArrayOf outputs = await m_session + .CallAsync(objectId, methodId, cancellationToken, arguments).ConfigureAwait(false); + var results = new DataValue[outputs.Count]; + for (int i = 0; i < outputs.Count; i++) + { + results[i] = new DataValue(outputs[i], StatusCodes.Good, DateTimeUtc.Now, DateTimeUtc.Now); + } + return new WotInvokeResult(StatusCodes.Good, results); + } + catch (ServiceResultException ex) + { + return new WotInvokeResult(ex.StatusCode, null, ex.Message); + } + } + + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + if (!TryResolveNodeId(m_nodeId, out NodeId nodeId)) + { + throw new ServiceResultException( + StatusCodes.BadNodeIdInvalid, $"'{m_nodeId}' is not a valid NodeId."); + } + // Native data-change subscription: the server samples and reports + // changes (Part 4 §5.12); no client-side polling is involved. + return CreateMonitoredSubscriptionAsync( + nodeId, + NodeClass.Variable, + Attributes.Value, + filter: null, + queueSize: 1, + translate: static (_, notificationValue) => notificationValue is MonitoredItemNotification change + ? new WotNotification(change.Value) + : null, + onNotification, + cancellationToken); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + if (onEvent is null) + { + throw new ArgumentNullException(nameof(onEvent)); + } + if (!TryResolveNodeId(m_nodeId, out NodeId notifierId)) + { + throw new ServiceResultException( + StatusCodes.BadNodeIdInvalid, $"'{m_nodeId}' is not a valid event notifier NodeId."); + } + EventFilter filter = BuildEventFilter(); + return CreateMonitoredSubscriptionAsync( + notifierId, + NodeClass.Object, + Attributes.EventNotifier, + filter, + queueSize: m_options.EventQueueSize, + translate: (_, notificationValue) => notificationValue is EventFieldList eventFields + ? BuildEventNotification(filter, eventFields) + : null, + onEvent, + cancellationToken); + } + + public ValueTask DisposeAsync() + { + if (m_disposeSession) + { + m_session.Dispose(); + } + return default; + } + + /// + /// Opens a native OPC UA with a single + /// , translates each notification through + /// and forwards it to . + /// Ownership of the created subscription (and its server-side + /// resources) transfers to the returned ; + /// on any failure to create/apply, the subscription is torn down and + /// removed from the session before the exception propagates, so no + /// session/subscription is leaked. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller (an " + + "IWotSubscription), who disposes it; on failure it is disposed in the catch block.")] + private async ValueTask CreateMonitoredSubscriptionAsync( + NodeId targetId, + NodeClass nodeClass, + uint attributeId, + MonitoringFilter? filter, + uint queueSize, + Func translate, + Action onNotification, + CancellationToken cancellationToken) + { + int interval = NormalizeInterval(m_options.ObserveInterval); + var subscription = new Subscription(m_session.DefaultSubscription) + { + DisplayName = "wot-" + Form.AffordanceName, + PublishingEnabled = true, + PublishingInterval = interval + }; + m_session.AddSubscription(subscription); + try + { + await subscription.CreateAsync(cancellationToken).ConfigureAwait(false); + + var item = new MonitoredItem(subscription.DefaultItem) + { + StartNodeId = targetId, + NodeClass = nodeClass, + AttributeId = attributeId, + DisplayName = Form.AffordanceName, + SamplingInterval = interval, + QueueSize = queueSize, + DiscardOldest = true + }; + if (filter is not null) + { + item.Filter = filter; + } + + void OnItemNotification(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) + { + WotNotification? notification = translate(monitoredItem, e.NotificationValue); + if (notification is not null) + { + onNotification(notification); + } + } + item.Notification += OnItemNotification; + + subscription.AddItem(item); + await subscription.ApplyChangesAsync(cancellationToken).ConfigureAwait(false); + + if (!item.Created) + { + item.Notification -= OnItemNotification; + StatusCode status = item.Status.Error?.StatusCode ?? StatusCodes.BadMonitoredItemFilterUnsupported; + throw new ServiceResultException( + status, + item.Status.Error?.ToString() ?? "The server rejected the monitored item."); + } + + return new OpcUaMonitoredItemSubscription(Form, m_session, subscription, item, OnItemNotification); + } + catch + { + await RemoveSubscriptionSafeAsync(subscription).ConfigureAwait(false); + throw; + } + } + + private async ValueTask RemoveSubscriptionSafeAsync(Subscription subscription) + { + try + { + await m_session.RemoveSubscriptionAsync(subscription, CancellationToken.None).ConfigureAwait(false); + } + catch (ServiceResultException) + { + // Best-effort server-side cleanup; the session or subscription + // may already be unusable (for example a closed session). + } + subscription.Dispose(); + } + + /// + /// Builds the event select filter: , + /// , , + /// , , + /// , + /// and , plus any binding-authored + /// uav:eventFields select clauses carried by the compiled form. + /// + private EventFilter BuildEventFilter() + { + var filter = new EventFilter(); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.EventId)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.EventType)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.SourceNode)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.SourceName)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.Time)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.ReceiveTime)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.Message)); + filter.AddSelectClause( + WellKnownObjectTypeIds.BaseEventType, QualifiedName.From(EventBrowseNames.Severity)); + + if (Form.Addressing.Metadata.TryGetValue("eventFields", out string? extra) && + !string.IsNullOrEmpty(extra)) + { + var seen = new HashSet(StringComparer.Ordinal) + { + EventBrowseNames.EventId, EventBrowseNames.EventType, EventBrowseNames.SourceNode, + EventBrowseNames.SourceName, EventBrowseNames.Time, EventBrowseNames.ReceiveTime, + EventBrowseNames.Message, EventBrowseNames.Severity + }; + foreach (string field in extra.Split('|', StringSplitOptions.RemoveEmptyEntries)) + { + if (seen.Add(field)) + { + filter.AddSelectClause(WellKnownObjectTypeIds.BaseEventType, field, Attributes.Value); + } + } + } + return filter; + } + + /// + /// Projects a raw notification into a + /// deterministically: every select-clause + /// field is captured in keyed + /// by its browse path, each carrying the event's own Time / ReceiveTime + /// as its source / server timestamp so no timestamp is lost. The + /// notification's primary wraps the Message + /// field (or the first field, if Message was not selected) with a + /// status. + /// + private static WotNotification BuildEventNotification(EventFilter filter, EventFieldList eventFields) + { + ArrayOf values = eventFields.EventFields; + int count = Math.Min(filter.SelectClauses.Count, values.Count); + + DateTimeUtc sourceTimestamp = DateTimeUtc.Now; + DateTimeUtc serverTimestamp = DateTimeUtc.Now; + for (int i = 0; i < count; i++) + { + string name = FormatFieldName(filter.SelectClauses[i]); + if (string.Equals(name, EventBrowseNames.Time, StringComparison.Ordinal) && + values[i].TryGetValue(out DateTimeUtc time)) + { + sourceTimestamp = time; + } + else if (string.Equals(name, EventBrowseNames.ReceiveTime, StringComparison.Ordinal) && + values[i].TryGetValue(out DateTimeUtc receiveTime)) + { + serverTimestamp = receiveTime; + } + } + + var fields = new Dictionary(count, StringComparer.Ordinal); + Variant primary = Variant.Null; + bool havePrimary = false; + for (int i = 0; i < count; i++) + { + string name = FormatFieldName(filter.SelectClauses[i]); + Variant fieldValue = values[i]; + fields[name] = new DataValue(fieldValue, StatusCodes.Good, sourceTimestamp, serverTimestamp); + if (string.Equals(name, EventBrowseNames.Message, StringComparison.Ordinal)) + { + primary = fieldValue; + havePrimary = true; + } + } + // Defensive: BuildEventFilter always adds the Message select clause + // and is the only filter BuildEventNotification is ever called with, + // so a primary value is always found. The fallback keeps the + // notification meaningful if that filter ever stops selecting + // Message. + if (!havePrimary && count > 0) + { + primary = values[0]; + } + + var dataValue = new DataValue(primary, StatusCodes.Good, sourceTimestamp, serverTimestamp); + return new WotNotification(dataValue, fields); + } + + /// + /// Formats a select-clause browse path without its leading separator. + /// + private static string FormatFieldName(SimpleAttributeOperand clause) + { + string formatted = SimpleAttributeOperand.Format(clause.BrowsePath); + return formatted.Length > 0 && formatted[0] == '/' ? formatted[1..] : formatted; + } + + /// + /// The mandatory BaseEventType browse names (Part 5 §6.4.2) used to + /// build the baseline event select filter. These are stable OPC UA + /// browse names, so they are declared locally rather than depending on + /// a per-project generated identifier set. + /// + private static class EventBrowseNames + { + public const string EventId = "EventId"; + public const string EventType = "EventType"; + public const string SourceNode = "SourceNode"; + public const string SourceName = "SourceName"; + public const string Time = "Time"; + public const string ReceiveTime = "ReceiveTime"; + public const string Message = "Message"; + public const string Severity = "Severity"; + } + + /// + /// Normalizes an observe interval into a bounded millisecond publishing/sampling interval. + /// + private static int NormalizeInterval(TimeSpan interval) + { + double ms = interval.TotalMilliseconds; + return ms > 100.0 ? (int)ms : 100; + } + + /// + /// Resolves a compiled-form NodeId string to a local . + /// Plain ns= / i= / s= / g= / b= forms + /// resolve without a session round-trip. A portable NodeId carrying an + /// nsu= namespace URI (Part 6 §5.3.1.11) cannot be resolved by + /// alone (it always fails for that + /// form), so it is parsed as an and + /// resolved against the connected session's namespace table. + /// + private bool TryResolveNodeId(string value, out NodeId nodeId) + { + if (TryParseNodeId(value, out nodeId)) + { + return true; + } + if (!ExpandedNodeId.TryParse(value, out ExpandedNodeId expanded) || expanded.IsNull) + { + nodeId = NodeId.Null; + return false; + } + nodeId = ExpandedNodeId.ToNodeId(expanded, m_session.NamespaceUris); + return !nodeId.IsNull; + } + + private static bool TryParseNodeId(string value, out NodeId nodeId) + { + try + { + nodeId = NodeId.Parse(value); + return !nodeId.IsNull; + } + catch (ServiceResultException) + { + nodeId = NodeId.Null; + return false; + } + catch (FormatException) + { + nodeId = NodeId.Null; + return false; + } + catch (ArgumentException) + { + // NodeId.Parse throws ArgumentException (not ServiceResultException) + // for a portable "nsu=" / missing-identifier form; treat it the + // same as any other unparseable text so TryResolveNodeId can fall + // back to ExpandedNodeId + namespace table resolution. + nodeId = NodeId.Null; + return false; + } + } + + /// + /// A running native OPC UA subscription backing an observe or event + /// channel. Disposing it removes the monitored item's notification + /// handler and deletes the subscription server-side (via + /// ) before releasing the + /// local , so no session/subscription leaks. + /// + private sealed class OpcUaMonitoredItemSubscription : IWotSubscription + { + public OpcUaMonitoredItemSubscription( + WotCompiledForm form, + ISession session, + Subscription subscription, + MonitoredItem item, + MonitoredItemNotificationEventHandler handler) + { + Form = form; + m_session = session; + m_subscription = subscription; + m_item = item; + m_handler = handler; + } + + public WotCompiledForm Form { get; } + + public async ValueTask DisposeAsync() + { + m_item.Notification -= m_handler; + try + { + await m_session.RemoveSubscriptionAsync(m_subscription, CancellationToken.None) + .ConfigureAwait(false); + } + catch (ServiceResultException) + { + // Best-effort server-side cleanup; the session may already + // be closed or the subscription already removed. + } + m_subscription.Dispose(); + } + + private readonly ISession m_session; + private readonly Subscription m_subscription; + private readonly MonitoredItem m_item; + private readonly MonitoredItemNotificationEventHandler m_handler; + } + + private readonly ISession m_session; + private readonly bool m_disposeSession; + private readonly OpcUaWotBindingOptions m_options; + private readonly string m_nodeId; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingExecutor.cs b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingExecutor.cs new file mode 100644 index 0000000000..a556fa5e1a --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingExecutor.cs @@ -0,0 +1,89 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.OpcUa +{ + /// + /// Executes OPC UA WoT binding forms compiled by the + /// by connecting an to + /// the target endpoint through the injectable session factory. + /// + public sealed class OpcUaWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new OPC UA executor. + /// + public OpcUaWotBindingExecutor(OpcUaWotBindingOptions options) + { + m_options = options ?? throw new ArgumentNullException(nameof(options)); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("opc.opcua", "10101", OpcUaBindingPlanner.BindingUri, "OPC UA WoT Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + return form is not null && string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal); + } + + /// + public async ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + if (m_options.SessionFactory is null) + { + throw new InvalidOperationException( + "No OPC UA session factory is configured on the executor options."); + } + string endpoint = string.IsNullOrEmpty(form.Endpoint.BaseUri) + ? form.Endpoint.Scheme + "://" + (form.Endpoint.Host ?? string.Empty) + : form.Endpoint.BaseUri; + ISession session = await m_options.SessionFactory(endpoint, cancellationToken).ConfigureAwait(false); + return new OpcUaWotBindingChannel(session, m_options.DisposeSession, form, context, m_options); + } + + private readonly OpcUaWotBindingOptions m_options; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingOptions.cs b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingOptions.cs new file mode 100644 index 0000000000..8787f005fa --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/OpcUa/OpcUaWotBindingOptions.cs @@ -0,0 +1,74 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; + +namespace Opc.Ua.WotCon.Bindings.OpcUa +{ + /// + /// Options for the OPC UA WoT binding executor. The session factory connects a + /// client session to the target endpoint and is injectable so callers control + /// the application configuration, security and identity. + /// + public sealed class OpcUaWotBindingOptions + { + /// + /// Gets or sets the factory that connects an to the + /// supplied opc.tcp endpoint. It is required for execution. + /// + public Func>? SessionFactory { get; set; } + + /// + /// Gets or sets whether the executor disposes the session when the channel + /// is disposed. Set to false when a shared, caller-owned session is + /// returned by the factory. + /// + public bool DisposeSession { get; set; } = true; + + /// + /// Gets or sets the sampling / publishing interval used for observe and + /// event subscriptions. Observe and event notifications are delivered by + /// a native OPC UA / + /// pair (Part 4 §5.13 / §5.12); this bounds how fast the server samples + /// and publishes, not a client-side poll. + /// + public TimeSpan ObserveInterval { get; set; } = TimeSpan.FromSeconds(1); + + /// + /// Gets or sets the bounded monitored-item queue size requested for + /// event subscriptions, so a burst of events cannot grow the server-side + /// queue without bound. Property observe monitored items always request + /// a queue size of 1 (only the latest value is relevant). + /// + public uint EventQueueSize { get; set; } = 10; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/OpcUaWotBindingBuilderExtensions.cs b/src/Opc.Ua.WotCon.Bindings/OpcUaWotBindingBuilderExtensions.cs new file mode 100644 index 0000000000..c8029c0cdb --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/OpcUaWotBindingBuilderExtensions.cs @@ -0,0 +1,176 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Opc.Ua; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// extensions that register replaceable WoT + /// protocol binders and executors and wire them into the WoT Connectivity 1.1 + /// materialization coordinator. Binders are injected independently and are + /// selected by pinned identification rules; concrete executors are registered + /// separately so a protocol can be validated without being executable and can + /// be upgraded to executable once its executor is present. The bundled HTTP, + /// Modbus TCP, and OPC UA registration helpers call these extensions directly; + /// the optional MQTT package does the same from its own assembly. + /// + public static class OpcUaWotBindingBuilderExtensions + { + /// + /// Registers the eight shipped planner / validator binders (HTTP, CoAP, + /// MQTT, Modbus TCP, BACnet, PROFINET, LoRaWAN and OPC UA) and replaces the + /// binder registry with the aggregating + /// . Without any executor these + /// binders validate and compile plans but materialize non-executable nodes. + /// + /// + public static IOpcUaBuilder AddWotProtocolBinders(this IOpcUaBuilder builder) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + foreach (IWotProtocolBinder binder in WotBuiltInBinders.CreateAll()) + { + builder.Services.TryAddEnumerable( + ServiceDescriptor.Singleton(binder)); + } + EnsureRegistry(builder.Services); + return builder; + } + + /// + /// Registers a single, custom protocol binder. + /// + /// + public static IOpcUaBuilder AddWotBinder(this IOpcUaBuilder builder, IWotProtocolBinder binder) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (binder is null) + { + throw new ArgumentNullException(nameof(binder)); + } + builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton(binder)); + EnsureRegistry(builder.Services); + return builder; + } + + /// + /// Registers a runtime executor for a binder identity. + /// + /// + public static IOpcUaBuilder AddWotBindingExecutor( + this IOpcUaBuilder builder, IWotBindingExecutor executor) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (executor is null) + { + throw new ArgumentNullException(nameof(executor)); + } + builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton(executor)); + EnsureRegistry(builder.Services); + return builder; + } + + /// + /// Registers the credential provider used to resolve secret-free references. + /// + /// + public static IOpcUaBuilder AddWotCredentialProvider( + this IOpcUaBuilder builder, IWotCredentialProvider provider) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (provider is null) + { + throw new ArgumentNullException(nameof(provider)); + } + builder.Services.AddSingleton(provider); + return builder; + } + + private static void EnsureRegistry(IServiceCollection services) + { + services.EnsureWotBinderRegistry(); + } + } + + /// + /// extension shared by every registration + /// path (the Bindings builder extensions above and + /// AddWotRegistryServer) that needs the aggregating + /// . It is safe to call any number + /// of times, in any order relative to + /// registrations: the registry is registered once via TryAddSingleton + /// as its own concrete type, and both and + /// are wired to resolve that same + /// singleton instance, so exactly one registry is ever constructed + /// regardless of registration order. + /// + public static class WotBinderRegistryServiceCollectionExtensions + { + /// + /// Ensures the aggregating is + /// registered exactly once and exposed as both + /// and + /// . + /// + /// + public static IServiceCollection EnsureWotBinderRegistry(this IServiceCollection services) + { + if (services is null) + { + throw new ArgumentNullException(nameof(services)); + } + services.TryAddSingleton(sp => new WotProtocolBinderRegistry( + sp.GetServices(), + sp.GetServices(), + sp.GetService(), + sp.GetService())); + services.TryAddSingleton( + sp => sp.GetRequiredService()); + services.TryAddSingleton( + sp => sp.GetRequiredService()); + return services; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/BacnetBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/BacnetBindingPlanner.cs new file mode 100644 index 0000000000..511bc593f8 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/BacnetBindingPlanner.cs @@ -0,0 +1,145 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The W3C WoT BACnet binding planner (Editor's Draft). It validates the + /// bacv: vocabulary (objectType, instanceNumber, + /// propertyIdentifier, optional usePriority) at the schema / + /// document level and compiles immutable object-reference metadata. This build + /// performs planning only; the binding is reported as non-executable. + /// + public sealed class BacnetBindingPlanner : WotProtocolBinderBase + { + /// + /// The BACnet binding vocabulary URI. + /// + public const string BindingUri = "https://www.w3.org/2019/wot/bacnet#"; + + private static readonly string[] s_schemes = ["bacnet"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.bacnet", "1.0-ed", BindingUri, "W3C WoT BACnet Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "W3C WoT BACnet Binding (Editor's Draft)", + WotBindingSources.Bacnet, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty + ], + ["application/json"], + isExecutable: false); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "bacv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!form.TryGetString("bacv:objectType", out string objectType)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "A BACnet form requires bacv:objectType.", + form.Pointer("bacv:objectType"), "bacv:objectType")); + } + if (!form.TryGetInt32("bacv:instanceNumber", out int instanceNumber) || instanceNumber < 0) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "A BACnet form requires a non-negative bacv:instanceNumber.", + form.Pointer("bacv:instanceNumber"), "bacv:instanceNumber")); + } + if (!form.TryGetString("bacv:propertyIdentifier", out string propertyId)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "A BACnet form requires bacv:propertyIdentifier.", + form.Pointer("bacv:propertyIdentifier"), "bacv:propertyIdentifier")); + } + if (form.TryGetInt32("bacv:usePriority", out int priority) && (priority is < 1 or > 16)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "bacv:usePriority must be between 1 and 16.", + form.Pointer("bacv:usePriority"), "bacv:usePriority")); + } + + foreach (WotBindingDiagnostic diagnostic in diagnostics) + { + if (diagnostic.IsError) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + } + + ImmutableDictionary metadata = ImmutableDictionary.Empty + .Add("objectType", objectType) + .Add("instanceNumber", instanceNumber.ToString(CultureInfo.InvariantCulture)) + .Add("propertyIdentifier", propertyId); + var addressing = new WotAddressingDescriptor( + $"{objectType}:{instanceNumber.ToString(CultureInfo.InvariantCulture)}:{propertyId}", metadata); + WotEndpointDescriptor endpoint = MakeEndpointOrSynthetic(form.Href, "bacnet"); + ResolveCodec(form, context, out WotPayloadDescriptor payload); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, capability.ToString()); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/CoapBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/CoapBindingPlanner.cs new file mode 100644 index 0000000000..960a295f99 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/CoapBindingPlanner.cs @@ -0,0 +1,159 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The W3C WoT CoAP binding planner (Editor's Draft). It validates the + /// coap / coaps href scheme and the cov: vocabulary + /// (method, observe, contentFormat, accept) and + /// compiles the form into immutable metadata. This build ships the CoAP + /// planner only; the binding is reported as non-executable. + /// + public sealed class CoapBindingPlanner : WotProtocolBinderBase + { + /// + /// The CoAP binding vocabulary URI. + /// + public const string BindingUri = "http://www.w3.org/2019/wot/coap#"; + + private static readonly string[] s_schemes = ["coap", "coaps"]; + + private static readonly HashSet s_methods = new(StringComparer.OrdinalIgnoreCase) + { + "GET", "PUT", "POST", "DELETE", "FETCH", "PATCH", "iPATCH" + }; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.coap", "1.0-ed", BindingUri, "W3C WoT CoAP Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "W3C WoT CoAP Binding (Editor's Draft)", + WotBindingSources.Coap, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty, + WoTBindingCapabilityEnum.InvokeAction, + WoTBindingCapabilityEnum.SubscribeEvent, + WoTBindingCapabilityEnum.UnsubscribeEvent + ], + ["application/json", "application/cbor", "text/plain"], + isExecutable: false); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "cov:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href)) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (!TryParseUri(href, out Uri uri) || + (!string.Equals(uri.Scheme, "coap", StringComparison.OrdinalIgnoreCase) && + !string.Equals(uri.Scheme, "coaps", StringComparison.OrdinalIgnoreCase))) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid absolute coap(s) URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string? methodOverride = null; + if (form.TryGetString("cov:method", out string method)) + { + if (!s_methods.Contains(method)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + $"'{method}' is not a valid CoAP method.", form.Pointer("cov:method"), "cov:method")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + methodOverride = method; + } + if (form.FormElement.TryGetProperty("cov:contentFormat", out System.Text.Json.JsonElement cf) && + cf.ValueKind == System.Text.Json.JsonValueKind.Number && + !cf.TryGetInt32(out int _)) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.InvalidFieldValue, + "cov:contentFormat should be an integer Content-Format code.", + form.Pointer("cov:contentFormat"), "cov:contentFormat")); + } + + ResolveCodec(form, context, out WotPayloadDescriptor payload); + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor(uri.AbsoluteUri); + ImmutableArray security = + ResolveSecurity(form, context, uri.GetLeftPart(UriPartial.Authority), diagnostics); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + string coapMethod = methodOverride ?? DefaultMethod(capability); + var operation = new WotOperationDescriptor(capability, op, coapMethod); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, security, Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private static string DefaultMethod(WoTBindingCapabilityEnum operation) + { + return operation switch + { + WoTBindingCapabilityEnum.WriteProperty => "PUT", + WoTBindingCapabilityEnum.InvokeAction => "POST", + _ => "GET" + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/HttpBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/HttpBindingPlanner.cs new file mode 100644 index 0000000000..a41ac5a66c --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/HttpBindingPlanner.cs @@ -0,0 +1,165 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The W3C WoT HTTP binding planner. It validates the http / https + /// href scheme and the normative htv: vocabulary of TD 1.1, checks + /// op compatibility, content type and required fields, and compiles the + /// form into immutable endpoint / addressing / operation / payload metadata. + /// It is executable when the HTTP executor is registered. + /// + public sealed class HttpBindingPlanner : WotProtocolBinderBase + { + /// + /// The HTTP binding vocabulary URI. + /// + public const string BindingUri = "http://www.w3.org/2011/http#"; + + private static readonly string[] s_schemes = ["http", "https"]; + + private static readonly HashSet s_methods = new(StringComparer.Ordinal) + { + "GET", "PUT", "POST", "DELETE", "PATCH", "HEAD", "OPTIONS" + }; + + private static readonly HashSet s_subprotocols = new(StringComparer.Ordinal) + { + "longpoll", "sse", "websub" + }; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.http", "1.1", BindingUri, "W3C WoT HTTP Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "W3C WoT HTTP Binding (TD 1.1)", + WotBindingSources.Http, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty, + WoTBindingCapabilityEnum.InvokeAction, + WoTBindingCapabilityEnum.SubscribeEvent, + WoTBindingCapabilityEnum.UnsubscribeEvent + ], + ["application/json", "text/plain", "application/octet-stream"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "htv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href)) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (!TryParseUri(href, out Uri uri) || + (!string.Equals(uri.Scheme, "http", StringComparison.OrdinalIgnoreCase) && + !string.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid absolute http(s) URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string? methodOverride = null; + if (form.TryGetString("htv:methodName", out string method)) + { + if (!s_methods.Contains(method)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + $"'{method}' is not a valid HTTP method.", form.Pointer("htv:methodName"), "htv:methodName")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + methodOverride = method; + } + + if (!string.IsNullOrEmpty(form.Subprotocol) && !s_subprotocols.Contains(form.Subprotocol!)) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.InvalidFieldValue, + $"The subprotocol '{form.Subprotocol}' is not a recognized HTTP subprotocol.", + form.Pointer("subprotocol"), "subprotocol")); + } + + ResolveCodec(form, context, out WotPayloadDescriptor payload); + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor(uri.AbsoluteUri); + ImmutableArray security = + ResolveSecurity(form, context, uri.GetLeftPart(UriPartial.Authority), diagnostics); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + string httpMethod = methodOverride ?? DefaultMethod(capability); + var operation = new WotOperationDescriptor( + capability, op, httpMethod, + ImmutableDictionary.Empty.Add("subprotocol", form.Subprotocol ?? string.Empty)); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, security, Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private static string DefaultMethod(WoTBindingCapabilityEnum operation) + { + return operation switch + { + WoTBindingCapabilityEnum.WriteProperty => "PUT", + WoTBindingCapabilityEnum.InvokeAction => "POST", + _ => "GET" + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/LoRaWanBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/LoRaWanBindingPlanner.cs new file mode 100644 index 0000000000..dee60fc3b4 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/LoRaWanBindingPlanner.cs @@ -0,0 +1,155 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The LoRaWAN binding planner (unofficial draft). It validates the + /// lorawan: vocabulary (DevEUI, optional fPort) at the + /// schema / document level and compiles immutable device addressing metadata. + /// This build performs planning only; the binding is reported as + /// non-executable. + /// + public sealed class LoRaWanBindingPlanner : WotProtocolBinderBase + { + /// + /// The LoRaWAN binding vocabulary URI. + /// + public const string BindingUri = "https://www.w3.org/2019/wot/lorawan#"; + + private static readonly string[] s_schemes = ["lorawan"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.lorawan", "0.1-draft", BindingUri, "WoT LoRaWAN Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "WoT LoRaWAN Binding (unofficial draft)", + WotBindingSources.LoRaWan, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty + ], + ["application/octet-stream", "application/json"], + isExecutable: false); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "lorawan:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!form.TryGetString("lorawan:DevEUI", out string devEui) && + !form.TryGetString("lorawan:devEUI", out devEui)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "A LoRaWAN form requires lorawan:DevEUI.", + form.Pointer("lorawan:DevEUI"), "lorawan:DevEUI")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (!IsHex(devEui, 16)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "lorawan:DevEUI must be a 16-character hexadecimal identifier.", + form.Pointer("lorawan:DevEUI"), "lorawan:DevEUI")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + int fPort = 1; + if (form.TryGetInt32("lorawan:fPort", out int parsedPort)) + { + if (parsedPort is < 1 or > 223) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "lorawan:fPort must be between 1 and 223.", + form.Pointer("lorawan:fPort"), "lorawan:fPort")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + fPort = parsedPort; + } + + ImmutableDictionary metadata = ImmutableDictionary.Empty + .Add("devEui", devEui) + .Add("fPort", fPort.ToString(CultureInfo.InvariantCulture)); + var addressing = new WotAddressingDescriptor( + $"{devEui}/{fPort.ToString(CultureInfo.InvariantCulture)}", metadata); + WotEndpointDescriptor endpoint = MakeEndpointOrSynthetic(form.Href, "lorawan"); + ResolveCodec(form, context, out WotPayloadDescriptor payload); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, capability.ToString()); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private static bool IsHex(string value, int length) + { + if (value is null || value.Length != length) + { + return false; + } + foreach (char c in value) + { + bool hex = c is (>= '0' and <= '9') or (>= 'a' and <= 'f') or (>= 'A' and <= 'F'); + if (!hex) + { + return false; + } + } + return true; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/ModbusBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/ModbusBindingPlanner.cs new file mode 100644 index 0000000000..3232f80e23 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/ModbusBindingPlanner.cs @@ -0,0 +1,512 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The W3C WoT Modbus binding planner (Editor's Draft). It validates the + /// modbus+tcp href scheme and the modv: vocabulary + /// (entity, function, address, quantity, + /// unitID, type), enforces read-only entity and quantity bounds, + /// checks op compatibility, and compiles the form into immutable Modbus + /// register addressing metadata. It is executable when the Modbus executor is + /// registered. + /// + public sealed class ModbusBindingPlanner : WotProtocolBinderBase + { + /// + /// The Modbus binding vocabulary URI. + /// + public const string BindingUri = "https://www.w3.org/2019/wot/modbus#"; + + /// + /// The maximum addressable 16-bit Modbus register / bit address. + /// + private const int MaxAddress = ModbusProtocolLimits.MaxAddress; + + private static readonly string[] s_schemes = ["modbus+tcp", "modbus"]; + + private static readonly HashSet s_readOnlyEntities = new(StringComparer.OrdinalIgnoreCase) + { + "discreteinput", "inputregister" + }; + + private static readonly HashSet s_entities = new(StringComparer.OrdinalIgnoreCase) + { + "coil", "discreteinput", "holdingregister", "inputregister" + }; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.modbus", "1.0-ed", BindingUri, "W3C WoT Modbus Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "W3C WoT Modbus TCP Binding (Editor's Draft)", + WotBindingSources.Modbus, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty + ], + ["application/octet-stream", "application/json"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "modv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href)) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (!TryParseUri(href, out Uri uri) || + (!string.Equals(uri.Scheme, "modbus+tcp", StringComparison.OrdinalIgnoreCase) && + !string.Equals(uri.Scheme, "modbus", StringComparison.OrdinalIgnoreCase))) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid absolute modbus+tcp URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string? entity = form.TryGetString("modv:entity", out string entityValue) ? entityValue : null; + if (entity is not null && !s_entities.Contains(entity)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + $"'{entity}' is not a valid Modbus entity.", form.Pointer("modv:entity"), "modv:entity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + // Resolve modv:function (string mnemonic or numeric code) to a canonical + // function code, its entity and its read / write direction. A function is + // optional, but when present it must be one of the exactly mapped codes + // 1, 2, 3, 4, 5, 6, 15 or 16. + bool functionPresent = form.FormElement.ValueKind == System.Text.Json.JsonValueKind.Object && + form.FormElement.TryGetProperty("modv:function", out _); + ModbusFunctionInfo? function = null; + if (functionPresent) + { + if (!TryResolveFunction(form, out ModbusFunctionInfo resolved)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "modv:function must be one of the Modbus function codes 1, 2, 3, 4, 5, 6, 15 or 16 " + + "(or their canonical mnemonics).", + form.Pointer("modv:function"), "modv:function")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + function = resolved; + } + + if (entity is null && function is null) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "A Modbus form requires modv:entity or modv:function.", + form.Pointer("modv:entity"), "modv:entity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + // A form that declares both must be internally consistent: the function's + // entity has to match the declared entity. + if (entity is not null && + function is not null && + !string.Equals(entity, function.Value.Entity, StringComparison.OrdinalIgnoreCase)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.ConflictingFields, + $"modv:function '{function.Value.Mnemonic}' operates on '{function.Value.Entity}' " + + $"which conflicts with modv:entity '{entity}'.", + form.Pointer("modv:function"), "modv:function")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string effectiveEntity = entity ?? function!.Value.Entity; + + if (!form.TryGetInt32("modv:address", out int address) || address is < 0 or > MaxAddress) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + $"A Modbus form requires a modv:address between 0 and {MaxAddress}.", + form.Pointer("modv:address"), "modv:address")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + int quantity = form.TryGetInt32("modv:quantity", out int parsedQuantity) ? parsedQuantity : 1; + if (quantity < 1) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "modv:quantity must be at least 1.", form.Pointer("modv:quantity"), "modv:quantity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + bool bitEntity = + string.Equals(effectiveEntity, "coil", StringComparison.OrdinalIgnoreCase) || + string.Equals(effectiveEntity, "discreteInput", StringComparison.OrdinalIgnoreCase); + if (function?.Code is 5 or 6 && quantity != 1) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.ConflictingFields, + $"modv:function '{function.Value.Mnemonic}' requires modv:quantity 1; " + + $"the form specifies {quantity}.", + form.Pointer("modv:quantity"), "modv:quantity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (function?.Code == 15 && quantity > ModbusProtocolLimits.MaxWriteCoils) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.BoundsExceeded, + $"modv:function '{function.Value.Mnemonic}' supports at most " + + $"{ModbusProtocolLimits.MaxWriteCoils} coils; the form specifies {quantity}.", + form.Pointer("modv:quantity"), "modv:quantity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (function?.Code == 16 && quantity > ModbusProtocolLimits.MaxWriteRegisters) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.BoundsExceeded, + $"modv:function '{function.Value.Mnemonic}' supports at most " + + $"{ModbusProtocolLimits.MaxWriteRegisters} registers; the form specifies {quantity}.", + form.Pointer("modv:quantity"), "modv:quantity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + int protocolMaxQuantity = bitEntity + ? ModbusProtocolLimits.MaxReadBits + : ModbusProtocolLimits.MaxReadRegisters; + int configuredMaxQuantity = bitEntity + ? context.Bounds.MaxCoilQuantity + : context.Bounds.MaxRegisterQuantity; + int maxQuantity = Math.Min(configuredMaxQuantity, protocolMaxQuantity); + if (quantity > maxQuantity) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.BoundsExceeded, + $"modv:quantity {quantity} exceeds the maximum of {maxQuantity}.", + form.Pointer("modv:quantity"), "modv:quantity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + // The addressed range must not run past the 16-bit Modbus address space. + if (address + quantity - 1 > MaxAddress) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.BoundsExceeded, + $"The Modbus range starting at {address} for {quantity} items exceeds the " + + $"maximum address {MaxAddress}.", + form.Pointer("modv:quantity"), "modv:quantity")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + int unitId = form.TryGetInt32("modv:unitID", out int parsedUnit) ? parsedUnit : ParseUnitFromPath(uri); + if (unitId is < 0 or > 255) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "modv:unitID must be between 0 and 255.", form.Pointer("modv:unitID"), "modv:unitID")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + // modv:pollingTime is the W3C Modbus binding's standard subscription polling interval, + // expressed in milliseconds. It is distinct from modv:timeout, which is a request + // timeout. A form that does not declare it falls back to the executor's configured + // ObserveInterval. + TimeSpan? pollInterval = null; + if (form.TryGetInt32("modv:pollingTime", out int pollingTime)) + { + if (pollingTime <= 0) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "modv:pollingTime must be greater than zero.", + form.Pointer("modv:pollingTime"), + "modv:pollingTime")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + pollInterval = TimeSpan.FromMilliseconds(pollingTime); + } + + bool bitArrayPayload = bitEntity && quantity > 1; string dataType = bitEntity + ? (bitArrayPayload ? "boolean[]" : "boolean") + : (form.TryGetString("modv:type", out string type) ? type : "uint16"); + int encodedRegisterCount = bitEntity ? 0 : ModbusDataTypes.RegisterCount(dataType); + bool msbFirst = !form.TryGetBoolean("modv:mostSignificantByte", out bool msb) || msb; + bool mswFirst = !form.TryGetBoolean("modv:mostSignificantWord", out bool msw) || msw; + + ImmutableDictionary address4 = ImmutableDictionary.Empty + .Add("entity", effectiveEntity) + .Add("address", address.ToString(CultureInfo.InvariantCulture)) + .Add("quantity", quantity.ToString(CultureInfo.InvariantCulture)) + .Add("unitId", unitId.ToString(CultureInfo.InvariantCulture)); + if (function is not null) + { + address4 = address4 + .Add("function", function.Value.Mnemonic) + .Add("functionCode", function.Value.Code.ToString(CultureInfo.InvariantCulture)); + } + + ImmutableDictionary payloadMetadata = ImmutableDictionary.Empty + .Add("type", dataType) + .Add("mostSignificantByte", msbFirst ? "true" : "false") + .Add("mostSignificantWord", mswFirst ? "true" : "false"); + var payload = new WotPayloadDescriptor( + string.IsNullOrEmpty(form.ContentType) ? "application/octet-stream" : form.ContentType!, + OctetStreamWotPayloadCodec.Instance.Id, payloadMetadata); + + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor( + $"{effectiveEntity}:{address}:{quantity}@{unitId}", address4); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + bool isWriteOp = capability == WoTBindingCapabilityEnum.WriteProperty; + if (isWriteOp && s_readOnlyEntities.Contains(effectiveEntity)) + { + // A read-only entity (discrete input / input register) commonly + // carries the default read+write property ops. Drop only the + // write op with a warning so the valid read binding is still + // compiled; an error here would set HasErrors and cause the + // whole form (read included) to be dropped as unsupported. + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.ConflictingFields, + $"The Modbus entity '{effectiveEntity}' is read-only; the write operation is not " + + "executable and was dropped while the read binding is preserved.", + form.Pointer("modv:entity"), "modv:entity")); + continue; + } + int inferredWriteMaximum = bitEntity + ? ModbusProtocolLimits.MaxWriteCoils + : ModbusProtocolLimits.MaxWriteRegisters; + if (isWriteOp && + function is null && + quantity > inferredWriteMaximum) + { + string items = bitEntity ? "coils" : "registers"; + string writeKind = bitEntity ? "multiple-coil" : "multiple-register"; + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.BoundsExceeded, + $"A Modbus {writeKind} write supports at most " + + $"{inferredWriteMaximum} {items}; the write operation was dropped " + + $"while the read binding is preserved.", + form.Pointer("modv:quantity"), "modv:quantity")); + continue; + } + // Reject op / function direction mismatches: an explicit write + // function cannot serve a read / observe op and vice versa. The + // offending op is dropped (rejected) while any compatible op on the + // same form is preserved. + if (function is not null && function.Value.IsWrite != isWriteOp) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.ConflictingFields, + $"modv:function '{function.Value.Mnemonic}' is a " + + (function.Value.IsWrite ? "write" : "read") + + $" function and cannot serve the '{op}' operation; the operation was dropped.", + form.Pointer("modv:function"), "modv:function")); + continue; + } + if (isWriteOp && !bitEntity && quantity != encodedRegisterCount) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.ConflictingFields, + $"modv:quantity {quantity} does not match the {encodedRegisterCount}-register " + + $"encoded width of modv:type '{dataType}'; the write operation was dropped.", + form.Pointer("modv:quantity"), "modv:quantity")); + continue; + } + string method = function is not null + ? function.Value.Mnemonic + : ModbusFunction(capability, effectiveEntity, quantity); + var operation = new WotOperationDescriptor( + capability, op, method, pollInterval: pollInterval); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private static int ParseUnitFromPath(Uri uri) + { + string path = uri.AbsolutePath.Trim('/'); + return int.TryParse(path, NumberStyles.Integer, CultureInfo.InvariantCulture, out int unit) ? unit : 1; + } + + private static string ModbusFunction(WoTBindingCapabilityEnum operation, string? entity, int quantity) + { + bool coil = string.Equals(entity, "coil", StringComparison.OrdinalIgnoreCase); + bool discrete = string.Equals(entity, "discreteInput", StringComparison.OrdinalIgnoreCase); + bool input = string.Equals(entity, "inputRegister", StringComparison.OrdinalIgnoreCase); + if (operation == WoTBindingCapabilityEnum.WriteProperty) + { + return coil + ? (quantity > 1 ? "writeMultipleCoils" : "writeSingleCoil") + : (quantity > 1 ? "writeMultipleHoldingRegisters" : "writeSingleHoldingRegister"); + } + if (coil) + { + return "readCoil"; + } + if (discrete) + { + return "readDiscreteInput"; + } + if (input) + { + return "readInputRegister"; + } + return "readHoldingRegisters"; + } + + /// + /// The canonical entity, direction and code for a Modbus function. + /// + private readonly struct ModbusFunctionInfo + { + public ModbusFunctionInfo(int code, string entity, bool isWrite, string mnemonic) + { + Code = code; + Entity = entity; + IsWrite = isWrite; + Mnemonic = mnemonic; + } + + public int Code { get; } + + public string Entity { get; } + + public bool IsWrite { get; } + + public string Mnemonic { get; } + } + + /// + /// Resolves the modv:function term (a string mnemonic or a numeric + /// code) to one of the exactly mapped Modbus function codes 1, 2, 3, 4, 5, + /// 6, 15 or 16. Returns false when the term is present but not a + /// recognized function. + /// + private static bool TryResolveFunction(WotAffordanceForm form, out ModbusFunctionInfo info) + { + if (form.TryGetString("modv:function", out string text) && !string.IsNullOrEmpty(text)) + { + switch (text.Trim().ToLowerInvariant()) + { + case "readcoil": + case "readcoils": + info = Function(1); + return true; + case "readdiscreteinput": + case "readdiscreteinputs": + info = Function(2); + return true; + case "readholdingregister": + case "readholdingregisters": + info = Function(3); + return true; + case "readinputregister": + case "readinputregisters": + info = Function(4); + return true; + case "writesinglecoil": + info = Function(5); + return true; + case "writesingleholdingregister": + case "writesingleregister": + info = Function(6); + return true; + case "writemultiplecoils": + info = Function(15); + return true; + case "writemultipleholdingregisters": + case "writemultipleregisters": + info = Function(16); + return true; + default: + if (int.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out int parsed) && + IsMappedCode(parsed)) + { + info = Function(parsed); + return true; + } + break; + } + } + else if (form.TryGetInt32("modv:function", out int code) && IsMappedCode(code)) + { + info = Function(code); + return true; + } + info = default; + return false; + } + + private static bool IsMappedCode(int code) + { + return code is 1 or 2 or 3 or 4 or 5 or 6 or 15 or 16; + } + + private static ModbusFunctionInfo Function(int code) + { + return code switch + { + 1 => new ModbusFunctionInfo(1, "coil", false, "readCoil"), + 2 => new ModbusFunctionInfo(2, "discreteInput", false, "readDiscreteInput"), + 3 => new ModbusFunctionInfo(3, "holdingRegister", false, "readHoldingRegisters"), + 4 => new ModbusFunctionInfo(4, "inputRegister", false, "readInputRegister"), + 5 => new ModbusFunctionInfo(5, "coil", true, "writeSingleCoil"), + 6 => new ModbusFunctionInfo(6, "holdingRegister", true, "writeSingleHoldingRegister"), + 15 => new ModbusFunctionInfo(15, "coil", true, "writeMultipleCoils"), + _ => new ModbusFunctionInfo(16, "holdingRegister", true, "writeMultipleHoldingRegisters") + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/MqttBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/MqttBindingPlanner.cs new file mode 100644 index 0000000000..af0beb060e --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/MqttBindingPlanner.cs @@ -0,0 +1,189 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The W3C WoT MQTT binding planner (Editor's Draft). It validates the + /// mqtt / mqtts href scheme and the mqv: vocabulary + /// (controlPacket, topic, qos, retain), checks + /// op compatibility, content type, QoS and topic bounds, and compiles + /// the form into immutable publish / subscribe metadata. It is executable when + /// the MQTT executor is registered. + /// + public sealed class MqttBindingPlanner : WotProtocolBinderBase + { + /// + /// The MQTT binding vocabulary URI. + /// + public const string BindingUri = "https://www.w3.org/2019/wot/mqtt"; + + private static readonly string[] s_schemes = ["mqtt", "mqtts"]; + + private static readonly HashSet s_controlPackets = new(StringComparer.OrdinalIgnoreCase) + { + "connect", "publish", "subscribe", "unsubscribe", "disconnect" + }; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.mqtt", "1.0-ed", BindingUri, "W3C WoT MQTT Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "W3C WoT MQTT Binding (Editor's Draft)", + WotBindingSources.Mqtt, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty, + WoTBindingCapabilityEnum.InvokeAction, + WoTBindingCapabilityEnum.SubscribeEvent, + WoTBindingCapabilityEnum.UnsubscribeEvent + ], + ["application/json", "text/plain", "application/octet-stream"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "mqv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href)) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (!TryParseUri(href, out Uri uri) || + (!string.Equals(uri.Scheme, "mqtt", StringComparison.OrdinalIgnoreCase) && + !string.Equals(uri.Scheme, "mqtts", StringComparison.OrdinalIgnoreCase))) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid absolute mqtt(s) URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string topic = form.TryGetString("mqv:topic", out string explicitTopic) + ? explicitTopic + : uri.AbsolutePath.TrimStart('/'); + if (string.IsNullOrEmpty(topic)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "No MQTT topic could be resolved from mqv:topic or the href path.", + form.Pointer("mqv:topic"), "mqv:topic")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + if (topic.Length > context.Bounds.MaxTopicLength) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.BoundsExceeded, + $"The MQTT topic exceeds the maximum length of {context.Bounds.MaxTopicLength}.", + form.Pointer("mqv:topic"), "mqv:topic")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + int qos = 0; + if (form.TryGetInt32("mqv:qos", out int parsedQos)) + { + if (parsedQos is < 0 or > 2) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidFieldValue, + "mqv:qos must be 0, 1 or 2.", form.Pointer("mqv:qos"), "mqv:qos")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + qos = parsedQos; + } + + bool retain = form.TryGetBoolean("mqv:retain", out bool retainValue) && retainValue; + + string? controlPacket = null; + if (form.TryGetString("mqv:controlPacket", out string packet)) + { + if (!s_controlPackets.Contains(packet)) + { + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.UnknownVocabularyTerm, + $"'{packet}' is not a recognized MQTT control packet.", + form.Pointer("mqv:controlPacket"), "mqv:controlPacket")); + } + controlPacket = packet; + } + + ResolveCodec(form, context, out WotPayloadDescriptor payload); + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor(topic, + ImmutableDictionary.Empty + .Add("qos", qos.ToString(System.Globalization.CultureInfo.InvariantCulture)) + .Add("retain", retain ? "true" : "false")); + ImmutableArray security = + ResolveSecurity(form, context, uri.GetLeftPart(UriPartial.Authority), diagnostics); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + string method = controlPacket ?? DefaultControlPacket(capability); + var operation = new WotOperationDescriptor(capability, op, method); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, security, Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private static string DefaultControlPacket(WoTBindingCapabilityEnum operation) + { + return operation switch + { + WoTBindingCapabilityEnum.WriteProperty => "publish", + WoTBindingCapabilityEnum.InvokeAction => "publish", + _ => "subscribe" + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/OpcUaBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/OpcUaBindingPlanner.cs new file mode 100644 index 0000000000..c1e4783331 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/OpcUaBindingPlanner.cs @@ -0,0 +1,233 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The OPC UA WoT Connectivity binding planner (OPC 10101). It validates the + /// portable uav:id / opc.tcp href and the uav:componentOf + /// containment reference, checks op compatibility, and compiles the + /// form into immutable endpoint and NodeId addressing metadata. It is + /// executable when the OPC UA executor is registered. The OPC 10101 §6.5.4 + /// target-mapping terms (uav:mapToNodeId / uav:mapToType / + /// uav:mapByFieldPath) are property-affordance-level and + /// protocol-neutral; they are validated centrally by + /// for every protocol, not parsed + /// here. + /// + public sealed class OpcUaBindingPlanner : WotProtocolBinderBase + { + /// + /// The OPC UA WoT binding vocabulary URI. + /// + public const string BindingUri = "http://opcfoundation.org/UA/WoT-Binding/"; + + private static readonly string[] s_schemes = ["opc.tcp", "opc.https", "opc.wss"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("opc.opcua", "10101", BindingUri, "OPC UA WoT Connectivity Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "OPC UA WoT Connectivity Binding (OPC 10101)", + WotBindingSources.OpcUa, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty, + WoTBindingCapabilityEnum.InvokeAction, + WoTBindingCapabilityEnum.SubscribeEvent, + WoTBindingCapabilityEnum.UnsubscribeEvent + ], + ["application/json", "application/opcua+json", "application/octet-stream"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "uav:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + + WotEndpointDescriptor endpoint; + string? authority; + if (!string.IsNullOrEmpty(form.Href) && TryParseUri(form.Href!, out Uri uri)) + { + if (!IsOpcScheme(uri.Scheme)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.UnsupportedScheme, + $"'{uri.Scheme}' is not an OPC UA transport scheme.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + endpoint = MakeEndpoint(uri); + authority = uri.GetLeftPart(UriPartial.Authority); + } + else if (!string.IsNullOrEmpty(context.BaseUri) && + TryParseUri(context.BaseUri!, out Uri baseUri) && + IsOpcScheme(baseUri.Scheme)) + { + endpoint = MakeEndpoint(baseUri); + authority = baseUri.GetLeftPart(UriPartial.Authority); + } + else + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "An OPC UA form requires an opc.tcp href or a Thing base opc.tcp endpoint.", + form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string? nodeId = ResolveNodeId(form); + if (string.IsNullOrEmpty(nodeId)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + "An OPC UA form requires uav:id or a NodeId in the href path.", + form.Pointer("uav:id"), "uav:id")); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + ImmutableDictionary metadata = ImmutableDictionary.Empty + .Add("nodeId", nodeId!); + metadata = AddIfPresent(form, "uav:componentOf", "componentOf", metadata); + if (form.Kind == WotAffordanceKind.Event && + form.TryGetStringArray("uav:eventFields", out ImmutableArray eventFields)) + { + // '|' joins the binding-authored select-clause browse paths; a + // browse name legally contains '/' (nested paths) but never '|'. + metadata = metadata.Add("eventFields", string.Join("|", eventFields)); + } + + ResolveCodec(form, context, out WotPayloadDescriptor payload); + var addressing = new WotAddressingDescriptor(nodeId!, metadata); + ImmutableArray security = ResolveSecurity(form, context, authority, diagnostics); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, OpcUaService(capability)); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, security, Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private static bool IsOpcScheme(string scheme) + { + foreach (string handled in s_schemes) + { + if (string.Equals(scheme, handled, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + return false; + } + + private static string? ResolveNodeId(WotAffordanceForm form) + { + if (form.TryGetString("uav:id", out string id) && !string.IsNullOrEmpty(id)) + { + return id; + } + if (!string.IsNullOrEmpty(form.Href) && TryParseUri(form.Href!, out Uri uri)) + { + string path = uri.AbsolutePath.Trim('/'); + if (LooksLikeNodeId(path)) + { + return Uri.UnescapeDataString(path); + } + string query = uri.Query.TrimStart('?'); + if (query.StartsWith("id=", StringComparison.OrdinalIgnoreCase)) + { + return Uri.UnescapeDataString(query[3..]); + } + } + return null; + } + + private static bool LooksLikeNodeId(string value) + { + if (string.IsNullOrEmpty(value)) + { + return false; + } + // A textual OPC UA NodeId always carries an identifier assignment + // (for example "i=", "s=", "g=", "b=" or a namespace "ns="). + foreach (char c in value) + { + if (c == '=') + { + return true; + } + } + return false; + } + + private static ImmutableDictionary AddIfPresent( + WotAffordanceForm form, string term, string key, ImmutableDictionary metadata) + { + return form.TryGetString(term, out string value) ? metadata.Add(key, value) : metadata; + } + + private static string OpcUaService(WoTBindingCapabilityEnum operation) + { + return operation switch + { + WoTBindingCapabilityEnum.WriteProperty => "Write", + WoTBindingCapabilityEnum.ObserveProperty => "Subscribe", + WoTBindingCapabilityEnum.InvokeAction => "Call", + WoTBindingCapabilityEnum.SubscribeEvent => "EventSubscribe", + WoTBindingCapabilityEnum.UnsubscribeEvent => "EventSubscribe", + _ => "Read" + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/ProfinetBindingPlanner.cs b/src/Opc.Ua.WotCon.Bindings/Planners/ProfinetBindingPlanner.cs new file mode 100644 index 0000000000..5e2f57a6fc --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/ProfinetBindingPlanner.cs @@ -0,0 +1,135 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The PROFINET binding planner (unofficial draft). It validates the + /// pnv: vocabulary (slot, subslot, index, optional + /// api) at the schema / document level and compiles immutable + /// slot / subslot / index addressing metadata. This build performs planning + /// only; the binding is reported as non-executable. + /// + public sealed class ProfinetBindingPlanner : WotProtocolBinderBase + { + /// + /// The PROFINET binding vocabulary URI. + /// + public const string BindingUri = "https://www.w3.org/2019/wot/profinet#"; + + private static readonly string[] s_schemes = ["profinet"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("w3c.profinet", "0.1-draft", BindingUri, "WoT PROFINET Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "WoT PROFINET Binding (unofficial draft)", + WotBindingSources.Profinet, + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty + ], + ["application/octet-stream"], + isExecutable: false); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "pnv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + bool ok = RequirePositive(form, "pnv:slot", diagnostics, out int slot); + ok &= RequirePositive(form, "pnv:subslot", diagnostics, out int subslot); + ok &= RequirePositive(form, "pnv:index", diagnostics, out int index); + if (!ok) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + ImmutableDictionary metadata = ImmutableDictionary.Empty + .Add("slot", slot.ToString(CultureInfo.InvariantCulture)) + .Add("subslot", subslot.ToString(CultureInfo.InvariantCulture)) + .Add("index", index.ToString(CultureInfo.InvariantCulture)); + if (form.TryGetInt32("pnv:api", out int api)) + { + metadata = metadata.Add("api", api.ToString(CultureInfo.InvariantCulture)); + } + + var addressing = new WotAddressingDescriptor( + $"slot:{slot.ToString(CultureInfo.InvariantCulture)}/subslot:" + + $"{subslot.ToString(CultureInfo.InvariantCulture)}/index:" + + index.ToString(CultureInfo.InvariantCulture), metadata); + WotEndpointDescriptor endpoint = MakeEndpointOrSynthetic(form.Href, "profinet"); + ResolveCodec(form, context, out WotPayloadDescriptor payload); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, capability.ToString()); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + if (entries.Count == 0) + { + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + return WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + + private bool RequirePositive( + WotAffordanceForm form, string term, List diagnostics, out int value) + { + if (!form.TryGetInt32(term, out value) || value < 0) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.MissingRequiredField, + $"A PROFINET form requires a non-negative {term}.", form.Pointer(term), term)); + return false; + } + return true; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/WotBindingSources.cs b/src/Opc.Ua.WotCon.Bindings/Planners/WotBindingSources.cs new file mode 100644 index 0000000000..86c9aac7ef --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/WotBindingSources.cs @@ -0,0 +1,143 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// The version-pinned specification sources every shipped planner is built + /// against. Each source captures the exact document URL, its version / date + /// and its standards maturity so operators can audit precisely which mapping + /// is enforced. The W3C Binding Templates registry is a pilot and is + /// intentionally never reported as Current; drafts expose their Editor's Draft + /// maturity and the OPC UA binding exposes its OPC specification maturity. + /// + public static class WotBindingSources + { + /// + /// The date this catalogue of sources was last pinned. + /// + public const string Retrieved = "2026-07-21"; + + /// + /// The W3C WoT Thing Description 1.1 Recommendation, which contains the + /// normative HTTP protocol binding (htv: terms and default methods). + /// + public static WotBindingSource Http { get; } = new WotBindingSource( + "https://www.w3.org/TR/wot-thing-description11/", + "1.1", + WotBindingMaturity.Recommendation, + commit: "REC-wot-thing-description11-20231205", + retrieved: Retrieved, + note: "Normative HTTP mapping in TD 1.1; htv: terms per http://www.w3.org/2011/http#. " + + "The standalone W3C WoT Binding Templates HTTP note is an Editor's Draft; the " + + "W3C Binding Registry is a pilot and currently empty."); + + /// + /// The W3C WoT Binding Templates CoAP Editor's Draft. + /// + public static WotBindingSource Coap { get; } = new WotBindingSource( + "https://w3c.github.io/wot-binding-templates/bindings/protocols/coap/", + "editors-draft", + WotBindingMaturity.EditorsDraft, + commit: "w3c/wot-binding-templates@main", + retrieved: Retrieved, + note: "cov: terms per the CoAP binding Editor's Draft. Planner-only in this build."); + + /// + /// The W3C WoT Binding Templates MQTT Editor's Draft. + /// + public static WotBindingSource Mqtt { get; } = new WotBindingSource( + "https://w3c.github.io/wot-binding-templates/bindings/protocols/mqtt/", + "editors-draft", + WotBindingMaturity.EditorsDraft, + commit: "w3c/wot-binding-templates@main", + retrieved: Retrieved, + note: "mqv: terms (controlPacket, topic, qos, retain) per the MQTT binding Editor's Draft."); + + /// + /// The W3C WoT Binding Templates Modbus Editor's Draft. + /// + public static WotBindingSource Modbus { get; } = new WotBindingSource( + "https://w3c.github.io/wot-binding-templates/bindings/protocols/modbus/", + "editors-draft", + WotBindingMaturity.EditorsDraft, + commit: "w3c/wot-binding-templates@main", + retrieved: Retrieved, + note: "modv: terms (function, entity, address, quantity, unitID, type, pollingTime) per " + + "https://www.w3.org/2019/wot/modbus# and the Modbus binding Editor's Draft."); + + /// + /// The W3C WoT Binding Templates BACnet Editor's Draft. + /// + public static WotBindingSource Bacnet { get; } = new WotBindingSource( + "https://w3c.github.io/wot-binding-templates/bindings/protocols/bacnet/", + "editors-draft", + WotBindingMaturity.EditorsDraft, + commit: "w3c/wot-binding-templates@main", + retrieved: Retrieved, + note: "bacv: terms per the BACnet binding Editor's Draft. Schema/document-level " + + "planning only; reported as non-executable."); + + /// + /// The W3C WoT Binding Templates PROFINET contribution (unofficial draft). + /// + public static WotBindingSource Profinet { get; } = new WotBindingSource( + "https://w3c.github.io/wot-binding-templates/bindings/protocols/", + "unofficial-draft", + WotBindingMaturity.UnofficialDraft, + commit: "w3c/wot-binding-templates@main", + retrieved: Retrieved, + note: "pnv: terms (slot, subslot, index, api) per the PROFINET contribution. Not yet a " + + "published W3C binding; schema/document-level planning only, reported as non-executable."); + + /// + /// The W3C WoT Binding Templates LoRaWAN contribution (unofficial draft). + /// + public static WotBindingSource LoRaWan { get; } = new WotBindingSource( + "https://w3c.github.io/wot-binding-templates/bindings/protocols/", + "unofficial-draft", + WotBindingMaturity.UnofficialDraft, + commit: "w3c/wot-binding-templates@main", + retrieved: Retrieved, + note: "lorawan: terms (DevEUI, fPort) per the LoRaWAN contribution. Not yet a published " + + "W3C binding; schema/document-level planning only, reported as non-executable."); + + /// + /// The OPC UA WoT Connectivity binding (OPC 10101). + /// + public static WotBindingSource OpcUa { get; } = new WotBindingSource( + "https://reference.opcfoundation.org/WoT/v100/docs/", + "OPC 10101 1.00", + WotBindingMaturity.OpcSpecification, + commit: "OPC-10101-1.00", + retrieved: Retrieved, + note: "uav: terms (id, componentOf, mapToNodeId, mapToType, mapByFieldPath, " + + "eventFields) per the official OPC UA WoT Connectivity binding (OPC 10101)."); + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Planners/WotBuiltInBinders.cs b/src/Opc.Ua.WotCon.Bindings/Planners/WotBuiltInBinders.cs new file mode 100644 index 0000000000..c08abcc1e9 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Planners/WotBuiltInBinders.cs @@ -0,0 +1,61 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; + +namespace Opc.Ua.WotCon.Bindings.Planners +{ + /// + /// A factory for the eight planner / validator binders shipped in this + /// dependency-light assembly (HTTP, CoAP, MQTT, Modbus TCP, BACnet, PROFINET, + /// LoRaWAN and OPC UA). Executable binders (HTTP, MQTT, Modbus, OPC UA) become + /// executable only when their optional executor is registered alongside them; + /// the remaining binders are always planner-only. + /// + public static class WotBuiltInBinders + { + /// + /// Creates the full set of shipped planner binders. + /// + public static IReadOnlyList CreateAll() + { + return + [ + new HttpBindingPlanner(), + new CoapBindingPlanner(), + new MqttBindingPlanner(), + new ModbusBindingPlanner(), + new BacnetBindingPlanner(), + new ProfinetBindingPlanner(), + new LoRaWanBindingPlanner(), + new OpcUaBindingPlanner() + ]; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/PollingWotSubscription.cs b/src/Opc.Ua.WotCon.Bindings/PollingWotSubscription.cs new file mode 100644 index 0000000000..370fa388f6 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/PollingWotSubscription.cs @@ -0,0 +1,202 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// A reusable observe / event subscription that periodically polls a source + /// on a bounded interval and stops cleanly when disposed. It is used by + /// executors whose transports have no native push channel (for example HTTP + /// polling or Modbus polling). + /// + /// A poll reports whether it was healthy. Consecutive unhealthy polls back the loop off + /// through an — the same policy abstraction the stack + /// already uses for channel reconnects — so an asset that has gone offline is not hammered + /// once per poll interval. The backoff never polls faster than the configured interval, and + /// the first healthy poll resets it. + /// + /// + public sealed class PollingWotSubscription : IWotSubscription + { + /// + /// Initializes and starts a new polling subscription. + /// + /// The compiled form being observed. + /// + /// The poll callback, invoked once per interval. It returns true when the poll was + /// healthy and false when the source reported a failure without throwing — a + /// protocol binding that maps a failure onto a bad rather than an + /// exception must return false so the retry policy engages. + /// + /// The bounded poll interval. + /// + /// An optional handler invoked when a single poll iteration faults with a + /// non-cancellation exception. A transient poll or callback fault is + /// reported here and the loop keeps polling; it never permanently faults + /// the subscription. A null handler silently continues. + /// + /// + /// The backoff applied after consecutive unhealthy polls. Defaults to + /// . A policy that reports "stop + /// retrying" (a negative delay) ends the poll loop. + /// + public PollingWotSubscription( + WotCompiledForm form, + Func> pollAsync, + TimeSpan interval, + Action? onError = null, + IChannelReconnectPolicy? retryPolicy = null) + { + Form = form ?? throw new ArgumentNullException(nameof(form)); + m_pollAsync = pollAsync ?? throw new ArgumentNullException(nameof(pollAsync)); + m_interval = interval <= TimeSpan.Zero ? TimeSpan.FromSeconds(1) : interval; + m_onError = onError; + m_retryPolicy = retryPolicy ?? new ExponentialBackoffChannelReconnectPolicy(); + m_loop = RunAsync(m_cts.Token); + } + + /// + public WotCompiledForm Form { get; } + + /// + /// Gets the number of consecutive unhealthy polls. Zero while the source is healthy. + /// + public int ConsecutiveFailures => Volatile.Read(ref m_consecutiveFailures); + + /// + public async ValueTask DisposeAsync() + { + // Dispose the cancellation source in a finally so a faulted loop can + // never leak it. The loop is designed not to fault (transient errors + // are handled per iteration), but awaiting it is still guarded so a + // residual exception is never rethrown from DisposeAsync. + try + { + m_cts.Cancel(); + try + { + await m_loop.ConfigureAwait(false); + } + catch (OperationCanceledException) + { + // Expected on cancellation. + } + } + finally + { + m_cts.Dispose(); + } + } + + private async Task RunAsync(CancellationToken cancellationToken) + { + while (!cancellationToken.IsCancellationRequested) + { + bool healthy; + try + { + healthy = await m_pollAsync(cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + // Cooperative cancellation is never swallowed as an error; + // stop the loop cleanly. + return; + } + catch (Exception ex) + { + // A transient poll or callback fault must not permanently + // fault the loop: report it and back off before the next + // attempt. This includes a spurious OperationCanceledException + // that is not our own cancellation (for example a transport + // timeout surfaced as a cancellation). + ReportError(ex); + healthy = false; + } + + TimeSpan delay; + if (healthy) + { + Volatile.Write(ref m_consecutiveFailures, 0); + delay = m_interval; + } + else + { + int attempt = Volatile.Read(ref m_consecutiveFailures); + delay = m_retryPolicy.GetDelay(attempt); + Volatile.Write(ref m_consecutiveFailures, attempt + 1); + if (delay < TimeSpan.Zero) + { + // The policy has given up. Stop polling rather than spin; + // the last reported bad status stays on the variable. + return; + } + if (delay < m_interval) + { + // Backing off must never poll faster than the configured interval. + delay = m_interval; + } + } + + try + { + await Task.Delay(delay, cancellationToken).ConfigureAwait(false); + } + catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) + { + return; + } + } + } + + private void ReportError(Exception ex) + { + try + { + m_onError?.Invoke(ex); + } + catch + { + // An error handler must never take down the poll loop. + } + } + + private readonly Func> m_pollAsync; + private readonly TimeSpan m_interval; + private readonly Action? m_onError; + private readonly IChannelReconnectPolicy m_retryPolicy; + private readonly CancellationTokenSource m_cts = new(); + private readonly Task m_loop; + private int m_consecutiveFailures; + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/Properties/AssemblyInfo.cs b/src/Opc.Ua.WotCon.Bindings/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..7798c9bd57 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/src/Opc.Ua.WotCon.Bindings/WotAffordanceForm.cs b/src/Opc.Ua.WotCon.Bindings/WotAffordanceForm.cs new file mode 100644 index 0000000000..7a5b3d2fb0 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotAffordanceForm.cs @@ -0,0 +1,343 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Globalization; +using System.Text; +using System.Text.Json; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The kind of interaction affordance a form belongs to. + /// + public enum WotAffordanceKind + { + /// + /// A property affordance. + /// + Property, + + /// + /// An action affordance. + /// + Action, + + /// + /// An event affordance. + /// + Event + } + + /// + /// An immutable description of a single WoT interaction-affordance form. It + /// carries the affordance metadata and a reflection-free snapshot of the form + /// and affordance JSON (cloned, so it is safe to retain on the immutable + /// registry snapshot) together with the RFC 6901 JSON Pointer that locates the + /// form in the originating document. Binders read protocol vocabulary terms + /// from ; the object performs no transport I/O. + /// + public sealed class WotAffordanceForm + { + /// + /// Initializes a new immutable affordance form. + /// + public WotAffordanceForm( + WotAffordanceKind kind, + string affordanceName, + ImmutableArray operations, + string? href, + string? contentType, + string? subprotocol, + ImmutableArray securitySchemes, + string jsonPointer, + JsonElement formElement, + JsonElement affordanceElement, + WotTargetMappingDescriptor? targetMapping = null) + { + Kind = kind; + AffordanceName = affordanceName ?? string.Empty; + Operations = operations.IsDefault ? [] : operations; + Href = href; + ContentType = contentType; + Subprotocol = subprotocol; + SecuritySchemes = securitySchemes.IsDefault ? [] : securitySchemes; + JsonPointer = jsonPointer ?? string.Empty; + FormElement = formElement; + AffordanceElement = affordanceElement; + TargetMapping = targetMapping ?? WotTargetMappingDescriptor.Parse(affordanceElement); + } + + /// + /// Gets the affordance kind (property / action / event). + /// + public WotAffordanceKind Kind { get; } + + /// + /// Gets the affordance (property / action / event) name. + /// + public string AffordanceName { get; } + + /// + /// Gets the resolved interaction operations (op) for the form. + /// Defaults per the WoT specification are applied when the form omits + /// op: read/write for properties, invoke for actions and + /// subscribe/unsubscribe for events. + /// + public ImmutableArray Operations { get; } + + /// + /// Gets the form target href, if any. + /// + public string? Href { get; } + + /// + /// Gets the form contentType, if any. + /// + public string? ContentType { get; } + + /// + /// Gets the form subprotocol, if any. + /// + public string? Subprotocol { get; } + + /// + /// Gets the security scheme names required by the form (no secrets). + /// + public ImmutableArray SecuritySchemes { get; } + + /// + /// Gets the RFC 6901 JSON Pointer that locates the form. + /// + public string JsonPointer { get; } + + /// + /// Gets the reflection-free JSON snapshot of the form object. + /// + public JsonElement FormElement { get; } + + /// + /// Gets the reflection-free JSON snapshot of the owning affordance object. + /// + public JsonElement AffordanceElement { get; } + + /// + /// Gets the protocol-neutral OPC 10101 §6.5.4 target-mapping descriptor + /// parsed from . It is empty unless the + /// owning property affordance authors uav:mapToNodeId, + /// uav:mapToType or uav:mapByFieldPath. + /// + public WotTargetMappingDescriptor TargetMapping { get; } + + /// + /// Gets whether the form declares the supplied case-insensitive op. + /// + public bool HasOperation(string op) + { + foreach (string value in Operations) + { + if (string.Equals(value, op, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + return false; + } + + /// + /// Builds a child JSON Pointer under the form (for example href). + /// + public string Pointer(string childToken) + { + if (string.IsNullOrEmpty(childToken)) + { + return JsonPointer; + } + return JsonPointer + "/" + EscapePointerToken(childToken); + } + + /// + /// Builds the RFC 6901 JSON Pointer to the owning affordance object (not + /// the form), for example /properties/temperature. Used to report + /// diagnostics for terms OPC 10101 §6.5.4 defines on the affordance, such + /// as the target-mapping terms. + /// + public string AffordancePointer() + { + string collection = Kind switch + { + WotAffordanceKind.Action => "actions", + WotAffordanceKind.Event => "events", + _ => "properties" + }; + return "/" + collection + "/" + EscapePointerToken(AffordanceName); + } + + /// + /// Builds a child JSON Pointer under the owning affordance object. + /// + public string AffordancePointer(string childToken) + { + if (string.IsNullOrEmpty(childToken)) + { + return AffordancePointer(); + } + return AffordancePointer() + "/" + EscapePointerToken(childToken); + } + + /// + /// Reads a string-valued term from the form object, honouring both the + /// plain and a colon-prefixed vocabulary form (for example href or + /// modv:function). + /// + public bool TryGetString(string term, out string value) + { + if (FormElement.ValueKind == JsonValueKind.Object && + FormElement.TryGetProperty(term, out JsonElement element) && + element.ValueKind == JsonValueKind.String) + { + value = element.GetString() ?? string.Empty; + return true; + } + value = string.Empty; + return false; + } + + /// + /// Reads a boolean-valued term from the form object. + /// + public bool TryGetBoolean(string term, out bool value) + { + if (FormElement.ValueKind == JsonValueKind.Object && + FormElement.TryGetProperty(term, out JsonElement element) && + (element.ValueKind == JsonValueKind.True || element.ValueKind == JsonValueKind.False)) + { + value = element.GetBoolean(); + return true; + } + value = false; + return false; + } + + /// + /// Reads an integer-valued term from the form object. + /// + public bool TryGetInt32(string term, out int value) + { + if (FormElement.ValueKind == JsonValueKind.Object && + FormElement.TryGetProperty(term, out JsonElement element)) + { + if (element.ValueKind == JsonValueKind.Number && element.TryGetInt32(out value)) + { + return true; + } + if (element.ValueKind == JsonValueKind.String && + int.TryParse(element.GetString(), NumberStyles.Integer, CultureInfo.InvariantCulture, out value)) + { + return true; + } + } + value = 0; + return false; + } + + /// + /// Reads a string-array-valued term from the form object (for example + /// uav:eventFields). Non-string / empty array entries are + /// skipped. + /// + public bool TryGetStringArray(string term, out ImmutableArray values) + { + if (FormElement.ValueKind == JsonValueKind.Object && + FormElement.TryGetProperty(term, out JsonElement element) && + element.ValueKind == JsonValueKind.Array) + { + ImmutableArray.Builder builder = + ImmutableArray.CreateBuilder(element.GetArrayLength()); + foreach (JsonElement item in element.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String) + { + string? value = item.GetString(); + if (!string.IsNullOrEmpty(value)) + { + builder.Add(value!); + } + } + } + values = builder.ToImmutable(); + return values.Length > 0; + } + values = []; + return false; + } + + /// + /// Escapes a single RFC 6901 JSON Pointer reference token. + /// + public static string EscapePointerToken(string token) + { + if (string.IsNullOrEmpty(token)) + { + return token; + } + bool needsEscape = false; + foreach (char c in token) + { + if (c is '~' or '/') + { + needsEscape = true; + break; + } + } + if (!needsEscape) + { + return token; + } + var builder = new StringBuilder(token.Length + 4); + foreach (char c in token) + { + switch (c) + { + case '~': + builder.Append("~0"); + break; + case '/': + builder.Append("~1"); + break; + default: + builder.Append(c); + break; + } + } + return builder.ToString(); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingBounds.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingBounds.cs new file mode 100644 index 0000000000..f28d4c8d58 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingBounds.cs @@ -0,0 +1,88 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Safety bounds applied while validating and executing binding forms. All + /// bounds are conservative defaults that planners and executors enforce to + /// avoid unbounded addressing, payloads or fan-out. + /// + public sealed class WotBindingBounds + { + /// + /// Gets the shared default bounds. + /// + public static WotBindingBounds Default { get; } = new WotBindingBounds(); + + /// + /// Gets or sets the maximum accepted href / URI length. + /// + public int MaxUriLength { get; set; } = 2048; + + /// + /// Gets or sets the maximum accepted MQTT topic length. + /// + public int MaxTopicLength { get; set; } = 65535; + + /// + /// Gets or sets the maximum accepted request / response payload size (bytes). + /// + public int MaxPayloadBytes { get; set; } = 1024 * 1024; + + /// + /// Gets or sets the maximum Modbus register quantity for a read. + /// + public int MaxRegisterQuantity { get; set; } = 125; + + /// + /// Gets or sets the maximum Modbus coil / discrete-input quantity for a read. + /// + public int MaxCoilQuantity { get; set; } = 2000; + + /// + /// Gets or sets the default operation timeout applied by executors. + /// + public TimeSpan DefaultTimeout { get; set; } = TimeSpan.FromSeconds(30); + + /// + /// Validates a numeric bound and throws when it is non-positive. + /// + /// + public static void EnsurePositive(int value, string name) + { + if (value <= 0) + { + throw new ArgumentOutOfRangeException(name, value, "The value must be positive."); + } + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingCapability.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingCapability.cs new file mode 100644 index 0000000000..d94e7fe39f --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingCapability.cs @@ -0,0 +1,135 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The immutable, browseable capability snapshot advertised by a protocol + /// binder. It captures the version-pinned document the binder implements, the + /// interaction operations it supports, the content types it can encode and + /// whether it is executable (a planner-only binder validates and compiles but + /// performs no transport I/O). The snapshot is projected onto the 1.1 registry + /// SupportedBindings nodes and into refresh results. + /// + public sealed class WotBindingCapability + { + /// + /// Initializes a new immutable capability snapshot. + /// + /// The protocol-binding vocabulary URI. + /// A human-readable binding title. + /// The version-pinned document the binder implements. + /// The interaction operations the binding supports. + /// The content types the binding produces / consumes. + /// Whether a runtime executor is available. + public WotBindingCapability( + string bindingUri, + string title, + WotBindingSource source, + IEnumerable operations, + IEnumerable contentTypes, + bool isExecutable) + { + BindingUri = bindingUri ?? throw new ArgumentNullException(nameof(bindingUri)); + Title = title ?? string.Empty; + Source = source ?? throw new ArgumentNullException(nameof(source)); + Operations = operations is null + ? [] + : [.. operations.Distinct()]; + ContentTypes = contentTypes is null + ? [] + : [.. contentTypes.Where(c => !string.IsNullOrEmpty(c)).Distinct(StringComparer.Ordinal)]; + IsExecutable = isExecutable; + } + + /// + /// Gets the protocol-binding vocabulary URI. + /// + public string BindingUri { get; } + + /// + /// Gets the human-readable binding title. + /// + public string Title { get; } + + /// + /// Gets the version-pinned document the binder implements. + /// + public WotBindingSource Source { get; } + + /// + /// Gets the interaction operations the binding supports. + /// + public ImmutableArray Operations { get; } + + /// + /// Gets the content types the binding produces / consumes. + /// + public ImmutableArray ContentTypes { get; } + + /// + /// Gets whether a runtime executor is available. A planner-only binder + /// (for example BACnet, PROFINET, LoRaWAN or CoAP in this build) validates + /// and compiles binding plans but reports false so the runtime + /// treats materialized affordances as non-executable. + /// + public bool IsExecutable { get; } + + /// + /// Gets whether the binding declares the supplied operation. + /// + public bool Supports(WoTBindingCapabilityEnum operation) + { + return Operations.Contains(operation); + } + + /// + /// Projects this snapshot onto the generated + /// for the registry nodes and + /// refresh results. No credentials or secrets are ever included. + /// + public WoTBindingCapabilityDataType ToDataType() + { + return new WoTBindingCapabilityDataType + { + BindingUri = BindingUri, + Title = Title, + ProfileVersion = Source.Version, + DraftMaturity = Source.MaturityText, + Capabilities = Operations.ToArray(), + ContentTypes = ContentTypes.ToArray() + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingDiagnostic.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingDiagnostic.cs new file mode 100644 index 0000000000..2a151122d0 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingDiagnostic.cs @@ -0,0 +1,263 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using Opc.Ua.Wot; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Stable diagnostic codes emitted while validating and compiling a WoT + /// interaction form into a binding plan. Codes are grouped by concern so + /// operators can filter without matching on message text. + /// + public enum WotBindingDiagnosticCode + { + /// + /// No specific code. + /// + None = 0, + + /// + /// The form has no href. + /// + MissingHref = 7000, + + /// + /// The href is not a valid URI for this binding. + /// + InvalidHref = 7001, + + /// + /// The href scheme is not handled by this binding. + /// + UnsupportedScheme = 7002, + + /// + /// The requested op is not compatible with the affordance kind. + /// + IncompatibleOperation = 7003, + + /// + /// The requested op is not supported by this binding. + /// + UnsupportedOperation = 7004, + + /// + /// The contentType is missing where the binding requires it. + /// + MissingContentType = 7005, + + /// + /// The contentType is not supported by this binding. + /// + UnsupportedContentType = 7006, + + /// + /// A required binding-specific field is missing. + /// + MissingRequiredField = 7007, + + /// + /// A binding-specific field has an invalid value. + /// + InvalidFieldValue = 7008, + + /// + /// A vocabulary term is not defined by the pinned document. + /// + UnknownVocabularyTerm = 7009, + + /// + /// Two fields conflict and cannot both be honoured. + /// + ConflictingFields = 7010, + + /// + /// A referenced security scheme is not declared by the document. + /// + UnknownSecurityScheme = 7011, + + /// + /// The binding validates and compiles but has no runtime executor, so the + /// affordance is materialized as non-executable. + /// + NonExecutableBinding = 7012, + + /// + /// A value exceeded a configured safety bound. + /// + BoundsExceeded = 7013, + + /// + /// An informational note about how the form was interpreted. + /// + Informational = 7014, + + /// + /// A target-mapping term (uav:mapToNodeId / uav:mapToType / + /// uav:mapByFieldPath, OPC 10101 §6.5.4) is authored on an action + /// or event affordance; the terms are defined on property affordances + /// only. + /// + TargetMappingNotOnProperty = 7015, + + /// + /// uav:mapByFieldPath (OPC 10101 §6.5.4) is authored without the + /// required uav:mapToType. + /// + TargetMappingFieldPathRequiresType = 7016, + + /// + /// A target-mapping term (OPC 10101 §6.5.4) is authored on a form + /// instead of the owning property affordance. + /// + TargetMappingAuthoredOnForm = 7017, + + /// + /// A target-mapping term (OPC 10101 §6.5.4) has an empty value. + /// + TargetMappingEmptyValue = 7018, + + /// + /// A target-mapping term (OPC 10101 §6.5.4) is not a string. + /// + TargetMappingInvalidValue = 7019 + } + + /// + /// A single structured diagnostic produced while validating or compiling a + /// binding form. Every diagnostic carries a severity, a stable code and an + /// RFC 6901 JSON Pointer into the originating Thing Description / Thing Model + /// so callers can locate the offending term precisely. + /// + public sealed class WotBindingDiagnostic + { + /// + /// Initializes a new immutable binding diagnostic. + /// + /// The severity of the diagnostic. + /// The stable diagnostic code. + /// A human-readable message. + /// The RFC 6901 JSON Pointer into the document. + /// The offending vocabulary term, if any. + public WotBindingDiagnostic( + WotDiagnosticSeverity severity, + WotBindingDiagnosticCode code, + string message, + string? jsonPointer = null, + string? term = null) + { + Severity = severity; + Code = code; + Message = message ?? throw new ArgumentNullException(nameof(message)); + JsonPointer = jsonPointer; + Term = term; + } + + /// + /// Gets the severity of the diagnostic. + /// + public WotDiagnosticSeverity Severity { get; } + + /// + /// Gets the stable diagnostic code. + /// + public WotBindingDiagnosticCode Code { get; } + + /// + /// Gets the human-readable message. + /// + public string Message { get; } + + /// + /// Gets the RFC 6901 JSON Pointer into the document, if any. + /// + public string? JsonPointer { get; } + + /// + /// Gets the offending vocabulary term, if any. + /// + public string? Term { get; } + + /// + /// Gets whether this diagnostic is an error. + /// + public bool IsError => Severity == WotDiagnosticSeverity.Error; + + /// + /// Creates an error diagnostic. + /// + public static WotBindingDiagnostic Error( + WotBindingDiagnosticCode code, string message, string? jsonPointer = null, string? term = null) + { + return new WotBindingDiagnostic(WotDiagnosticSeverity.Error, code, message, jsonPointer, term); + } + + /// + /// Creates a warning diagnostic. + /// + public static WotBindingDiagnostic Warning( + WotBindingDiagnosticCode code, string message, string? jsonPointer = null, string? term = null) + { + return new WotBindingDiagnostic(WotDiagnosticSeverity.Warning, code, message, jsonPointer, term); + } + + /// + /// Creates an informational diagnostic. + /// + public static WotBindingDiagnostic Info( + WotBindingDiagnosticCode code, string message, string? jsonPointer = null, string? term = null) + { + return new WotBindingDiagnostic(WotDiagnosticSeverity.Info, code, message, jsonPointer, term); + } + + /// + /// Projects this diagnostic onto the shared model. + /// + public WotDiagnostic ToWotDiagnostic() + { + WotLocation? location = JsonPointer is null ? null : WotLocation.FromPointer(JsonPointer); + return new WotDiagnostic(Severity, WotDiagnosticCode.ValidationError, Message, location); + } + + /// + public override string ToString() + { + return string.Format( + CultureInfo.InvariantCulture, + "{0} WOTB{1:D4}: {2}{3}", + Severity, + (int)Code, + Message, + JsonPointer is null ? string.Empty : " [" + JsonPointer + "]"); + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingIdentification.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingIdentification.cs new file mode 100644 index 0000000000..a86dc40f3c --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingIdentification.cs @@ -0,0 +1,234 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// How a binder matched an interaction form. + /// + public enum WotBindingMatchKind + { + /// + /// The binder does not handle the form. + /// + None = 0, + + /// + /// The form's href URI scheme is handled by the binder. + /// + Scheme = 1, + + /// + /// The form's subprotocol is handled by the binder. + /// + Subprotocol = 2, + + /// + /// A binding-specific vocabulary term identifies the binding. + /// + Vocabulary = 3, + + /// + /// A pinned identification rule (scheme + term + shape) matched. + /// + PinnedRule = 4, + + /// + /// The resource explicitly pinned this binder by id / version. + /// + ExplicitBindingId = 5 + } + + /// + /// The result of asking a binder whether it handles an interaction form. + /// Selection is deterministic: the registry chooses the highest + /// and breaks ties by ordinal binder id@version. + /// + public readonly struct WotBindingMatch : IEquatable + { + private WotBindingMatch(bool isMatch, WotBindingMatchKind kind, int priority) + { + IsMatch = isMatch; + Kind = kind; + Priority = priority; + } + + /// + /// A "does not handle" result. + /// + public static WotBindingMatch NoMatch { get; } = new WotBindingMatch(false, WotBindingMatchKind.None, 0); + + /// + /// Gets whether the binder handles the form. + /// + public bool IsMatch { get; } + + /// + /// Gets the kind of the match. + /// + public WotBindingMatchKind Kind { get; } + + /// + /// Gets the selection priority (higher wins). + /// + public int Priority { get; } + + /// + /// Creates a positive match with an explicit priority. + /// + public static WotBindingMatch Match(WotBindingMatchKind kind, int priority) + { + return new WotBindingMatch(true, kind, priority); + } + + /// + /// Creates a positive match whose priority defaults to the match kind, so + /// an explicit binding-id pin beats a pinned rule, which beats a + /// vocabulary match, which beats a subprotocol match, which beats a bare + /// scheme match. + /// + public static WotBindingMatch Match(WotBindingMatchKind kind) + { + return new WotBindingMatch(true, kind, (int)kind * 100); + } + + /// + public bool Equals(WotBindingMatch other) + { + return IsMatch == other.IsMatch && Kind == other.Kind && Priority == other.Priority; + } + + /// + public override bool Equals(object? obj) + { + return obj is WotBindingMatch other && Equals(other); + } + + /// + public override int GetHashCode() + { + return ((((IsMatch ? 1 : 0) * 31) + (int)Kind) * 31) + Priority; + } + + /// + /// Equality operator. + /// + public static bool operator ==(WotBindingMatch left, WotBindingMatch right) + { + return left.Equals(right); + } + + /// + /// Inequality operator. + /// + public static bool operator !=(WotBindingMatch left, WotBindingMatch right) + { + return !left.Equals(right); + } + } + + /// + /// Context supplied to a binder while it decides whether it handles a form: + /// the binding ids explicitly pinned on the resource / registry and the + /// document kind. Explicit pins let operators force a specific binder even + /// when several could match by scheme. + /// + public sealed class WotBindingSelectionContext + { + /// + /// An empty context (no explicit pins). + /// + public static WotBindingSelectionContext Empty { get; } = + new WotBindingSelectionContext([], []); + + /// + /// Initializes a new selection context. + /// + /// Explicit binder id / key pins on the resource. + /// Explicit binding vocabulary URI pins on the resource. + public WotBindingSelectionContext( + ImmutableArray selectedBindingIds, + ImmutableArray selectedBindingUris) + { + SelectedBindingIds = selectedBindingIds.IsDefault ? [] : selectedBindingIds; + SelectedBindingUris = selectedBindingUris.IsDefault ? [] : selectedBindingUris; + } + + /// + /// Gets the binder id / key pins explicitly selected on the resource. + /// + public ImmutableArray SelectedBindingIds { get; } + + /// + /// Gets the binding vocabulary URI pins explicitly selected on the resource. + /// + public ImmutableArray SelectedBindingUris { get; } + + /// + /// Gets whether the identity is explicitly pinned by id, key or URI. + /// + public bool IsPinned(WotBindingIdentity identity) + { + foreach (string pin in SelectedBindingIds) + { + if (string.Equals(pin, identity.Id, StringComparison.Ordinal) || + string.Equals(pin, identity.Key, StringComparison.Ordinal)) + { + return true; + } + } + foreach (string uri in SelectedBindingUris) + { + if (string.Equals(uri, identity.BindingUri, StringComparison.Ordinal)) + { + return true; + } + } + return false; + } + } + + /// + /// Identifies whether a binder handles a given interaction form. Implementations + /// pin exact rules (scheme, subprotocol, vocabulary term or explicit binding id) + /// so selection is deterministic and does not rely on the URI scheme alone. + /// + public interface IWotBindingIdentification + { + /// + /// Returns a match describing whether and how strongly this binder handles + /// the supplied form. Returns when the + /// binder does not handle the form. + /// + WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context); + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingIdentity.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingIdentity.cs new file mode 100644 index 0000000000..efdec88a16 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingIdentity.cs @@ -0,0 +1,113 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The stable identity of a protocol binder. A binder is uniquely identified + /// by its and , so multiple versions of + /// the same binding may be registered and coexist. Deterministic selection + /// uses the binding identity together with pinned identification rules rather + /// than the URI scheme alone. + /// + public sealed class WotBindingIdentity : IEquatable + { + /// + /// Initializes a new immutable binder identity. + /// + /// The stable, human-meaningful binder id (for example "opc.http"). + /// The binder version (for example "1.1.0"). + /// The protocol-binding vocabulary URI. + /// An optional human-readable display name. + public WotBindingIdentity(string id, string version, string bindingUri, string? displayName = null) + { + Id = id ?? throw new ArgumentNullException(nameof(id)); + Version = version ?? throw new ArgumentNullException(nameof(version)); + BindingUri = bindingUri ?? throw new ArgumentNullException(nameof(bindingUri)); + DisplayName = string.IsNullOrEmpty(displayName) ? id : displayName!; + } + + /// + /// Gets the stable, human-meaningful binder id. + /// + public string Id { get; } + + /// + /// Gets the binder version. + /// + public string Version { get; } + + /// + /// Gets the protocol-binding vocabulary URI. + /// + public string BindingUri { get; } + + /// + /// Gets the human-readable display name. + /// + public string DisplayName { get; } + + /// + /// Gets the composite selection key (id@version). + /// + public string Key => Id + "@" + Version; + + /// + public bool Equals(WotBindingIdentity? other) + { + return other is not null && + string.Equals(Id, other.Id, StringComparison.Ordinal) && + string.Equals(Version, other.Version, StringComparison.Ordinal); + } + + /// + public override bool Equals(object? obj) + { + return Equals(obj as WotBindingIdentity); + } + + /// + public override int GetHashCode() + { + unchecked + { + return (StringComparer.Ordinal.GetHashCode(Id) * 397) ^ + StringComparer.Ordinal.GetHashCode(Version); + } + } + + /// + public override string ToString() + { + return Key; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingMaturity.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingMaturity.cs new file mode 100644 index 0000000000..ecab331eda --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingMaturity.cs @@ -0,0 +1,184 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The standards maturity of the protocol-binding document a binder was + /// pinned against. A binder must advertise the maturity of the exact + /// document it implements so callers can distinguish a normative mapping + /// from an editor's draft. The W3C Binding Templates registry is a pilot and + /// is intentionally never reported as . + /// + public enum WotBindingMaturity + { + /// + /// The maturity is not known. + /// + Unknown = 0, + + /// + /// An unofficial draft (for example a GitHub working file). + /// + UnofficialDraft, + + /// + /// A W3C Editor's Draft. + /// + EditorsDraft, + + /// + /// A W3C First Public / Working Draft. + /// + WorkingDraft, + + /// + /// A W3C Candidate Recommendation. + /// + CandidateRecommendation, + + /// + /// A W3C Proposed Recommendation. + /// + ProposedRecommendation, + + /// + /// A W3C Recommendation (a normative, published standard). + /// + Recommendation, + + /// + /// A W3C Working Group Note. + /// + Note, + + /// + /// A published OPC Foundation specification (for example OPC 10101). + /// + OpcSpecification, + + /// + /// An entry that is Current in the W3C Binding Templates registry. This + /// value is reserved: the registry is a pilot and currently empty, so no + /// shipped binder claims it. + /// + RegistryCurrent + } + + /// + /// An immutable, version-pinned reference to the exact specification document + /// a protocol binder implements. Every planner pins its source so operators + /// can audit precisely which mapping is enforced. + /// + public sealed class WotBindingSource + { + /// + /// Initializes a new immutable binding source. + /// + /// The canonical document URL. + /// The pinned version, date or tag of the document. + /// The standards maturity of the document. + /// The pinned VCS commit or revision, if any. + /// The ISO-8601 date the document was pinned, if any. + /// An optional caveat (for example "registry pilot is empty"). + public WotBindingSource( + string specificationUri, + string version, + WotBindingMaturity maturity, + string? commit = null, + string? retrieved = null, + string? note = null) + { + SpecificationUri = specificationUri ?? throw new ArgumentNullException(nameof(specificationUri)); + Version = version ?? string.Empty; + Maturity = maturity; + Commit = commit; + Retrieved = retrieved; + Note = note; + } + + /// + /// Gets the canonical document URL that was pinned. + /// + public string SpecificationUri { get; } + + /// + /// Gets the pinned version, date or tag of the document. + /// + public string Version { get; } + + /// + /// Gets the standards maturity of the pinned document. + /// + public WotBindingMaturity Maturity { get; } + + /// + /// Gets the pinned VCS commit or revision, if any. + /// + public string? Commit { get; } + + /// + /// Gets the date the document was pinned, if any. + /// + public string? Retrieved { get; } + + /// + /// Gets an optional caveat about the source, if any. + /// + public string? Note { get; } + + /// + /// Gets the stable text token for reported in the + /// browseable DraftMaturity capability field. + /// + public string MaturityText => MaturityToText(Maturity); + + /// + /// Maps a to its stable text token. + /// + public static string MaturityToText(WotBindingMaturity maturity) + { + return maturity switch + { + WotBindingMaturity.UnofficialDraft => "UnofficialDraft", + WotBindingMaturity.EditorsDraft => "ED", + WotBindingMaturity.WorkingDraft => "WD", + WotBindingMaturity.CandidateRecommendation => "CR", + WotBindingMaturity.ProposedRecommendation => "PR", + WotBindingMaturity.Recommendation => "REC", + WotBindingMaturity.Note => "NOTE", + WotBindingMaturity.OpcSpecification => "OPC", + WotBindingMaturity.RegistryCurrent => "RegistryCurrent", + _ => "Unknown" + }; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingPlan.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingPlan.cs new file mode 100644 index 0000000000..abb3952e7c --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingPlan.cs @@ -0,0 +1,246 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Linq; +using System.Text.Json; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// A request to validate and compile a single resource's interaction forms + /// into a binding plan. The request is side-effect free and carries the + /// extracted forms, the secret-free security definitions, the base URI and the + /// explicit binder selection pinned on the resource. + /// + public sealed class WotBindingPlanRequest + { + /// + /// Initializes a new plan request. + /// + public WotBindingPlanRequest( + string resourceXid, + WoTDocumentKindEnum kind, + ImmutableArray forms, + ImmutableDictionary? securityDefinitions = null, + string? baseUri = null, + WotBindingSelectionContext? selection = null) + { + ResourceXid = resourceXid ?? string.Empty; + Kind = kind; + Forms = forms.IsDefault ? [] : forms; + SecurityDefinitions = securityDefinitions ?? []; + BaseUri = baseUri; + Selection = selection ?? WotBindingSelectionContext.Empty; + } + + /// + /// Gets the resource xid. + /// + public string ResourceXid { get; } + + /// + /// Gets the document kind. + /// + public WoTDocumentKindEnum Kind { get; } + + /// + /// Gets the affordance forms parsed from the document. + /// + public ImmutableArray Forms { get; } + + /// + /// Gets the secret-free security definitions declared by the document. + /// + public ImmutableDictionary SecurityDefinitions { get; } + + /// + /// Gets the Thing base URI used for relative href resolution, if any. + /// + public string? BaseUri { get; } + + /// + /// Gets the explicit binder selection pinned on the resource. + /// + public WotBindingSelectionContext Selection { get; } + + /// + /// Builds a plan context from this request. + /// + public WotBindingPlanContext CreateContext(IWotCodecRegistry codecs, WotBindingBounds bounds) + { + return new WotBindingPlanContext(SecurityDefinitions, codecs, Kind, BaseUri, bounds); + } + + /// + /// Builds a plan request from a WoT document: it extracts the forms, the + /// base URI and the secret-free security definitions. + /// + public static WotBindingPlanRequest FromDocument( + string resourceXid, + WoTDocumentKindEnum kind, + ReadOnlyMemory document, + int maxJsonDepth = 64, + WotBindingSelectionContext? selection = null) + { + ImmutableArray forms = WotFormExtractor.Extract(document, maxJsonDepth); + ImmutableDictionary definitions = + ReadSecurityDefinitions(document, maxJsonDepth); + string? baseUri = ReadBase(document, maxJsonDepth); + return new WotBindingPlanRequest(resourceXid, kind, forms, definitions, baseUri, selection); + } + + private static ImmutableDictionary ReadSecurityDefinitions( + ReadOnlyMemory document, int maxJsonDepth) + { + ImmutableDictionary.Builder builder = + ImmutableDictionary.CreateBuilder( + StringComparer.Ordinal); + try + { + var options = new JsonDocumentOptions { MaxDepth = maxJsonDepth <= 0 ? 64 : maxJsonDepth }; + using var json = JsonDocument.Parse(document, options); + if (json.RootElement.ValueKind == JsonValueKind.Object && + json.RootElement.TryGetProperty("securityDefinitions", out JsonElement definitions) && + definitions.ValueKind == JsonValueKind.Object) + { + foreach (JsonProperty definition in definitions.EnumerateObject()) + { + builder[definition.Name] = WotSecurityDefinition.Parse(definition.Name, definition.Value); + } + } + } + catch (JsonException) + { + } + return builder.ToImmutable(); + } + + private static string? ReadBase(ReadOnlyMemory document, int maxJsonDepth) + { + try + { + var options = new JsonDocumentOptions { MaxDepth = maxJsonDepth <= 0 ? 64 : maxJsonDepth }; + using var json = JsonDocument.Parse(document, options); + if (json.RootElement.ValueKind == JsonValueKind.Object && + json.RootElement.TryGetProperty("base", out JsonElement baseElement) && + baseElement.ValueKind == JsonValueKind.String) + { + return baseElement.GetString(); + } + } + catch (JsonException) + { + } + return null; + } + } + + /// + /// The immutable result of preparing bindings for one resource. It holds the + /// participating capability snapshots, the compiled (executable and + /// non-executable) forms, the forms no binder validated and the structured + /// diagnostics. A strict closure fails when is + /// false; otherwise unsupported forms materialize as degraded nodes. + /// + public sealed class WotBindingPlan + { + /// + /// Initializes a new immutable binding plan. + /// + public WotBindingPlan( + string resourceXid, + ImmutableArray capabilities, + ImmutableArray compiledForms, + ImmutableArray unsupportedForms, + ImmutableArray diagnostics) + { + ResourceXid = resourceXid ?? string.Empty; + Capabilities = capabilities.IsDefault + ? [] : capabilities; + CompiledForms = compiledForms.IsDefault + ? [] : compiledForms; + UnsupportedForms = unsupportedForms.IsDefault + ? [] : unsupportedForms; + Diagnostics = diagnostics.IsDefault + ? [] : diagnostics; + } + + /// + /// An empty plan (no forms, no capabilities). + /// + public static WotBindingPlan Empty { get; } = new WotBindingPlan( + string.Empty, + [], + [], + [], + []); + + /// + /// Gets the resource xid the plan was prepared for. + /// + public string ResourceXid { get; } + + /// + /// Gets the participating binding capability snapshots. + /// + public ImmutableArray Capabilities { get; } + + /// + /// Gets the compiled (executable and non-executable) forms. + /// + public ImmutableArray CompiledForms { get; } + + /// + /// Gets the forms no binder validated. + /// + public ImmutableArray UnsupportedForms { get; } + + /// + /// Gets the structured diagnostics produced during Prepare. + /// + public ImmutableArray Diagnostics { get; } + + /// + /// Gets whether every form was validated by a binder. + /// + public bool FullySupported => UnsupportedForms.IsEmpty; + + /// + /// Gets whether the plan compiled at least one executable form. + /// + public bool HasExecutableForms => CompiledForms.Any(f => f.IsExecutable); + + /// + /// Gets whether the plan compiled at least one non-executable form. + /// + public bool HasNonExecutableForms => CompiledForms.Any(f => !f.IsExecutable); + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotBindingPlanModel.cs b/src/Opc.Ua.WotCon.Bindings/WotBindingPlanModel.cs new file mode 100644 index 0000000000..0d34d93a44 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotBindingPlanModel.cs @@ -0,0 +1,339 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Text.Json; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Maps WoT op tokens to and from the generated + /// operations. + /// + public static class WotOperations + { + /// + /// Maps an op token to a capability operation. + /// + public static bool TryMap(string op, out WoTBindingCapabilityEnum operation) + { + switch (op) + { + case "readproperty": + operation = WoTBindingCapabilityEnum.ReadProperty; + return true; + case "writeproperty": + operation = WoTBindingCapabilityEnum.WriteProperty; + return true; + case "observeproperty": + operation = WoTBindingCapabilityEnum.ObserveProperty; + return true; + case "unobserveproperty": + operation = WoTBindingCapabilityEnum.ObserveProperty; + return true; + case "invokeaction": + operation = WoTBindingCapabilityEnum.InvokeAction; + return true; + case "subscribeevent": + operation = WoTBindingCapabilityEnum.SubscribeEvent; + return true; + case "unsubscribeevent": + operation = WoTBindingCapabilityEnum.UnsubscribeEvent; + return true; + default: + operation = default; + return false; + } + } + + /// + /// Gets whether the op token is compatible with the affordance kind. + /// + public static bool IsCompatible(WotAffordanceKind kind, string op) + { + switch (kind) + { + case WotAffordanceKind.Property: + return op is "readproperty" or "writeproperty" or "observeproperty" or "unobserveproperty"; + case WotAffordanceKind.Action: + return op is "invokeaction" or "queryaction" or "cancelaction"; + case WotAffordanceKind.Event: + return op is "subscribeevent" or "unsubscribeevent"; + default: + return false; + } + } + } + + /// + /// Immutable, transport-neutral endpoint metadata compiled from a form. The + /// well-known members expose the parsed endpoint; the + /// bag carries binding-specific additions. + /// + public sealed class WotEndpointDescriptor + { + /// + /// Initializes a new immutable endpoint descriptor. + /// + public WotEndpointDescriptor( + string scheme, + string? host, + int port, + string baseUri, + ImmutableDictionary? metadata = null) + { + Scheme = scheme ?? string.Empty; + Host = host; + Port = port; + BaseUri = baseUri ?? string.Empty; + Metadata = metadata ?? []; + } + + /// + /// Gets the endpoint URI scheme (for example http, mqtt). + /// + public string Scheme { get; } + + /// + /// Gets the endpoint host, if applicable. + /// + public string? Host { get; } + + /// + /// Gets the endpoint port, or -1 when not applicable. + /// + public int Port { get; } + + /// + /// Gets the canonical endpoint / base URI. + /// + public string BaseUri { get; } + + /// + /// Gets binding-specific endpoint metadata. + /// + public ImmutableDictionary Metadata { get; } + } + + /// + /// Immutable, transport-neutral addressing metadata compiled from a form. + /// + public sealed class WotAddressingDescriptor + { + /// + /// Initializes a new immutable addressing descriptor. + /// + public WotAddressingDescriptor(string target, ImmutableDictionary? metadata = null) + { + Target = target ?? string.Empty; + Metadata = metadata ?? []; + } + + /// + /// Gets the addressing target: an HTTP path/URL, an MQTT topic, a Modbus + /// register reference or an OPC UA NodeId, depending on the binding. + /// + public string Target { get; } + + /// + /// Gets binding-specific addressing metadata. + /// + public ImmutableDictionary Metadata { get; } + } + + /// + /// Immutable operation metadata compiled from a form. + /// + public sealed class WotOperationDescriptor + { + /// + /// Initializes a new immutable operation descriptor. + /// + public WotOperationDescriptor( + WoTBindingCapabilityEnum operation, + string opToken, + string method, + ImmutableDictionary? metadata = null, + TimeSpan? pollInterval = null) + { + Operation = operation; + OpToken = opToken ?? string.Empty; + Method = method ?? string.Empty; + Metadata = metadata ?? []; + PollInterval = pollInterval; + } + + /// + /// Gets the polling interval this affordance's form declares for a subscription, when the + /// protocol binding defines a standard term for it — Modbus does, through + /// modv:pollingTime. null means the form does not declare one and the + /// executor's configured default interval applies. + /// + public TimeSpan? PollInterval { get; } + + /// + /// Gets the resolved capability operation. + /// + public WoTBindingCapabilityEnum Operation { get; } + + /// + /// Gets the originating WoT op token. + /// + public string OpToken { get; } + + /// + /// Gets the concrete protocol method: an HTTP verb, a Modbus function + /// code mnemonic, an MQTT publish / subscribe verb or an OPC UA service. + /// + public string Method { get; } + + /// + /// Gets binding-specific operation metadata. + /// + public ImmutableDictionary Metadata { get; } + } + + /// + /// Immutable payload metadata compiled from a form. + /// + public sealed class WotPayloadDescriptor + { + /// + /// Initializes a new immutable payload descriptor. + /// + public WotPayloadDescriptor( + string contentType, + string codecId, + ImmutableDictionary? metadata = null) + { + ContentType = contentType ?? string.Empty; + CodecId = codecId ?? string.Empty; + Metadata = metadata ?? []; + } + + /// + /// Gets the resolved content type. + /// + public string ContentType { get; } + + /// + /// Gets the id of the selected payload codec. + /// + public string CodecId { get; } + + /// + /// Gets binding-specific payload metadata (for example numeric type / byte order). + /// + public ImmutableDictionary Metadata { get; } + } + + /// + /// An immutable, protocol-neutral description of the OPC 10101 §6.5.4 + /// uav:mapToNodeId / uav:mapToType / uav:mapByFieldPath + /// target-mapping terms authored on a property affordance. The terms let a + /// non-OPC-UA source (for example a Modbus register or an HTTP resource) be + /// projected onto a specific OPC UA target NodeId, or onto a field of a + /// structured target type, so the mapping itself carries no protocol-specific + /// addressing. Portable NodeIds are carried as strings; parsing/resolution is + /// left to the consumer. + /// + public sealed class WotTargetMappingDescriptor + { + /// + /// Initializes a new immutable target-mapping descriptor. + /// + /// The portable target NodeId (uav:mapToNodeId), if any. + /// The portable target type NodeId (uav:mapToType), if any. + /// The target field path (uav:mapByFieldPath), if any. + public WotTargetMappingDescriptor( + string? targetNodeId = null, string? targetTypeNodeId = null, string? fieldPath = null) + { + TargetNodeId = targetNodeId; + TargetTypeNodeId = targetTypeNodeId; + FieldPath = fieldPath; + } + + /// + /// An empty descriptor (no target-mapping terms authored). + /// + public static WotTargetMappingDescriptor Empty { get; } = new WotTargetMappingDescriptor(); + + /// + /// Gets the portable target NodeId (uav:mapToNodeId), if authored. + /// + public string? TargetNodeId { get; } + + /// + /// Gets the portable target type NodeId (uav:mapToType), if authored. + /// + public string? TargetTypeNodeId { get; } + + /// + /// Gets the field path into the target type (uav:mapByFieldPath), if + /// authored. Only meaningful together with . + /// + public string? FieldPath { get; } + + /// + /// Gets whether no target-mapping term was authored. + /// + public bool IsEmpty => TargetNodeId is null && TargetTypeNodeId is null && FieldPath is null; + + /// + /// Parses the uav:mapToNodeId / uav:mapToType / + /// uav:mapByFieldPath terms from a property-affordance JSON + /// element (OPC 10101 §6.5.4 defines them on the affordance, not on a + /// form). A present-but-empty string is preserved as an empty string so + /// validation can distinguish "absent" from "authored empty". + /// + public static WotTargetMappingDescriptor Parse(JsonElement affordanceElement) + { + string? targetNodeId = ReadString(affordanceElement, "uav:mapToNodeId"); + string? targetTypeNodeId = ReadString(affordanceElement, "uav:mapToType"); + string? fieldPath = ReadString(affordanceElement, "uav:mapByFieldPath"); + if (targetNodeId is null && targetTypeNodeId is null && fieldPath is null) + { + return Empty; + } + return new WotTargetMappingDescriptor(targetNodeId, targetTypeNodeId, fieldPath); + } + + private static string? ReadString(JsonElement element, string term) + { + if (element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(term, out JsonElement value) && + value.ValueKind == JsonValueKind.String) + { + return value.GetString() ?? string.Empty; + } + return null; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotFormExtractor.cs b/src/Opc.Ua.WotCon.Bindings/WotFormExtractor.cs new file mode 100644 index 0000000000..2697941b1c --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotFormExtractor.cs @@ -0,0 +1,264 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Text.Json; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// Extracts the interaction-affordance forms (property / action / event) from + /// a WoT Thing Description or Thing Model so binders can classify and compile + /// them. Extraction is read-only, reflection-free and never performs transport + /// I/O. Default op values are resolved per the WoT specification when a + /// form omits them, and per-form security requirements fall back to the + /// Thing-level default. + /// + public static class WotFormExtractor + { + /// + /// Extracts the affordance forms from a WoT document. + /// + public static ImmutableArray Extract( + ReadOnlyMemory document, int maxJsonDepth = 64) + { + ImmutableArray.Builder forms = ImmutableArray.CreateBuilder(); + try + { + var options = new JsonDocumentOptions { MaxDepth = maxJsonDepth <= 0 ? 64 : maxJsonDepth }; + using var json = JsonDocument.Parse(document, options); + JsonElement root = json.RootElement; + if (root.ValueKind != JsonValueKind.Object) + { + return forms.ToImmutable(); + } + + ImmutableArray thingSecurity = ReadSecurity(root); + Collect(root, "properties", WotAffordanceKind.Property, thingSecurity, forms); + Collect(root, "actions", WotAffordanceKind.Action, thingSecurity, forms); + Collect(root, "events", WotAffordanceKind.Event, thingSecurity, forms); + } + catch (JsonException) + { + // Malformed documents are handled upstream by the converter; the + // binder layer simply produces no forms. + } + return forms.ToImmutable(); + } + + private static void Collect( + JsonElement root, + string collection, + WotAffordanceKind kind, + ImmutableArray thingSecurity, + ImmutableArray.Builder forms) + { + if (!root.TryGetProperty(collection, out JsonElement affordances) || + affordances.ValueKind != JsonValueKind.Object) + { + return; + } + + foreach (JsonProperty affordance in affordances.EnumerateObject()) + { + if (affordance.Value.ValueKind != JsonValueKind.Object) + { + continue; + } + JsonElement affordanceElement = affordance.Value.Clone(); + string affordanceName = affordance.Name; + string affordancePointer = "/" + + collection + + "/" + + WotAffordanceForm.EscapePointerToken(affordanceName); + + if (!affordanceElement.TryGetProperty("forms", out JsonElement formsElement) || + formsElement.ValueKind != JsonValueKind.Array) + { + // An affordance without forms still requires a binder; emit a + // formless descriptor so a strict closure treats it as + // unsupported. + forms.Add(new WotAffordanceForm( + kind, affordanceName, DefaultOperations(kind, affordanceElement), + null, null, null, thingSecurity, affordancePointer + "/forms", + default, affordanceElement)); + continue; + } + + int index = 0; + foreach (JsonElement form in formsElement.EnumerateArray()) + { + string formPointer = affordancePointer + + "/forms/" + + index.ToString(System.Globalization.CultureInfo.InvariantCulture); + index++; + if (form.ValueKind != JsonValueKind.Object) + { + continue; + } + JsonElement formElement = form.Clone(); + ImmutableArray ops = ReadOperations(formElement, kind, affordanceElement); + ImmutableArray security = ReadSecurity(formElement); + if (security.IsEmpty) + { + security = thingSecurity; + } + forms.Add(new WotAffordanceForm( + kind, + affordanceName, + ops, + GetString(formElement, "href"), + GetString(formElement, "contentType"), + GetString(formElement, "subprotocol"), + security, + formPointer, + formElement, + affordanceElement)); + } + } + } + + private static ImmutableArray ReadOperations( + JsonElement form, WotAffordanceKind kind, JsonElement affordance) + { + if (form.TryGetProperty("op", out JsonElement op)) + { + if (op.ValueKind == JsonValueKind.String) + { + string? single = op.GetString(); + return string.IsNullOrEmpty(single) + ? DefaultOperations(kind, affordance) + : [single!]; + } + if (op.ValueKind == JsonValueKind.Array) + { + ImmutableArray.Builder builder = ImmutableArray.CreateBuilder(); + foreach (JsonElement item in op.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String) + { + string? value = item.GetString(); + if (!string.IsNullOrEmpty(value)) + { + builder.Add(value!); + } + } + } + return builder.Count == 0 ? DefaultOperations(kind, affordance) : builder.ToImmutable(); + } + } + return DefaultOperations(kind, affordance); + } + + private static ImmutableArray DefaultOperations( + WotAffordanceKind kind, JsonElement affordance) + { + switch (kind) + { + case WotAffordanceKind.Action: + return ["invokeaction"]; + case WotAffordanceKind.Event: + return ["subscribeevent", "unsubscribeevent"]; + default: + bool readOnly = GetBool(affordance, "readOnly"); + bool writeOnly = GetBool(affordance, "writeOnly"); + bool observable = GetBool(affordance, "observable"); + ImmutableArray.Builder builder = ImmutableArray.CreateBuilder(); + if (!writeOnly) + { + builder.Add("readproperty"); + } + if (!readOnly) + { + builder.Add("writeproperty"); + } + if (observable) + { + builder.Add("observeproperty"); + builder.Add("unobserveproperty"); + } + if (builder.Count == 0) + { + builder.Add("readproperty"); + } + return builder.ToImmutable(); + } + } + + private static ImmutableArray ReadSecurity(JsonElement element) + { + if (element.ValueKind != JsonValueKind.Object || + !element.TryGetProperty("security", out JsonElement security)) + { + return []; + } + if (security.ValueKind == JsonValueKind.String) + { + string? single = security.GetString(); + return string.IsNullOrEmpty(single) + ? [] + : [single!]; + } + if (security.ValueKind == JsonValueKind.Array) + { + ImmutableArray.Builder builder = ImmutableArray.CreateBuilder(); + foreach (JsonElement item in security.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String) + { + string? value = item.GetString(); + if (!string.IsNullOrEmpty(value)) + { + builder.Add(value!); + } + } + } + return builder.ToImmutable(); + } + return []; + } + + private static string? GetString(JsonElement element, string property) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(property, out JsonElement value) && + value.ValueKind == JsonValueKind.String + ? value.GetString() + : null; + } + + private static bool GetBool(JsonElement element, string property) + { + return element.ValueKind == JsonValueKind.Object && + element.TryGetProperty(property, out JsonElement value) && + value.ValueKind == JsonValueKind.True; + } + } +} diff --git a/src/Opc.Ua.WotCon.Bindings/WotProtocolBinderRegistry.cs b/src/Opc.Ua.WotCon.Bindings/WotProtocolBinderRegistry.cs new file mode 100644 index 0000000000..7437d1df86 --- /dev/null +++ b/src/Opc.Ua.WotCon.Bindings/WotProtocolBinderRegistry.cs @@ -0,0 +1,448 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings +{ + /// + /// The concrete binder registry. It aggregates independently injected protocol + /// binders (planner + identification) and optional executors, performs + /// deterministic selection using pinned identification rules (not the URI + /// scheme alone), compiles forms into immutable plans, and drives the + /// Prepare / Activate / Deactivate lifecycle. Multiple versions of a binding + /// can coexist; the executor for a binder is matched by id so a protocol can be + /// validated without an executor and executed once one is registered. + /// + public sealed class WotProtocolBinderRegistry : IWotBinderRegistry, IWotBindingChannelFactory + { + /// + /// Initializes a new binder registry. + /// + /// The protocol binders (planner + identification). + /// The optional runtime executors. + /// The credential provider used at activation time. + /// The codec registry used to select payload codecs. + /// The safety bounds enforced during planning. + public WotProtocolBinderRegistry( + IEnumerable binders, + IEnumerable? executors = null, + IWotCredentialProvider? credentials = null, + IWotCodecRegistry? codecs = null, + WotBindingBounds? bounds = null) + { + if (binders is null) + { + throw new ArgumentNullException(nameof(binders)); + } + m_credentials = credentials ?? NullWotCredentialProvider.Instance; + m_codecs = codecs ?? WotPayloadCodecRegistry.Default; + m_bounds = bounds ?? WotBindingBounds.Default; + + var seenBinderKeys = new HashSet(StringComparer.Ordinal); + foreach (IWotProtocolBinder binder in binders) + { + if (binder is null) + { + continue; + } + // Multiple versions coexist; the same id@version is deduplicated. + if (seenBinderKeys.Add(binder.Identity.Key)) + { + m_binders[binder.Identity.Key] = binder; + m_ordered.Add(binder); + } + } + // Deterministic evaluation order: ordinal by id@version. + m_ordered.Sort(static (a, b) => + string.CompareOrdinal(a.Identity.Key, b.Identity.Key)); + + if (executors is not null) + { + foreach (IWotBindingExecutor executor in executors) + { + if (executor is null) + { + continue; + } + m_executorsByKey[executor.Identity.Key] = executor; + // Last executor for an id wins as the id-level default. + m_executorsById[executor.Identity.Id] = executor; + } + } + + ImmutableArray.Builder capabilities = + ImmutableArray.CreateBuilder(m_ordered.Count); + foreach (IWotProtocolBinder binder in m_ordered) + { + capabilities.Add(binder.Capability.ToDataType()); + } + Capabilities = capabilities.ToImmutable(); + } + + /// + public IReadOnlyList Capabilities { get; } + + /// + /// Gets the registered binders in deterministic evaluation order. + /// + public IReadOnlyList Binders => m_ordered; + + /// + public WotBindingPlan Prepare(WotBindingPlanRequest request) + { + if (request is null) + { + throw new ArgumentNullException(nameof(request)); + } + if (request.Forms.IsEmpty) + { + return WotBindingPlan.Empty; + } + + WotBindingPlanContext context = request.CreateContext(m_codecs, m_bounds); + ImmutableArray.Builder compiled = ImmutableArray.CreateBuilder(); + ImmutableArray.Builder unsupported = ImmutableArray.CreateBuilder(); + ImmutableArray.Builder diagnostics = + ImmutableArray.CreateBuilder(); + var participating = new Dictionary(StringComparer.Ordinal); + + foreach (WotAffordanceForm form in request.Forms) + { + var mappingDiagnostics = new List(); + bool mappingValid = ValidateTargetMapping(form, mappingDiagnostics); + diagnostics.AddRange(mappingDiagnostics); + if (!mappingValid) + { + unsupported.Add(form); + continue; + } + + IWotProtocolBinder? binder = Select(form, request.Selection); + if (binder is null) + { + unsupported.Add(form); + diagnostics.Add(WotBindingDiagnostic.Warning( + WotBindingDiagnosticCode.UnsupportedScheme, + $"No binder handles the '{form.AffordanceName}' form.", + form.Pointer("href"))); + continue; + } + + WotBindingCompilation compilation = binder.Planner.Compile(form, context); + diagnostics.AddRange(compilation.Diagnostics); + if (!compilation.IsSupported || compilation.HasErrors || compilation.Entries.IsEmpty) + { + unsupported.Add(form); + continue; + } + + participating[binder.Identity.Key] = binder.Capability.ToDataType(); + bool executorPresent = HasExecutor(binder.Identity); + foreach (WotCompiledForm entry in compilation.Entries) + { + bool effective = entry.IsExecutable && executorPresent; + WotCompiledForm mapped = entry + .WithTargetMapping(form.TargetMapping) + .WithExecutable(effective); + compiled.Add(mapped); + if (!effective) + { + diagnostics.Add(WotBindingDiagnostic.Info( + WotBindingDiagnosticCode.NonExecutableBinding, + $"The binding '{binder.Identity.Id}' validated the '{form.AffordanceName}' " + + "form but no runtime executor is available; it is materialized as non-executable.", + entry.JsonPointer)); + } + } + } + + return new WotBindingPlan( + request.ResourceXid, + [.. participating.Values], + compiled.ToImmutable(), + unsupported.ToImmutable(), + diagnostics.ToImmutable()); + } + + /// + public ValueTask ActivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + if (plan is null) + { + throw new ArgumentNullException(nameof(plan)); + } + lock (m_activeLock) + { + m_activeResources.Add(plan.ResourceXid); + } + return default; + } + + /// + public ValueTask DeactivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + if (plan is null) + { + throw new ArgumentNullException(nameof(plan)); + } + lock (m_activeLock) + { + m_activeResources.Remove(plan.ResourceXid); + } + return default; + } + + /// + /// Gets whether a resource's plan is currently activated. + /// + public bool IsActive(string resourceXid) + { + lock (m_activeLock) + { + return m_activeResources.Contains(resourceXid); + } + } + + /// + /// Attempts to resolve the executor registered for a binder identity. + /// + /// + public bool TryGetExecutor(WotBindingIdentity identity, out IWotBindingExecutor executor) + { + if (identity is null) + { + throw new ArgumentNullException(nameof(identity)); + } + if (m_executorsByKey.TryGetValue(identity.Key, out IWotBindingExecutor? exact) && exact is not null) + { + executor = exact; + return true; + } + if (m_executorsById.TryGetValue(identity.Id, out IWotBindingExecutor? byId) && byId is not null) + { + executor = byId; + return true; + } + executor = null!; + return false; + } + + /// + /// Opens a live channel for an executable compiled form using the + /// registry's credential provider, codecs and bounds. Used by the runtime + /// value adapter and by end-to-end tests. + /// + /// + public ValueTask OpenChannelAsync( + WotCompiledForm form, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + if (!TryGetExecutor(form.Binding, out IWotBindingExecutor executor)) + { + throw new InvalidOperationException( + $"No executor is registered for binding '{form.Binding.Key}'."); + } + var context = new WotExecutorContext(m_credentials, m_codecs, m_bounds); + return executor.ActivateAsync(form, context, cancellationToken); + } + + private IWotProtocolBinder? Select(WotAffordanceForm form, WotBindingSelectionContext selection) + { + IWotProtocolBinder? best = null; + WotBindingMatch bestMatch = WotBindingMatch.NoMatch; + foreach (IWotProtocolBinder binder in m_ordered) + { + WotBindingMatch match = binder.Identification.Match(form, selection); + if (!match.IsMatch) + { + continue; + } + // Higher priority wins; ties are broken by ordinal id@version, which + // is guaranteed because m_ordered is sorted and evaluated in order. + if (best is null || match.Priority > bestMatch.Priority) + { + best = binder; + bestMatch = match; + } + } + return best; + } + + private bool HasExecutor(WotBindingIdentity identity) + { + return m_executorsByKey.ContainsKey(identity.Key) || m_executorsById.ContainsKey(identity.Id); + } + + /// + /// Validates the OPC 10101 §6.5.4 target-mapping terms for a form. The + /// terms are protocol-neutral (they may target an OPC UA NodeId from a + /// non-OPC-UA source such as Modbus or HTTP) and are defined on the + /// owning property affordance, never on a form. Returns false and + /// adds error diagnostics when the form violates the specification. + /// + private static bool ValidateTargetMapping(WotAffordanceForm form, List diagnostics) + { + bool isValid = true; + foreach (string term in s_targetMappingTerms) + { + if (HasProperty(form.FormElement, term)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.TargetMappingAuthoredOnForm, + $"'{term}' is defined by OPC 10101 §6.5.4 on the property affordance, not on a form.", + form.Pointer(term), term)); + isValid = false; + } + } + + WotTargetMappingDescriptor mapping = form.TargetMapping; + if (!HasAnyTargetMappingProperty(form.AffordanceElement)) + { + return isValid; + } + + if (form.Kind != WotAffordanceKind.Property) + { + string kindName = form.Kind == WotAffordanceKind.Action ? "action" : "event"; + foreach (string term in s_targetMappingTerms) + { + if (HasProperty(form.AffordanceElement, term)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.TargetMappingNotOnProperty, + $"OPC 10101 §6.5.4 defines '{term}' on property affordances only; " + + $"'{form.AffordanceName}' is a {kindName} affordance.", + form.AffordancePointer(term), + term)); + } + } + return false; + } + + isValid &= ValidateStringTerm( + form.AffordanceElement, "uav:mapToNodeId", form, diagnostics); + isValid &= ValidateStringTerm( + form.AffordanceElement, "uav:mapToType", form, diagnostics); + isValid &= ValidateStringTerm( + form.AffordanceElement, "uav:mapByFieldPath", form, diagnostics); + + if (!string.IsNullOrWhiteSpace(mapping.FieldPath) && + string.IsNullOrWhiteSpace(mapping.TargetTypeNodeId)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.TargetMappingFieldPathRequiresType, + "'uav:mapByFieldPath' is only valid together with 'uav:mapToType' (OPC 10101 §6.5.4).", + form.AffordancePointer("uav:mapByFieldPath"), "uav:mapByFieldPath")); + isValid = false; + } + + return isValid; + } + + private static bool HasAnyTargetMappingProperty(JsonElement element) + { + foreach (string term in s_targetMappingTerms) + { + if (HasProperty(element, term)) + { + return true; + } + } + return false; + } + + private static bool HasProperty(JsonElement element, string term) + { + return element.ValueKind == JsonValueKind.Object && element.TryGetProperty(term, out _); + } + + private static bool ValidateStringTerm( + JsonElement element, + string term, + WotAffordanceForm form, + List diagnostics) + { + if (element.ValueKind != JsonValueKind.Object || + !element.TryGetProperty(term, out JsonElement value)) + { + return true; + } + if (value.ValueKind != JsonValueKind.String) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.TargetMappingInvalidValue, + $"'{term}' must be a string (OPC 10101 §6.5.4).", + form.AffordancePointer(term), + term)); + return false; + } + if (string.IsNullOrWhiteSpace(value.GetString())) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.TargetMappingEmptyValue, + $"'{term}' must not be empty (OPC 10101 §6.5.4).", + form.AffordancePointer(term), term)); + return false; + } + return true; + } + + private static readonly string[] s_targetMappingTerms = + [ + "uav:mapToNodeId", "uav:mapToType", "uav:mapByFieldPath" + ]; + + private readonly IWotCredentialProvider m_credentials; + private readonly IWotCodecRegistry m_codecs; + private readonly WotBindingBounds m_bounds; + + private readonly Dictionary m_binders = + new(StringComparer.Ordinal); + + private readonly List m_ordered = []; + + private readonly Dictionary m_executorsByKey = + new(StringComparer.Ordinal); + + private readonly Dictionary m_executorsById = + new(StringComparer.Ordinal); + + private readonly Lock m_activeLock = new(); + private readonly HashSet m_activeResources = new(StringComparer.Ordinal); + } +} diff --git a/src/Opc.Ua.WotCon.Client/Hosting/OpcUaWotConClientBuilderExtensions.cs b/src/Opc.Ua.WotCon.Client/Hosting/OpcUaWotConClientBuilderExtensions.cs index 90b37be844..919a3b644b 100644 --- a/src/Opc.Ua.WotCon.Client/Hosting/OpcUaWotConClientBuilderExtensions.cs +++ b/src/Opc.Ua.WotCon.Client/Hosting/OpcUaWotConClientBuilderExtensions.cs @@ -63,6 +63,13 @@ public static class OpcUaWotConClientBuilderExtensions /// public const string DefaultConfigurationSection = "OpcUa:WotCon:Client"; + /// + /// Default section name used by the + /// + /// overload. + /// + public const string DefaultRegistryConfigurationSection = "OpcUa:WotCon:RegistryClient"; + /// /// Registers WoT Connectivity client services and a lazy /// factory delegate that resolves a @@ -174,6 +181,118 @@ private static void RegisterCoreServices(IServiceCollection services) services.AddOpcUa(); } + /// + /// Registers WoT Connectivity 1.1 registry client services and a + /// lazy factory delegate that resolves a + /// rooted at the connected + /// server's WoTRegistry entry point. + /// + /// The OPC UA builder. + /// Optional callback used to populate + /// . + /// The same instance for + /// fluent chaining. + /// + /// is null. + public static IOpcUaBuilder AddWotRegistryClient( + this IOpcUaBuilder builder, + Action? configure = null) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (configure is null) + { + builder.Services.AddOptions(); + } + else + { + builder.Services.AddOptions().Configure(configure); + } + + RegisterRegistryCoreServices(builder.Services); + + return builder; + } + + /// + /// Registers WoT Connectivity 1.1 registry client services with + /// options bound from the supplied + /// section + /// (OpcUa:WotCon:RegistryClient). + /// + /// + /// AOT-safe: bound by the .NET 8+ configuration binding source + /// generator (EnableConfigurationBindingGenerator). + /// + /// The OPC UA builder. + /// Configuration root containing + /// the OpcUa:WotCon:RegistryClient section. + /// + /// or is null. + public static IOpcUaBuilder AddWotRegistryClient( + this IOpcUaBuilder builder, + IConfiguration configuration) + { + if (configuration is null) + { + throw new ArgumentNullException(nameof(configuration)); + } + return builder.AddWotRegistryClient( + configuration.GetSection(DefaultRegistryConfigurationSection)); + } + + /// + /// Registers WoT Connectivity 1.1 registry client services with + /// options bound from the supplied . + /// + /// + /// AOT-safe: bound by the .NET 8+ configuration binding source + /// generator (EnableConfigurationBindingGenerator). + /// + /// The OPC UA builder. + /// Configuration section to bind. + /// + /// or is null. + public static IOpcUaBuilder AddWotRegistryClient( + this IOpcUaBuilder builder, + IConfigurationSection section) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (section is null) + { + throw new ArgumentNullException(nameof(section)); + } + builder.Services.AddOptions().Bind(section); + RegisterRegistryCoreServices(builder.Services); + + return builder; + } + + private static void RegisterRegistryCoreServices(IServiceCollection services) + { + services.TryAddSingleton( + sp => new ServiceProviderTelemetryContext(sp)); + + services.TryAddSingleton>>(sp => + { + ITelemetryContext telemetry = sp.GetRequiredService(); + return async (session, ct) => await WotRegistryClient + .ForServerAsync(session, telemetry, ct) + .ConfigureAwait(false); + }); + + services.TryAddSingleton(); + services.TryAddSingleton>>( + sp => sp.GetRequiredService().ConnectAsync); + + services.AddOpcUa(); + } + /// /// Registers WoT Connectivity client services on an existing OPC UA client builder. /// @@ -233,6 +352,68 @@ public static IOpcUaClientBuilder AddWotConClient( return builder; } + /// + /// Registers WoT Connectivity 1.1 registry client services on an + /// existing OPC UA client builder. + /// + /// + public static IOpcUaClientBuilder AddWotRegistryClient( + this IOpcUaClientBuilder builder, + Action? configure = null) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + + new BuilderAdapter(builder.Services).AddWotRegistryClient(configure); + return builder; + } + + /// + /// Registers WoT Connectivity 1.1 registry client services on an + /// existing OPC UA client builder. + /// + /// + public static IOpcUaClientBuilder AddWotRegistryClient( + this IOpcUaClientBuilder builder, + IConfiguration configuration) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (configuration is null) + { + throw new ArgumentNullException(nameof(configuration)); + } + + new BuilderAdapter(builder.Services).AddWotRegistryClient(configuration); + return builder; + } + + /// + /// Registers WoT Connectivity 1.1 registry client services on an + /// existing OPC UA client builder. + /// + /// + public static IOpcUaClientBuilder AddWotRegistryClient( + this IOpcUaClientBuilder builder, + IConfigurationSection section) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (section is null) + { + throw new ArgumentNullException(nameof(section)); + } + + new BuilderAdapter(builder.Services).AddWotRegistryClient(section); + return builder; + } + private sealed class BuilderAdapter : IOpcUaBuilder { public BuilderAdapter(IServiceCollection services) @@ -296,5 +477,86 @@ private async Task ConnectCoreAsync(CancellationToken ct) private Task? m_connectTask; private readonly Lock m_gate = new(); } + + /// + /// Lazily resolves the registered + /// factory delegate, awaits it once and wraps the resulting + /// session in a . The wrapper is + /// cached so repeated awaiters share the same instance. + /// + private sealed class WotRegistryClientAccessor : IAsyncDisposable + { + public WotRegistryClientAccessor(IServiceProvider sp) + { + m_sp = sp; + } + + public Task ConnectAsync(CancellationToken ct) + { + lock (m_gate) + { + if (m_disposed) + { + throw new ObjectDisposedException(nameof(WotRegistryClientAccessor)); + } + m_connectTask ??= ConnectCoreAsync(ct); + return m_connectTask; + } + } + + public ValueTask DisposeAsync() + { + lock (m_gate) + { + if (m_disposed) + { + return default; + } + m_disposed = true; + } + return default; + } + + private async Task ConnectCoreAsync(CancellationToken ct) + { + WotRegistryClientOptions options = + m_sp.GetRequiredService>().Value; + if (!options.LazyConnect) + { + throw new InvalidOperationException( + "WotRegistryClientOptions.LazyConnect is false. Resolve " + + "Func> " + + "and supply an already connected ManagedSession."); + } + + Func> sessionFactory = + m_sp.GetService>>() + ?? throw new InvalidOperationException( + "AddWotRegistryClient requires AddClient to have been called first " + + "so a ManagedSession factory is registered."); + + ITelemetryContext telemetry = + m_sp.GetRequiredService(); + + ManagedSession session = + await sessionFactory(ct).ConfigureAwait(false); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(session, telemetry, ct) + .ConfigureAwait(false); + lock (m_gate) + { + if (m_disposed) + { + throw new ObjectDisposedException(nameof(WotRegistryClientAccessor)); + } + } + return client; + } + + private readonly IServiceProvider m_sp; + private Task? m_connectTask; + private readonly Lock m_gate = new(); + private bool m_disposed; + } } } diff --git a/src/Opc.Ua.WotCon.Client/Hosting/WotRegistryClientOptions.cs b/src/Opc.Ua.WotCon.Client/Hosting/WotRegistryClientOptions.cs new file mode 100644 index 0000000000..d72c66ffb1 --- /dev/null +++ b/src/Opc.Ua.WotCon.Client/Hosting/WotRegistryClientOptions.cs @@ -0,0 +1,54 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +namespace Opc.Ua.WotCon.Client.Hosting +{ + /// + /// Top-level options for + /// Microsoft.Extensions.DependencyInjection.OpcUaWotConClientBuilderExtensions.AddWotRegistryClient. + /// + /// + /// Configurable client-side knobs for the WoT Connectivity 1.1 registry + /// client surface. Today this is intentionally minimal: the connection + /// itself is owned by the regular .AddClient(...) session + /// factory and the registry client only composes on top of an + /// established . + /// + public sealed class WotRegistryClientOptions + { + /// + /// When true (the default), the WoT registry client + /// factory delegate registered with DI lazily connects the + /// underlying the first + /// time it is awaited. Set to false when callers supply + /// their own session lifecycle and only want a typed wrapper. + /// + public bool LazyConnect { get; set; } = true; + } +} diff --git a/src/Opc.Ua.WotCon.Client/NugetREADME.md b/src/Opc.Ua.WotCon.Client/NugetREADME.md index 29cc116e40..3c6bbcf62c 100644 --- a/src/Opc.Ua.WotCon.Client/NugetREADME.md +++ b/src/Opc.Ua.WotCon.Client/NugetREADME.md @@ -1,18 +1,13 @@ # OPC UA .NET Standard — WoT Connectivity client -`OPCFoundation.NetStandard.Opc.Ua.WotCon.Client` is the client-side -helper library for the OPC UA Web of Things Connectivity information -model (OPC 10100-1). It composes the generated proxies from -`Opc.Ua.WotCon` with the `Opc.Ua.Client` session surface so -applications can browse WoT-configured asset connections, push Thing -Descriptions, and call connectivity-management methods through a -fluent API. +`OPCFoundation.NetStandard.Opc.Ua.WotCon.Client` is the client-side helper library for the OPC UA Web of Things Connectivity information model (OPC 10100-1) and the additive WoT Connectivity 1.1 registry surface. It composes the generated proxies from `Opc.Ua.WotCon` with the `Opc.Ua.Client` session surface so applications can browse WoT-configured asset connections, push Thing Descriptions, call connectivity-management methods, and manage the registry's Thing Description / Thing Model groups and resources through a fluent API. ## Overview -Reference this package alongside `Opc.Ua.Client` from any tool that -manages connectivity configuration on a WoT-conformant OPC UA -server. +Reference this package alongside `Opc.Ua.Client` from any tool that manages connectivity configuration or the registry on a WoT-conformant OPC UA server. + +* `WotConnectivityClient` / `WotAssetClient` — the OPC 10100-1 v1.02 asset-connection surface (`WoTAssetConnectionManagement`). +* `WotRegistryClient` / `WotRegistryGroupClient` / `WotRegistryResourceClient` — the WoT Connectivity 1.1 registry surface (`WoTRegistry`): create/get-or-create Thing Description and Thing Model groups and resources, upload document versions through the inherited `FileType` transfer, validate/enable/delete resources, trigger `Refresh`, and load a dependency-ordered batch of documents in one workflow via `LoadDocumentsAsync`. `WotRegistryClient` derives from the shared `XRegistryClient` (package `OPCFoundation.NetStandard.Opc.Ua.XRegistry.Client`), so it inherits the generic registry lifecycle and adds only the WoT-specific surface. ## Target frameworks @@ -24,3 +19,5 @@ server. See the [main repository README](https://github.com/OPCFoundation/UA-.NETStandard) and the [WoT Connectivity guide](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/docs/WoTConnectivity.md). + +The runnable [WoT aggregation sample](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/samples/WotCon/README.md) demonstrates `LoadDocumentsAsync`, dependency ordering, endpoint substitution, registry upload, `Refresh`, browsing, and reads from a runtime-materialized Pump. diff --git a/src/Opc.Ua.WotCon.Client/Opc.Ua.WotCon.Client.csproj b/src/Opc.Ua.WotCon.Client/Opc.Ua.WotCon.Client.csproj index c2136a871f..78c8af978d 100644 --- a/src/Opc.Ua.WotCon.Client/Opc.Ua.WotCon.Client.csproj +++ b/src/Opc.Ua.WotCon.Client/Opc.Ua.WotCon.Client.csproj @@ -22,6 +22,7 @@ + diff --git a/src/Opc.Ua.WotCon.Client/WotConBrowsePathResolver.cs b/src/Opc.Ua.WotCon.Client/WotConBrowsePathResolver.cs new file mode 100644 index 0000000000..ddea0b458a --- /dev/null +++ b/src/Opc.Ua.WotCon.Client/WotConBrowsePathResolver.cs @@ -0,0 +1,104 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; + +namespace Opc.Ua.WotCon.Client +{ + /// + /// Shared TranslateBrowsePaths helper used by every WoT + /// Connectivity client wrapper to resolve a single named child below a + /// known starting node (server entry points, registry groups, group + /// resources, ...). Centralizing this avoids re-implementing the same + /// request/response shape and not-found handling in every wrapper. + /// + internal static class WotConBrowsePathResolver + { + /// + /// Resolves the NodeId of the child named + /// below , reached via + /// . + /// + /// An open OPC UA session. + /// The NodeId to start the relative path from. + /// The reference type connecting + /// to the target child. + /// Namespace index of the + /// target child's BrowseName. + /// Name part of the target child's BrowseName. + /// Status code to report when the + /// child cannot be resolved. + /// Message to report when the child + /// cannot be resolved. + /// Cancellation token. + /// The child could not be resolved. + public static async ValueTask ResolveChildAsync( + ISession session, + NodeId startingNode, + NodeId referenceType, + ushort targetNamespaceIndex, + string targetName, + StatusCode notFoundStatus, + string notFoundMessage, + CancellationToken ct) + { + BrowsePath path = new() + { + StartingNode = startingNode, + RelativePath = new RelativePath + { + Elements = + [ + new RelativePathElement + { + ReferenceTypeId = referenceType, + IsInverse = false, + IncludeSubtypes = true, + TargetName = new QualifiedName(targetName, targetNamespaceIndex) + } + ] + } + }; + ArrayOf paths = new[] { path }.ToArrayOf(); + TranslateBrowsePathsToNodeIdsResponse response = await session + .TranslateBrowsePathsToNodeIdsAsync(null, paths, ct) + .ConfigureAwait(false); + if (response.Results.Count == 0 || + response.Results[0].Targets.Count == 0 || + StatusCode.IsBad(response.Results[0].StatusCode)) + { + throw new ServiceResultException(notFoundStatus, notFoundMessage); + } + return ExpandedNodeId.ToNodeId( + response.Results[0].Targets[0].TargetId, session.NamespaceUris); + } + } +} diff --git a/src/Opc.Ua.WotCon.Client/WotConnectivityClient.cs b/src/Opc.Ua.WotCon.Client/WotConnectivityClient.cs index 9f2598431a..52a7ddaefd 100644 --- a/src/Opc.Ua.WotCon.Client/WotConnectivityClient.cs +++ b/src/Opc.Ua.WotCon.Client/WotConnectivityClient.cs @@ -92,7 +92,9 @@ public WotConnectivityClient( /// /// is null. /// is null. - /// The WoTAssetConnectionManagement entry point was not found on the connected server. + /// + /// The WoTAssetConnectionManagement entry point was not found on the connected server. + /// public static async ValueTask ForServerAsync( ISession session, ITelemetryContext telemetry, @@ -107,38 +109,15 @@ public static async ValueTask ForServerAsync( throw new ArgumentNullException(nameof(telemetry)); } ushort ns = session.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); - BrowsePath path = new() - { - StartingNode = Ua.ObjectIds.ObjectsFolder, - RelativePath = new RelativePath - { - Elements = - [ - new RelativePathElement - { - ReferenceTypeId = Ua.ReferenceTypeIds.Organizes, - IsInverse = false, - IncludeSubtypes = true, - TargetName = new QualifiedName("WoTAssetConnectionManagement", ns) - } - ] - } - }; - ArrayOf paths = new[] { path }.ToArrayOf(); - TranslateBrowsePathsToNodeIdsResponse response = await session - .TranslateBrowsePathsToNodeIdsAsync(null, paths, ct) - .ConfigureAwait(false); - if (response.Results.Count == 0 || - response.Results[0].Targets.Count == 0 || - StatusCode.IsBad(response.Results[0].StatusCode)) - { - throw new ServiceResultException( - StatusCodes.BadNodeIdUnknown, - "WoTAssetConnectionManagement entry point not found on the connected server."); - } - var managementId = ExpandedNodeId.ToNodeId( - response.Results[0].Targets[0].TargetId, - session.NamespaceUris); + NodeId managementId = await WotConBrowsePathResolver.ResolveChildAsync( + session, + Ua.ObjectIds.ObjectsFolder, + Ua.ReferenceTypeIds.Organizes, + ns, + "WoTAssetConnectionManagement", + StatusCodes.BadNodeIdUnknown, + "WoTAssetConnectionManagement entry point not found on the connected server.", + ct).ConfigureAwait(false); return new WotConnectivityClient(session, managementId, telemetry); } @@ -174,13 +153,17 @@ public async ValueTask CreateAssetAsync( return await OpenAssetAsync(assetId, ct).ConfigureAwait(false); } - /// Calls DeleteAsset. + /// + /// Calls DeleteAsset. + /// public ValueTask DeleteAssetAsync(NodeId assetId, CancellationToken ct = default) { return Proxy.DeleteAssetAsync(assetId, ct); } - /// Calls DiscoverAssets. + /// + /// Calls DiscoverAssets. + /// public async ValueTask> DiscoverAssetsAsync( CancellationToken ct = default) { @@ -193,7 +176,9 @@ public async ValueTask> DiscoverAssetsAsync( return copy; } - /// Calls CreateAssetForEndpoint. + /// + /// Calls CreateAssetForEndpoint. + /// public async ValueTask CreateAssetForEndpointAsync( string assetName, string assetEndpoint, @@ -205,7 +190,9 @@ public async ValueTask CreateAssetForEndpointAsync( return await OpenAssetAsync(assetId, ct).ConfigureAwait(false); } - /// Calls ConnectionTest. + /// + /// Calls ConnectionTest. + /// public ValueTask<(bool Success, string Status)> ConnectionTestAsync( string assetEndpoint, CancellationToken ct = default) @@ -229,37 +216,15 @@ public async ValueTask OpenAssetAsync( throw new ArgumentException("Asset NodeId is required.", nameof(assetId)); } ushort wotConNs = Session.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); - ArrayOf paths = new[] - { - new BrowsePath - { - StartingNode = assetId, - RelativePath = new RelativePath - { - Elements = - [ - new RelativePathElement - { - ReferenceTypeId = Ua.ReferenceTypeIds.HasComponent, - IsInverse = false, - IncludeSubtypes = true, - TargetName = new QualifiedName("WoTFile", wotConNs) - } - ] - } - } - }.ToArrayOf(); - TranslateBrowsePathsToNodeIdsResponse response = await Session - .TranslateBrowsePathsToNodeIdsAsync(null, paths, ct) - .ConfigureAwait(false); - BrowsePathResult result = response.Results[0]; - if (StatusCode.IsBad(result.StatusCode) || result.Targets.Count == 0) - { - throw new ServiceResultException( - StatusCodes.BadNoMatch, - "WoTFile child not found below the asset object."); - } - var fileId = ExpandedNodeId.ToNodeId(result.Targets[0].TargetId, Session.NamespaceUris); + NodeId fileId = await WotConBrowsePathResolver.ResolveChildAsync( + Session, + assetId, + Ua.ReferenceTypeIds.HasComponent, + wotConNs, + "WoTFile", + StatusCodes.BadNoMatch, + "WoTFile child not found below the asset object.", + ct).ConfigureAwait(false); string assetName = await ReadDisplayNameAsync(assetId, ct).ConfigureAwait(false); WoTAssetFileTypeClient file = new(Session, fileId, Telemetry); diff --git a/src/Opc.Ua.WotCon.Client/WotRegistryClient.cs b/src/Opc.Ua.WotCon.Client/WotRegistryClient.cs new file mode 100644 index 0000000000..99a945edf9 --- /dev/null +++ b/src/Opc.Ua.WotCon.Client/WotRegistryClient.cs @@ -0,0 +1,816 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; +using Opc.Ua.Encoders; +using Opc.Ua.XRegistry; +using Opc.Ua.XRegistry.Client; + +namespace Opc.Ua.WotCon.Client +{ + /// + /// High-level client for the WoT Connectivity 1.1 registry surface + /// (the well-known WoTRegistry object hosted by the connected + /// server, see the xRegistry/WoTRegistryType model). + /// + /// As the WoT registry model subtypes the xRegistry base model, this is a + /// domain client in the sense of : it inherits + /// the base registry lifecycle and adds WoT-specific group/resource + /// resolution, a typed Refresh result and a dependency-ordered + /// bulk-load workflow. It composes (does not inherit) the + /// source-generated proxy, so the typed + /// proxy is reused directly rather than re-resolved per call. + /// + /// + public sealed class WotRegistryClient : XRegistryClient + { + /// + /// The well-known reserved group id that always holds Thing + /// Description resources. + /// + public const string ThingDescriptionsGroupId = "thingdescriptions"; + + /// + /// The well-known reserved group id that always holds Thing Model + /// resources. + /// + public const string ThingModelsGroupId = "thingmodels"; + + /// + /// Creates a new client rooted at . + /// + /// An open OPC UA session. + /// NodeId of the WoTRegistry + /// object on the server. + /// Telemetry context used for diagnostics. + /// is null. + /// is empty. + /// is null. + public WotRegistryClient( + ISession session, + NodeId registryObjectId, + ITelemetryContext telemetry) + : base( + session, + EnsureRegistryNamespace(session), + ValidateRegistryObjectId(registryObjectId), + telemetry) + { + Proxy = new WoTRegistryTypeClient(session, registryObjectId, telemetry); + } + + /// + /// Registers the WoT Connectivity namespace on the session so the base class can resolve + /// its index. A client may legitimately be constructed against a session that has not + /// fetched the server namespace table yet, so this appends rather than failing — matching + /// what does. + /// + private static string EnsureRegistryNamespace(ISession session) + { + if (session is null) + { + throw new ArgumentNullException(nameof(session)); + } + session.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + return Namespaces.WotCon; + } + + /// + /// Rejects a null registry root. The WoT registry root is server-specific and discovered by + /// Browse, so unlike the base model there is no well-known identifier to fall back to. + /// + private static NodeId ValidateRegistryObjectId(NodeId registryObjectId) + { + if (registryObjectId.IsNull) + { + throw new ArgumentException( + "Registry object NodeId is required.", + nameof(registryObjectId)); + } + return registryObjectId; + } + + /// + /// Creates a client rooted at the WoT Connectivity 1.1 registry + /// entry point (the well-known WoTRegistry object, a + /// HasComponent child of the Server object) of the + /// connected server. + /// + /// + /// The NodeId of the entry point is server-specific; this helper + /// resolves the standard BrowseName (WoTRegistry) by + /// translating from the Server object. + /// + /// is null. + /// is null. + /// + /// The WoTRegistry entry point was not found on the connected server. + /// + public static async ValueTask ForServerAsync( + ISession session, + ITelemetryContext telemetry, + CancellationToken ct = default) + { + if (session is null) + { + throw new ArgumentNullException(nameof(session)); + } + if (telemetry is null) + { + throw new ArgumentNullException(nameof(telemetry)); + } + ushort ns = session.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + NodeId registryId = await WotConBrowsePathResolver.ResolveChildAsync( + session, + Ua.ObjectIds.Server, + Ua.ReferenceTypeIds.HasComponent, + ns, + "WoTRegistry", + StatusCodes.BadNodeIdUnknown, + "WoTRegistry entry point not found on the connected server.", + ct).ConfigureAwait(false); + return new WotRegistryClient(session, registryId, telemetry); + } + + /// + /// The underlying generated proxy. + /// + public WoTRegistryTypeClient Proxy { get; } + + /// + /// Calls the inherited xRegistry CreateGroup Method and + /// returns a wrapper around the newly created group. The wire + /// protocol does not carry a "kind" argument; the created group's + /// actual kind (Thing Description or Thing Model) is discovered + /// from its reported TypeDefinition after creation, so this + /// works against any conformant server regardless of its group + /// naming convention. + /// + /// is null or empty. + public async ValueTask CreateGroupAsync( + string groupId, + CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(groupId)) + { + throw new ArgumentException("Group id is required.", nameof(groupId)); + } + NodeId groupNodeId = await Proxy.CreateGroupAsync(groupId, ct).ConfigureAwait(false); + return await OpenGroupClientAsync(Session, groupNodeId, groupId, Telemetry, ct) + .ConfigureAwait(false); + } + + /// + /// Calls the inherited xRegistry GetOrCreateGroup Method and + /// returns a wrapper around the resolved group plus whether it was + /// newly created. + /// + /// is null or empty. + public async ValueTask<(WotRegistryGroupClient Group, bool Created)> GetOrCreateGroupAsync( + string groupId, + CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(groupId)) + { + throw new ArgumentException("Group id is required.", nameof(groupId)); + } + (NodeId groupNodeId, bool created) = await Proxy + .GetOrCreateGroupAsync(groupId, ct).ConfigureAwait(false); + WotRegistryGroupClient group = await OpenGroupClientAsync( + Session, groupNodeId, groupId, Telemetry, ct).ConfigureAwait(false); + return (group, created); + } + + /// + /// Creates the well-known Thing Description group + /// (). + /// + public ValueTask CreateThingDescriptionGroupAsync( + CancellationToken ct = default) + { + return CreateGroupAsync(ThingDescriptionsGroupId, ct); + } + + /// + /// Gets or creates the well-known Thing Description group + /// (). + /// + public ValueTask<(WotRegistryGroupClient Group, bool Created)> GetOrCreateThingDescriptionGroupAsync( + CancellationToken ct = default) + { + return GetOrCreateGroupAsync(ThingDescriptionsGroupId, ct); + } + + /// + /// Creates the well-known Thing Model group + /// (). + /// + public ValueTask CreateThingModelGroupAsync( + CancellationToken ct = default) + { + return CreateGroupAsync(ThingModelsGroupId, ct); + } + + /// + /// Gets or creates the well-known Thing Model group + /// (). + /// + public ValueTask<(WotRegistryGroupClient Group, bool Created)> GetOrCreateThingModelGroupAsync( + CancellationToken ct = default) + { + return GetOrCreateGroupAsync(ThingModelsGroupId, ct); + } + + /// + /// Resolves an already existing group by id, browsing from the + /// registry object. + /// + /// is null or empty. + /// The group was not found below the registry object. + public async ValueTask OpenGroupAsync( + string groupId, + CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(groupId)) + { + throw new ArgumentException("Group id is required.", nameof(groupId)); + } + ushort ns = Session.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + NodeId groupNodeId = await WotConBrowsePathResolver.ResolveChildAsync( + Session, + RegistryNodeId, + Ua.ReferenceTypeIds.Organizes, + ns, + groupId, + StatusCodes.BadNoMatch, + $"Group '{groupId}' not found in the registry.", + ct).ConfigureAwait(false); + return await OpenGroupClientAsync(Session, groupNodeId, groupId, Telemetry, ct) + .ConfigureAwait(false); + } + + /// + /// Calls the generated Refresh Method and returns a typed + /// result wrapping the summary, per-resource results and the new + /// generation. + /// + /// is null. + public async ValueTask RefreshAsync( + ArrayOf selection, + WoTRefreshOptionsDataType options, + uint expectedGeneration = 0, + string requestId = "", + CancellationToken ct = default) + { + var request = new CallMethodRequest + { + ObjectId = RegistryNodeId, + MethodId = ExpandedNodeId.ToNodeId( + MethodIds.WoTRegistryType_Refresh, + Session.NamespaceUris), + InputArguments = + [ + Variant.FromStructure(selection), + Variant.FromStructure(options), + new Variant(expectedGeneration), + new Variant(requestId) + ] + }; + CallResponse response = await Session + .CallAsync(new RequestHeader(), [request], ct) + .ConfigureAwait(false); + CallMethodResult callResult = response.Results[0]; + if (StatusCode.IsBad(callResult.StatusCode)) + { + throw new ServiceResultException(callResult.StatusCode); + } + ArrayOf output = callResult.OutputArguments.IsNull + ? [] + : callResult.OutputArguments; + if (output.Count < 3) + { + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + "Refresh returned unexpected output arguments."); + } + bool hasSummary = TryDecodeStructure( + output[0], out WoTRefreshSummaryDataType? summary); + bool hasResults = TryDecodeStructureArray( + output[1], out ArrayOf results); + bool hasGeneration = output[2].TryGetValue(out uint newGeneration); + if (!hasSummary || summary is null || !hasResults || !hasGeneration) + { + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + "Refresh returned unexpected output arguments: " + + $"{output[0].TypeInfo}, {output[1].TypeInfo}, {output[2].TypeInfo}."); + } + return new WotRegistryRefreshResult(summary, results, newGeneration); + } + + private bool TryDecodeStructure(Variant value, out T? result) + where T : class, IEncodeable, new() + { + result = null; +#pragma warning disable CS8600 // TryGetStructure/TryGetValue annotate failed output as maybe-null. + if (value.TryGetStructure(Session.MessageContext, out T decoded)) +#pragma warning restore CS8600 + { + result = decoded; + return true; + } +#pragma warning disable CS8600 // TryGetValue annotates failed output as maybe-null. + if (value.TryGetValue(out ExtensionObject extension) && + extension.TryGetValue(out decoded, Session.MessageContext)) +#pragma warning restore CS8600 + { + result = decoded; + return true; + } +#pragma warning disable CS8600 // TryGetValue annotates failed output as maybe-null. + if (value.TryGetValue(out extension) && + TryDecodeBinaryExtension(extension, out decoded)) +#pragma warning restore CS8600 + { + result = decoded; + return true; + } + return false; + } + + private bool TryDecodeStructureArray(Variant value, out ArrayOf result) + where T : class, IEncodeable, new() + { + result = []; + if (value.TryGetStructure(Session.MessageContext, out result)) + { + return true; + } + if (!value.TryGetValue(out ArrayOf extensions)) + { + return false; + } + var decoded = new T[extensions.Count]; + for (int i = 0; i < extensions.Count; i++) + { + if (!extensions[i].TryGetValue(out T? item, Session.MessageContext) && + !TryDecodeBinaryExtension(extensions[i], out item) || + item is null) + { + return false; + } + decoded[i] = item; + } + result = decoded.ToArrayOf(); + return true; + } + + private bool TryDecodeBinaryExtension(ExtensionObject extension, out T? value) + where T : class, IEncodeable, new() + { + value = null; + if (!extension.TryGetAsBinary(out ByteString body, Session.MessageContext) || body.IsNull) + { + return false; + } + try + { + using var decoder = new BinaryDecoder(body.Span.ToArray(), Session.MessageContext); + value = new T(); + value.Decode(decoder); + return true; + } + catch (ServiceResultException) + { + value = null; + return false; + } + } + + /// + /// Convenience overload of that selects + /// the whole registry (an empty selection) with default options + /// when none are supplied. + /// + public ValueTask RefreshAllAsync( + WoTRefreshOptionsDataType? options = null, + string requestId = "", + uint expectedGeneration = 0, + CancellationToken ct = default) + { + return RefreshAsync( + [], + options ?? new WoTRefreshOptionsDataType(), + expectedGeneration, + requestId, + ct); + } + + /// + /// Loads into their target + /// groups/resources and optionally triggers a Refresh as a + /// single workflow. Thing Models are get-or-created and uploaded + /// before Thing Descriptions, preserving the caller's relative + /// order within each kind, so referenced models are always + /// materialised before the descriptions that depend on them. + /// Mutation failures propagate immediately (no document after the + /// failing one is processed); refresh failures are surfaced in the + /// returned rather than + /// thrown, since a partial refresh outcome is legitimate + /// application data. + /// + /// The documents to load. + /// When true (the default), calls + /// after every document has been + /// uploaded. + /// Options forwarded to the refresh + /// call; ignored when is false. + /// Request id forwarded to the refresh + /// call. When null, a new identifier is generated. + /// Cancellation token. + /// is null. + /// A document's declared + /// kind does not match the kind already held by its target group. + public async ValueTask LoadDocumentsAsync( + ArrayOf documents, + bool refresh = true, + WoTRefreshOptionsDataType? refreshOptions = null, + string? requestId = null, + CancellationToken ct = default) + { + if (documents.IsNull) + { + throw new ArgumentNullException(nameof(documents)); + } + + WotRegistryDocument[] ordered = OrderThingModelsFirst(documents); + var outcomes = new WotRegistryDocumentLoadOutcome[ordered.Length]; + var groups = new Dictionary(StringComparer.Ordinal); + for (int i = 0; i < ordered.Length; i++) + { + ct.ThrowIfCancellationRequested(); + WotRegistryDocument document = ordered[i]; + if (!groups.TryGetValue(document.GroupId, out WotRegistryGroupClient? group)) + { + (group, _) = await GetOrCreateGroupAsync(document.GroupId, ct).ConfigureAwait(false); + groups[document.GroupId] = group; + } + if (group.Kind != document.Kind) + { + throw new ServiceResultException( + StatusCodes.BadInvalidArgument, + $"Registry group '{document.GroupId}' holds {group.Kind} resources; " + + $"the document for resource '{document.ResourceId}' declares {document.Kind}."); + } + + (WotRegistryResourceClient resource, _, bool created) = await group + .GetOrCreateResourceAsync(document.ResourceId, document.VersionId, ct) + .ConfigureAwait(false); + await resource.UploadNewVersionAsync(document.Content, ct: ct).ConfigureAwait(false); + + string versionId; + (_, versionId, _) = await group + .GetOrCreateResourceAsync(document.ResourceId, document.VersionId, ct) + .ConfigureAwait(false); + outcomes[i] = new WotRegistryDocumentLoadOutcome( + document, resource.ResourceNodeId, versionId, created); + } + + WotRegistryRefreshResult? refreshResult = null; + if (refresh) + { + refreshResult = await RefreshAllAsync( + refreshOptions, + requestId ?? Guid.NewGuid().ToString("N"), + ct: ct).ConfigureAwait(false); + } + return new WotRegistryBulkLoadResult(outcomes.ToArrayOf(), refreshResult); + } + + /// + /// Stably partitions so every Thing + /// Model document precedes every Thing Description document, + /// preserving the caller's relative order within each kind. + /// + private static WotRegistryDocument[] OrderThingModelsFirst(ArrayOf documents) + { + var ordered = new WotRegistryDocument[documents.Count]; + int next = 0; + foreach (WotRegistryDocument document in documents) + { + if (document.Kind == WoTDocumentKindEnum.ThingModel) + { + ordered[next++] = document; + } + } + foreach (WotRegistryDocument document in documents) + { + if (document.Kind != WoTDocumentKindEnum.ThingModel) + { + ordered[next++] = document; + } + } + return ordered; + } + + /// + /// Builds a for an existing + /// group NodeId, discovering its Thing Description / Thing Model + /// kind from the reported TypeDefinition. + /// + /// + /// The group's TypeDefinition could not be resolved or is not recognised. + /// + internal static async ValueTask OpenGroupClientAsync( + ISession session, + NodeId groupNodeId, + string groupId, + ITelemetryContext telemetry, + CancellationToken ct) + { + WoTDocumentKindEnum kind = await ResolveGroupKindAsync(session, groupNodeId, ct) + .ConfigureAwait(false); + GroupTypeClient proxy = kind == WoTDocumentKindEnum.ThingModel + ? new ThingModelGroupTypeClient(session, groupNodeId, telemetry) + : new ThingDescriptionGroupTypeClient(session, groupNodeId, telemetry); + return new WotRegistryGroupClient(session, groupNodeId, groupId, kind, proxy, telemetry); + } + + private static async ValueTask ResolveGroupKindAsync( + ISession session, + NodeId groupNodeId, + CancellationToken ct) + { + (_, _, ArrayOf references) = await session.BrowseAsync( + requestHeader: null, + view: null, + groupNodeId, + maxResultsToReturn: 1, + BrowseDirection.Forward, + Ua.ReferenceTypeIds.HasTypeDefinition, + includeSubtypes: false, + (uint)NodeClass.ObjectType, + ct).ConfigureAwait(false); + if (references.Count == 0) + { + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + "Registry group has no reported TypeDefinition."); + } + var typeId = ExpandedNodeId.ToNodeId(references[0].NodeId, session.NamespaceUris); + if (typeId == ExpandedNodeId.ToNodeId(ObjectTypeIds.ThingModelGroupType, session.NamespaceUris)) + { + return WoTDocumentKindEnum.ThingModel; + } + if (typeId == ExpandedNodeId.ToNodeId(ObjectTypeIds.ThingDescriptionGroupType, session.NamespaceUris)) + { + return WoTDocumentKindEnum.ThingDescription; + } + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + "Registry group has an unrecognised TypeDefinition."); + } + } + + /// + /// An immutable descriptor for a single document to load through + /// . + /// + public sealed class WotRegistryDocument + { + /// + /// Creates a new document descriptor. + /// + /// Whether the document is a Thing Description + /// or a Thing Model. + /// Id of the target registry group. + /// Id of the target resource within the + /// group. + /// The document body. + /// Optional caller-supplied version id; + /// defaults to empty (server-assigned). + /// + /// or is null or empty, or + /// is null. + public WotRegistryDocument( + WoTDocumentKindEnum kind, + string groupId, + string resourceId, + ByteString content, + string versionId = "") + { + if (string.IsNullOrWhiteSpace(groupId)) + { + throw new ArgumentException("Group id is required.", nameof(groupId)); + } + if (string.IsNullOrWhiteSpace(resourceId)) + { + throw new ArgumentException("Resource id is required.", nameof(resourceId)); + } + if (content.IsNull) + { + throw new ArgumentException("Document content is required.", nameof(content)); + } + Kind = kind; + GroupId = groupId; + ResourceId = resourceId; + Content = content; + VersionId = versionId ?? string.Empty; + } + + /// + /// Whether the document is a Thing Description or a Thing Model. + /// + public WoTDocumentKindEnum Kind { get; } + + /// + /// Id of the target registry group. + /// + public string GroupId { get; } + + /// + /// Id of the target resource within the group. + /// + public string ResourceId { get; } + + /// + /// The document body. + /// + public ByteString Content { get; } + + /// + /// Caller-supplied version id (may be empty for server-assigned). + /// + public string VersionId { get; } + } + + /// + /// The outcome of loading a single + /// through . + /// + public sealed class WotRegistryDocumentLoadOutcome + { + internal WotRegistryDocumentLoadOutcome( + WotRegistryDocument document, + NodeId resourceNodeId, + string versionId, + bool created) + { + Document = document; + ResourceNodeId = resourceNodeId; + VersionId = versionId; + Created = created; + } + + /// + /// The document descriptor this outcome corresponds to. + /// + public WotRegistryDocument Document { get; } + + /// + /// NodeId of the resource the document was uploaded to. + /// + public NodeId ResourceNodeId { get; } + + /// + /// The server-assigned version id after the upload. + /// + public string VersionId { get; } + + /// + /// Whether the resource was newly created by this load. + /// + public bool Created { get; } + } + + /// + /// The result of . + /// + public sealed class WotRegistryBulkLoadResult + { + internal WotRegistryBulkLoadResult( + ArrayOf uploaded, + WotRegistryRefreshResult? refresh) + { + Uploaded = uploaded; + Refresh = refresh; + } + + /// + /// The per-document upload outcomes, in the order they were + /// applied (Thing Models before Thing Descriptions). + /// + public ArrayOf Uploaded { get; } + + /// + /// The refresh result, or null when the caller opted out of the + /// refresh step. + /// + public WotRegistryRefreshResult? Refresh { get; } + } + + /// + /// A typed wrapper around the output of the generated + /// call. + /// + public sealed class WotRegistryRefreshResult + { + internal WotRegistryRefreshResult( + WoTRefreshSummaryDataType summary, + ArrayOf results, + uint newGeneration) + { + Summary = summary; + Results = results; + NewGeneration = newGeneration; + } + + /// + /// The registry-wide refresh summary. + /// + public WoTRefreshSummaryDataType Summary { get; } + + /// + /// The per-resource load results. + /// + public ArrayOf Results { get; } + + /// + /// The registry generation committed by this refresh. + /// + public uint NewGeneration { get; } + + /// + /// True when the registry-wide outcome, or any per-resource + /// outcome, is or + /// . + /// + public bool HasFailures + { + get + { + if (Summary.Outcome is WoTOutcomeEnum.Failed or WoTOutcomeEnum.Rejected) + { + return true; + } + foreach (WoTResourceLoadResultDataType result in Results) + { + if (result.Outcome is WoTOutcomeEnum.Failed or WoTOutcomeEnum.Rejected) + { + return true; + } + } + return false; + } + } + + /// + /// Throws a when + /// is true. + /// + /// + /// The refresh reported at least one failed or rejected outcome. + /// + public void EnsureSuccess() + { + if (!HasFailures) + { + return; + } + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + $"Refresh request '{Summary.RequestId}' reported {Summary.Failed} " + + $"failed and {Summary.Skipped} skipped resource(s) out of {Summary.Total}."); + } + } +} diff --git a/src/Opc.Ua.WotCon.Client/WotRegistryGroupClient.cs b/src/Opc.Ua.WotCon.Client/WotRegistryGroupClient.cs new file mode 100644 index 0000000000..17639c80ce --- /dev/null +++ b/src/Opc.Ua.WotCon.Client/WotRegistryGroupClient.cs @@ -0,0 +1,181 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; +using Opc.Ua.XRegistry; + +namespace Opc.Ua.WotCon.Client +{ + /// + /// Wrapper around a single registry group object (a + /// ThingDescriptionGroupType or ThingModelGroupType + /// instance below the WoTRegistry object). Composes the + /// generated proxy shared by + /// both group subtypes. + /// + public sealed class WotRegistryGroupClient + { + internal WotRegistryGroupClient( + ISession session, + NodeId groupNodeId, + string groupId, + WoTDocumentKindEnum kind, + GroupTypeClient proxy, + ITelemetryContext telemetry) + { + Session = session; + GroupNodeId = groupNodeId; + GroupId = groupId; + Kind = kind; + Proxy = proxy; + Telemetry = telemetry; + } + + /// + /// The OPC UA session. + /// + public ISession Session { get; } + + /// + /// Group object NodeId. + /// + public NodeId GroupNodeId { get; } + + /// + /// Group id (BrowseName minus namespace prefix). + /// + public string GroupId { get; } + + /// + /// Whether this group holds Thing Description or Thing Model + /// resources. + /// + public WoTDocumentKindEnum Kind { get; } + + /// + /// The underlying generated proxy, shared by + /// ThingDescriptionGroupType and ThingModelGroupType. + /// + public GroupTypeClient Proxy { get; } + + /// + /// Telemetry context. + /// + public ITelemetryContext Telemetry { get; } + + /// + /// Calls CreateResource and returns a wrapper around the + /// newly created resource plus the server-assigned version id. + /// + /// is null or empty. + public async ValueTask<(WotRegistryResourceClient Resource, string VersionId)> CreateResourceAsync( + string resourceId, + string versionId = "", + CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(resourceId)) + { + throw new ArgumentException("Resource id is required.", nameof(resourceId)); + } + (NodeId resourceNodeId, string versionIdOut, _) = await Proxy + .CreateResourceAsync(resourceId, versionId ?? string.Empty, requestFileOpen: false, ct) + .ConfigureAwait(false); + return (OpenResourceClient(resourceNodeId, resourceId), versionIdOut); + } + + /// + /// Calls GetOrCreateResource and returns a wrapper around + /// the resolved resource, the server-assigned version id and + /// whether it was newly created. + /// + /// is null or empty. + public async ValueTask<(WotRegistryResourceClient Resource, string VersionId, bool Created)> + GetOrCreateResourceAsync( + string resourceId, + string versionId = "", + CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(resourceId)) + { + throw new ArgumentException("Resource id is required.", nameof(resourceId)); + } + (NodeId resourceNodeId, string versionIdOut, _, bool created) = await Proxy + .GetOrCreateResourceAsync(resourceId, versionId ?? string.Empty, requestFileOpen: false, ct) + .ConfigureAwait(false); + return (OpenResourceClient(resourceNodeId, resourceId), versionIdOut, created); + } + + /// + /// Resolves an already existing resource by id, browsing from the + /// group object. + /// + /// is null or empty. + /// The resource was not found in this group. + public async ValueTask OpenResourceAsync( + string resourceId, + CancellationToken ct = default) + { + if (string.IsNullOrWhiteSpace(resourceId)) + { + throw new ArgumentException("Resource id is required.", nameof(resourceId)); + } + ushort ns = Session.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + NodeId resourceNodeId = await WotConBrowsePathResolver.ResolveChildAsync( + Session, + GroupNodeId, + Ua.ReferenceTypeIds.Organizes, + ns, + resourceId, + StatusCodes.BadNoMatch, + $"Resource '{resourceId}' not found in group '{GroupId}'.", + ct).ConfigureAwait(false); + return OpenResourceClient(resourceNodeId, resourceId); + } + + /// + /// Calls Delete on the group. + /// + public ValueTask DeleteAsync(uint expectedEpoch, CancellationToken ct = default) + { + return Proxy.DeleteAsync(expectedEpoch, ct); + } + + private WotRegistryResourceClient OpenResourceClient(NodeId resourceNodeId, string resourceId) + { + WoTDocumentTypeClient proxy = Kind == WoTDocumentKindEnum.ThingModel + ? new ThingModelFileTypeClient(Session, resourceNodeId, Telemetry) + : new ThingDescriptionFileTypeClient(Session, resourceNodeId, Telemetry); + return new WotRegistryResourceClient( + Session, resourceNodeId, GroupId, resourceId, Kind, proxy, Telemetry); + } + } +} diff --git a/src/Opc.Ua.WotCon.Client/WotRegistryResourceClient.cs b/src/Opc.Ua.WotCon.Client/WotRegistryResourceClient.cs new file mode 100644 index 0000000000..5a7ecc3bea --- /dev/null +++ b/src/Opc.Ua.WotCon.Client/WotRegistryResourceClient.cs @@ -0,0 +1,255 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Client; +using Opc.Ua.Encoders; +using Opc.Ua.XRegistry.Client; + +namespace Opc.Ua.WotCon.Client +{ + /// + /// Wrapper around a single registry document resource (a + /// ThingDescriptionFileType or ThingModelFileType + /// instance below a registry group). Composes the generated + /// proxy shared by both document + /// subtypes, which in turn inherits the FileType + /// Open/Read/Write/Close primitives used + /// here through the existing . + /// Closing a write handle commits the buffered content as a new + /// resource version. + /// + public sealed class WotRegistryResourceClient + { + internal WotRegistryResourceClient( + ISession session, + NodeId resourceNodeId, + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + WoTDocumentTypeClient proxy, + ITelemetryContext telemetry) + { + Session = session; + ResourceNodeId = resourceNodeId; + GroupId = groupId; + ResourceId = resourceId; + Kind = kind; + Proxy = proxy; + Telemetry = telemetry; + } + + /// + /// The OPC UA session. + /// + public ISession Session { get; } + + /// + /// Resource object NodeId. + /// + public NodeId ResourceNodeId { get; } + + /// + /// Id of the owning group. + /// + public string GroupId { get; } + + /// + /// Resource id (BrowseName minus namespace prefix). + /// + public string ResourceId { get; } + + /// + /// Whether this resource is a Thing Description or a Thing Model. + /// + public WoTDocumentKindEnum Kind { get; } + + /// + /// The underlying generated proxy, shared by + /// ThingDescriptionFileType and ThingModelFileType. + /// + public WoTDocumentTypeClient Proxy { get; } + + /// + /// Telemetry context. + /// + public ITelemetryContext Telemetry { get; } + + /// + /// Calls Validate on the resource. + /// + public async ValueTask ValidateAsync(CancellationToken ct = default) + { + var request = new CallMethodRequest + { + ObjectId = ResourceNodeId, + MethodId = ExpandedNodeId.ToNodeId( + MethodIds.WoTDocumentType_Validate, + Session.NamespaceUris), + InputArguments = [] + }; + CallResponse response = await Session + .CallAsync(new RequestHeader(), [request], ct) + .ConfigureAwait(false); + CallMethodResult result = response.Results[0]; + if (StatusCode.IsBad(result.StatusCode)) + { + throw new ServiceResultException(result.StatusCode); + } + ArrayOf output = result.OutputArguments.IsNull ? [] : result.OutputArguments; + if (output.Count == 0 || + !TryDecodeStructure(output[0], out WoTValidationOutcomeDataType? outcome) || + outcome is null) + { + throw new ServiceResultException( + StatusCodes.BadUnexpectedError, + "Validate returned unexpected output arguments."); + } + return outcome; + } + + private bool TryDecodeStructure(Variant value, out T? result) + where T : class, IEncodeable, new() + { + result = null; +#pragma warning disable CS8600 // TryGetStructure annotates failed output as maybe-null. + if (value.TryGetStructure(Session.MessageContext, out T decoded)) +#pragma warning restore CS8600 + { + result = decoded; + return true; + } +#pragma warning disable CS8600 // TryGetValue annotates failed output as maybe-null. + if (value.TryGetValue(out ExtensionObject extension) && + extension.TryGetValue(out decoded, Session.MessageContext)) +#pragma warning restore CS8600 + { + result = decoded; + return true; + } + if (value.TryGetValue(out extension) && + extension.TryGetAsBinary(out ByteString body, Session.MessageContext) && + !body.IsNull) + { + using var decoder = new BinaryDecoder(body.Span.ToArray(), Session.MessageContext); + result = new T(); + result.Decode(decoder); + return true; + } + return false; + } + + /// + /// Calls SetEnabled on the resource. + /// + public ValueTask SetEnabledAsync(bool enabled, uint expectedEpoch, CancellationToken ct = default) + { + return Proxy.SetEnabledAsync(enabled, expectedEpoch, ct); + } + + /// + /// Calls SetDefaultVersion on the resource. + /// + public ValueTask SetDefaultVersionAsync( + string versionId, uint expectedEpoch, CancellationToken ct = default) + { + return Proxy.SetDefaultVersionAsync(versionId, expectedEpoch, ct); + } + + /// + /// Calls Delete on the resource. + /// + public ValueTask DeleteAsync(uint expectedEpoch, CancellationToken ct = default) + { + return Proxy.DeleteAsync(expectedEpoch, ct); + } + + /// + /// Uploads through the inherited + /// FileType primitives (Open(Write|EraseExisting) → + /// WriteClose). Closing the write handle commits + /// the buffer as a new resource version. + /// + public ValueTask UploadNewVersionAsync( + ByteString content, + int chunkSize = FileTypeClientExtensions.DefaultChunkSize, + CancellationToken ct = default) + { + return Proxy.UploadAsync(content, chunkSize: chunkSize, ct: ct); + } + + /// + /// Uploads the contents of through the + /// inherited FileType primitives. The stream is read + /// sequentially until end-of-stream; the caller retains ownership + /// of and is responsible for disposing + /// it. Closing the write handle commits the buffer as a new + /// resource version. + /// + public ValueTask UploadNewVersionAsync( + Stream content, + int chunkSize = FileTypeClientExtensions.DefaultChunkSize, + CancellationToken ct = default) + { + return Proxy.UploadAsync(content, chunkSize: chunkSize, ct: ct); + } + + /// + /// Downloads the currently persisted resource content (the active + /// / default version) via chunked Read calls. + /// + /// A WoT document resource is an xRegistry ResourceType, so this reuses the shared + /// helper directly on the + /// generated proxy rather than round-tripping the document through a byte[]. + /// + /// + public ValueTask DownloadAsync( + int chunkSize = FileTypeClientExtensions.DefaultChunkSize, + CancellationToken ct = default) + { + return Proxy.ReadDocumentAsync(chunkSize, ct); + } + + /// + /// Downloads the currently persisted resource content and writes + /// it sequentially into . The + /// caller retains ownership of and + /// is responsible for disposing it. + /// + public ValueTask DownloadToAsync( + Stream destination, + int chunkSize = FileTypeClientExtensions.DefaultChunkSize, + CancellationToken ct = default) + { + return Proxy.DownloadToAsync(destination, chunkSize, ct); + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Assets/AssetRegistry.cs b/src/Opc.Ua.WotCon.Server/Assets/AssetRegistry.cs index 69400c7418..431ad6a3e2 100644 --- a/src/Opc.Ua.WotCon.Server/Assets/AssetRegistry.cs +++ b/src/Opc.Ua.WotCon.Server/Assets/AssetRegistry.cs @@ -81,7 +81,9 @@ public IReadOnlyCollection AssetNames } } - /// Looks up an asset by NodeId. Returns null when missing. + /// + /// Looks up an asset by NodeId. Returns null when missing. + /// public AssetEntry? FindByNodeId(NodeId nodeId) { lock (m_byName) @@ -237,6 +239,7 @@ public async ValueTask DeleteAssetAsync( await m_manager.DeleteAssetNodeAsync(entry.Asset, ct).ConfigureAwait(false); DeleteTdFromDisk(entry.Name); + await RemoveFromRegistryAsync(entry.Name, ct).ConfigureAwait(false); return ServiceResult.Good; } finally @@ -578,6 +581,8 @@ public async ValueTask RebuildAsync( { PersistTdToDisk(entry.Name, td); } + + await MirrorToRegistryAsync(entry.Name, td, ct).ConfigureAwait(false); } finally { @@ -641,7 +646,7 @@ private void BuildPropertyNode(AssetEntry entry, string name, WotProperty proper BrowseName = new QualifiedName(name, ns), DisplayName = new LocalizedText(property.Title ?? name), Description = property.Description != null ? new LocalizedText(property.Description) : LocalizedText.Null, - DataType = mapped ? dataType : DataTypeIds.BaseDataType, + DataType = mapped ? dataType : Ua.DataTypeIds.BaseDataType, ValueRank = mapped ? valueRank : ValueRanks.Scalar, AccessLevel = property.ReadOnly ? AccessLevels.CurrentRead : AccessLevels.CurrentReadOrWrite, UserAccessLevel = property.ReadOnly ? AccessLevels.CurrentRead : AccessLevels.CurrentReadOrWrite, @@ -721,7 +726,7 @@ private void BuildActionNode(AssetEntry entry, string name, WotAction action) inputProperty.NodeId = m_manager.AllocateChildNodeId(entry.Name, "actions", name + "_in"); inputProperty.BrowseName = new QualifiedName(Ua.BrowseNames.InputArguments); inputProperty.DisplayName = new LocalizedText(Ua.BrowseNames.InputArguments); - inputProperty.DataType = DataTypeIds.Argument; + inputProperty.DataType = Ua.DataTypeIds.Argument; inputProperty.ValueRank = ValueRanks.OneDimension; inputProperty.ReferenceTypeId = Ua.ReferenceTypeIds.HasProperty; inputProperty.TypeDefinitionId = VariableTypeIds.PropertyType; @@ -741,7 +746,7 @@ private void BuildActionNode(AssetEntry entry, string name, WotAction action) outputProperty.NodeId = m_manager.AllocateChildNodeId(entry.Name, "actions", name + "_out"); outputProperty.BrowseName = new QualifiedName(Ua.BrowseNames.OutputArguments); outputProperty.DisplayName = new LocalizedText(Ua.BrowseNames.OutputArguments); - outputProperty.DataType = DataTypeIds.Argument; + outputProperty.DataType = Ua.DataTypeIds.Argument; outputProperty.ValueRank = ValueRanks.OneDimension; outputProperty.ReferenceTypeId = Ua.ReferenceTypeIds.HasProperty; outputProperty.TypeDefinitionId = VariableTypeIds.PropertyType; @@ -902,6 +907,54 @@ private void DeleteTdFromDisk(string name) } } + private async ValueTask MirrorToRegistryAsync( + string name, ThingDescription td, CancellationToken ct) + { + Registry.IWotRegistryService? registry = m_options.RegistryBridge; + if (registry is null) + { + return; + } + try + { + byte[] bytes = JsonSerializer.SerializeToUtf8Bytes( + td, ThingDescriptionJsonContext.Default.ThingDescription); + await registry.UpsertResourceAsync(new Registry.WotUpsertResourceRequest + { + GroupId = m_options.RegistryBridgeGroupId, + ResourceId = name, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = bytes, + ContentType = "application/td+json", + Format = "WoT-TD/1.1", + Name = name + }, ct).ConfigureAwait(false); + } + catch (Exception ex) + { + m_logger.FailedToPersistTd(ex, name); + } + } + + private async ValueTask RemoveFromRegistryAsync(string name, CancellationToken ct) + { + Registry.IWotRegistryService? registry = m_options.RegistryBridge; + if (registry is null) + { + return; + } + try + { + await registry.DeleteResourceAsync( + m_options.RegistryBridgeGroupId, name, cancellationToken: ct) + .ConfigureAwait(false); + } + catch (Exception ex) + { + m_logger.FailedToDeleteTd(ex, name); + } + } + /// /// Enumerates persisted thing descriptions from the storage folder, /// loading and deserialising each one. @@ -1104,16 +1157,28 @@ private static StatusCode MapToStatusCode(Exception ex) private readonly Dictionary m_byNodeId = []; } + /// + /// Holds source-generated log messages emitted by the WoT asset registry component. + /// internal static partial class AssetRegistryLog { + /// + /// Logs that an asset provider threw while being disposed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 0, Level = LogLevel.Warning, Message = "Provider for asset {AssetName} threw on disposal")] public static partial void ProviderForAssetThrewOnDisposal(this ILogger logger, Exception ex, string assetName); + /// + /// Logs that endpoint policy rejected asset creation before a provider was invoked. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 1, Level = LogLevel.Warning, Message = "CreateAssetForEndpoint rejected by AssetEndpointPolicy: {Status}")] public static partial void CreateAssetForEndpointRejected(this ILogger logger, StatusCode status); + /// + /// Logs that a provider rejected an endpoint while creating an asset. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 2, Level = LogLevel.Error, Message = "CreateAssetForEndpoint failed for asset {AssetName}: provider rejected the endpoint")] public static partial void CreateAssetForEndpointProviderRejected( @@ -1121,6 +1186,9 @@ public static partial void CreateAssetForEndpointProviderRejected( Exception ex, string assetName); + /// + /// Logs that asset creation did not complete before the configured timeout. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 3, Level = LogLevel.Warning, Message = "CreateAssetForEndpoint timed out after {Timeout} for {AssetName}")] public static partial void CreateAssetForEndpointTimedOut( @@ -1129,34 +1197,58 @@ public static partial void CreateAssetForEndpointTimedOut( TimeSpan timeout, string assetName); + /// + /// Logs an unexpected failure while creating an asset for a client-provided endpoint. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 4, Level = LogLevel.Error, Message = "CreateAssetForEndpoint failed for asset {AssetName}")] public static partial void CreateAssetForEndpointFailed(this ILogger logger, Exception ex, string assetName); + /// + /// Logs that the configured asset provider does not support discovery. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 5, Level = LogLevel.Warning, Message = "DiscoverAssets not supported by configured provider")] public static partial void DiscoverAssetsNotSupported(this ILogger logger, Exception ex); + /// + /// Logs an unexpected failure while discovering assets from the configured provider. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 6, Level = LogLevel.Error, Message = "DiscoverAssets failed")] public static partial void DiscoverAssetsFailed(this ILogger logger, Exception ex); + /// + /// Logs that endpoint policy rejected a client-requested connection test. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 7, Level = LogLevel.Warning, Message = "ConnectionTest rejected by AssetEndpointPolicy: {Status}")] public static partial void ConnectionTestRejected(this ILogger logger, StatusCode status); + /// + /// Logs that the configured provider does not support connection tests. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 8, Level = LogLevel.Warning, Message = "ConnectionTest not supported by configured provider")] public static partial void ConnectionTestNotSupported(this ILogger logger, Exception ex); + /// + /// Logs an unexpected provider failure while testing a client-provided endpoint. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 9, Level = LogLevel.Error, Message = "ConnectionTest failed for endpoint provided by client")] public static partial void ConnectionTestFailed(this ILogger logger, Exception ex); + /// + /// Logs that a client-requested connection test exceeded the configured timeout. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 10, Level = LogLevel.Warning, Message = "ConnectionTest timed out after {Timeout}")] public static partial void ConnectionTestTimedOut(this ILogger logger, Exception ex, TimeSpan timeout); + /// + /// Logs that a WoT binding factory could not connect an asset provider. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 11, Level = LogLevel.Error, Message = "Binding factory {Factory} failed to connect asset {AssetName}")] public static partial void BindingFactoryFailedToConnectAsset( @@ -1165,18 +1257,30 @@ public static partial void BindingFactoryFailedToConnectAsset( string factory, string assetName); + /// + /// Logs that the previous provider for an asset threw while being replaced. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 12, Level = LogLevel.Warning, Message = "Previous provider for {AssetName} threw on disposal")] public static partial void PreviousProviderThrewOnDisposal(this ILogger logger, Exception ex, string assetName); + /// + /// Logs that a duplicate Thing Description property was skipped during asset projection. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 13, Level = LogLevel.Warning, Message = "Skipping duplicate TD property '{ChildName}' for asset {AssetName}.")] public static partial void SkippingDuplicateTdProperty(this ILogger logger, string childName, string assetName); + /// + /// Logs that a duplicate Thing Description action was skipped during asset projection. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 14, Level = LogLevel.Warning, Message = "Skipping duplicate TD action '{ChildName}' for asset {AssetName}.")] public static partial void SkippingDuplicateTdAction(this ILogger logger, string childName, string assetName); + /// + /// Logs that a Thing Description affordance was skipped with a specific reason. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 15, Level = LogLevel.Warning, Message = "Skipping TD {Kind} '{ChildName}' on asset {AssetName}: {Reason}")] public static partial void SkippingTd( @@ -1186,53 +1290,89 @@ public static partial void SkippingTd( string assetName, string? reason); + /// + /// Logs that reading a projected WoT property failed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 16, Level = LogLevel.Warning, Message = "Read failed for asset {AssetName} property {Property}")] public static partial void ReadFailed(this ILogger logger, Exception ex, string assetName, string property); + /// + /// Logs that writing a projected WoT property failed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 17, Level = LogLevel.Warning, Message = "Write failed for asset {AssetName} property {Property}")] public static partial void WriteFailed(this ILogger logger, Exception ex, string assetName, string property); + /// + /// Logs that invoking a projected WoT action threw. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 18, Level = LogLevel.Warning, Message = "Action {Action} on asset {AssetName} threw")] public static partial void ActionThrew(this ILogger logger, Exception ex, string action, string assetName); + /// + /// Logs that persisted Thing Description creation was refused because the path was unsafe. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 19, Level = LogLevel.Warning, Message = "Refusing to persist TD for asset {AssetName}: name did not resolve to a safe path " + "under {Folder}.")] public static partial void RefusingToPersistTd(this ILogger logger, string assetName, string folder); + /// + /// Logs that writing a persisted Thing Description failed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 20, Level = LogLevel.Warning, Message = "Failed to persist TD for asset {AssetName}")] public static partial void FailedToPersistTd(this ILogger logger, Exception ex, string assetName); + /// + /// Logs that persisted Thing Description deletion was refused because the path was unsafe. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 21, Level = LogLevel.Warning, Message = "Refusing to delete TD for asset {AssetName}: name did not resolve to a safe path " + "under {Folder}.")] public static partial void RefusingToDeleteTd(this ILogger logger, string assetName, string folder); + /// + /// Logs that deleting a persisted Thing Description failed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 22, Level = LogLevel.Warning, Message = "Failed to delete TD for asset {AssetName}")] public static partial void FailedToDeleteTd(this ILogger logger, Exception ex, string assetName); + /// + /// Logs that persisted Thing Descriptions will not be loaded because the configured limit is zero. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 23, Level = LogLevel.Information, Message = "MaxPersistedThingDescriptionFiles is {Limit}; no persisted TDs will be loaded from {Folder}.")] public static partial void NoPersistedTdsLoaded(this ILogger logger, int limit, string folder); + /// + /// Logs that the persisted Thing Description load limit was reached. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 24, Level = LogLevel.Warning, Message = "Reached MaxPersistedThingDescriptionFiles ({Limit}); skipping the remaining " + "persisted TDs in {Folder}.")] public static partial void MaxPersistedTdFilesReached(this ILogger logger, int limit, string folder); + /// + /// Logs that a persisted Thing Description file was skipped because its name was invalid. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 25, Level = LogLevel.Warning, Message = "Skipping persisted TD {File}: name does not pass asset-name validation.")] public static partial void SkippingPersistedTdNameValidation(this ILogger logger, string file); + /// + /// Logs that a persisted Thing Description file was skipped because file metadata could not be read. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 26, Level = LogLevel.Warning, Message = "Skipping persisted TD {File}: file metadata could not be read.")] public static partial void SkippingPersistedTdMetadata(this ILogger logger, Exception ex, string file); + /// + /// Logs that a persisted Thing Description file was skipped because it exceeded the size limit. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 27, Level = LogLevel.Warning, Message = "Skipping persisted TD {File}: size {Bytes} exceeds MaxThingDescriptionSize ({Limit}).")] public static partial void SkippingPersistedTdTooLarge( @@ -1241,6 +1381,9 @@ public static partial void SkippingPersistedTdTooLarge( long bytes, long limit); + /// + /// Logs that a persisted Thing Description file was skipped because JSON deserialization failed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 28, Level = LogLevel.Warning, Message = "Skipping persisted TD {File}: JSON deserialization failed (likely exceeds " + "MaxThingDescriptionJsonDepth={Depth} or is otherwise malformed).")] @@ -1250,10 +1393,16 @@ public static partial void SkippingPersistedTdJsonDeserialization( string file, int depth); + /// + /// Logs that a persisted Thing Description file was skipped because reading it failed. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 29, Level = LogLevel.Warning, Message = "Skipping persisted TD {File}: I/O failure while reading.")] public static partial void SkippingPersistedTdIoFailure(this ILogger logger, Exception ex, string file); + /// + /// Logs that an asset provider threw during registry shutdown. + /// [LoggerMessage(EventId = WotConServerEventIds.AssetRegistry + 30, Level = LogLevel.Warning, Message = "Provider for asset {AssetName} threw on shutdown")] public static partial void ProviderForAssetThrewOnShutdown(this ILogger logger, Exception ex, string assetName); diff --git a/src/Opc.Ua.WotCon.Server/Assets/WotAssetFileManager.cs b/src/Opc.Ua.WotCon.Server/Assets/WotAssetFileManager.cs index 9f3b9f545f..20f4818e6a 100644 --- a/src/Opc.Ua.WotCon.Server/Assets/WotAssetFileManager.cs +++ b/src/Opc.Ua.WotCon.Server/Assets/WotAssetFileManager.cs @@ -112,9 +112,11 @@ public void Dispose() } } - private static NodeId? SessionIdOf(ISystemContext context) + private static NodeId SessionIdOf(ISystemContext context) { - return (context as ISessionSystemContext)?.SessionId; + return context is ISessionSystemContext sessionContext + ? sessionContext.SessionId.GetValueOrDefault() + : NodeId.Null; } private ServiceResult OnOpen( @@ -131,7 +133,7 @@ private ServiceResult OnOpen( return ServiceResult.Create(StatusCodes.BadNotSupported, "WoTAssetFileType only supports modes Read (1) and Write+EraseExisting (6)."); } - NodeId? sessionId = SessionIdOf(context); + NodeId sessionId = SessionIdOf(context); lock (m_handles) { if (m_handles.Count >= m_maxHandles) @@ -381,8 +383,8 @@ private bool TryGetHandleLocked( error = ServiceResult.Create(StatusCodes.BadInvalidArgument, "Unknown file handle."); return false; } - NodeId? expected = SessionIdOf(context); - if (expected != null && located.SessionId != null && located.SessionId != expected) + NodeId expected = SessionIdOf(context); + if (!expected.IsNull && !located.SessionId.IsNull && located.SessionId != expected) { handle = null!; error = ServiceResult.Create(StatusCodes.BadUserAccessDenied, @@ -394,29 +396,57 @@ private bool TryGetHandleLocked( return true; } + /// + /// Tracks an open OPC UA file handle and whether it owns a writable buffer. + /// private sealed class Handle : IDisposable { - private Handle(NodeId? sessionId, Stream stream, bool writing) + private Handle(NodeId sessionId, Stream stream, bool writing) { SessionId = sessionId; Stream = stream; Writing = writing; } - public NodeId? SessionId { get; } + /// + /// Gets the session that opened the file handle. + /// + public NodeId SessionId { get; } + + /// + /// Gets the stream backing the open file handle. + /// public Stream Stream { get; } + + /// + /// Gets whether the handle buffers a write that will be committed on close. + /// public bool Writing { get; } - public static Handle OpenRead(NodeId? sessionId, byte[] snapshot) + /// + /// Opens a read handle over an immutable snapshot of the Thing Description JSON. + /// + /// The session that opened the handle. + /// The bytes exposed by the read handle. + /// A read-only file handle. + public static Handle OpenRead(NodeId sessionId, byte[] snapshot) { return new(sessionId, new MemoryStream(snapshot, writable: false), writing: false); } - public static Handle OpenWrite(NodeId? sessionId) + /// + /// Opens a write handle whose buffer is validated and committed when the OPC UA file closes. + /// + /// The session that opened the handle. + /// A writable file handle. + public static Handle OpenWrite(NodeId sessionId) { return new(sessionId, new MemoryStream(), writing: true); } + /// + /// Disposes the stream owned by the file handle. + /// public void Dispose() { Stream.Dispose(); @@ -433,8 +463,14 @@ public void Dispose() private uint m_writingHandle; } + /// + /// Holds source-generated log messages emitted by the WoT asset file manager component. + /// internal static partial class WotAssetFileManagerLog { + /// + /// Logs that uploaded Thing Description JSON could not be parsed before being accepted. + /// [LoggerMessage(EventId = WotConServerEventIds.WotAssetFileManager + 0, Level = LogLevel.Warning, Message = "Thing description JSON could not be parsed")] public static partial void ThingDescriptionJsonCouldNotBeParsed(this ILogger logger, JsonException ex); diff --git a/src/Opc.Ua.WotCon.Server/EventIds.cs b/src/Opc.Ua.WotCon.Server/EventIds.cs index 9a0f746df9..ca03f5b0eb 100644 --- a/src/Opc.Ua.WotCon.Server/EventIds.cs +++ b/src/Opc.Ua.WotCon.Server/EventIds.cs @@ -46,5 +46,6 @@ internal static class WotConServerEventIds public const int AssetRegistry = 0; public const int WotAssetFileManager = 40; public const int WotConnectivityNodeManager = 50; + public const int WotRegistryNodeManager = 60; } } diff --git a/src/Opc.Ua.WotCon.Server/Hosting/OpcUaWotRegistryServerBuilderExtensions.cs b/src/Opc.Ua.WotCon.Server/Hosting/OpcUaWotRegistryServerBuilderExtensions.cs new file mode 100644 index 0000000000..fdc55dad6a --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Hosting/OpcUaWotRegistryServerBuilderExtensions.cs @@ -0,0 +1,200 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; +using Opc.Ua; +using Opc.Ua.Server; +using Opc.Ua.Server.Hosting; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry.Server; + +namespace Microsoft.Extensions.DependencyInjection +{ + /// + /// extensions that host the WoT Connectivity 1.1 + /// registry (WoTRegistry) on the OPC UA server registered via + /// .AddServer(...). The registry service, materialization coordinator, + /// binder registry and projection host are registered as singletons; the + /// stable is attached at server start. + /// + public static class OpcUaWotRegistryServerBuilderExtensions + { + /// + /// Default configuration section for the registry options. + /// + public const string DefaultConfigurationSection = "OpcUa:WotConRegistry:Server"; + + /// + /// Registers the WoT Connectivity 1.1 registry NodeManager configured by + /// . + /// + /// + /// + public static IOpcUaBuilder AddWotRegistryServer( + this IOpcUaBuilder builder, + Action? configure = null) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (configure is not null) + { + builder.Services.AddOptions().Configure(configure); + } + else + { + builder.Services.AddOptions(); + } + RegisterCommonServices(builder.Services); + return builder; + } + + /// + /// Registers the WoT Connectivity 1.1 registry NodeManager with options + /// bound from the supplied configuration section. + /// + /// + /// + public static IOpcUaBuilder AddWotRegistryServer( + this IOpcUaBuilder builder, + IConfiguration configuration) + { + if (configuration is null) + { + throw new ArgumentNullException(nameof(configuration)); + } + return builder.AddWotRegistryServer( + configuration.GetSection(DefaultConfigurationSection)); + } + + /// + /// Registers the WoT Connectivity 1.1 registry NodeManager with options + /// bound from the supplied configuration section. + /// + /// + /// + public static IOpcUaBuilder AddWotRegistryServer( + this IOpcUaBuilder builder, + IConfigurationSection section) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (section is null) + { + throw new ArgumentNullException(nameof(section)); + } + builder.Services.AddOptions().Bind(section); + RegisterCommonServices(builder.Services); + return builder; + } + + private static void RegisterCommonServices(IServiceCollection services) + { + services.TryAddSingleton(sp => + sp.GetRequiredService>().Value + ?? new WotRegistryServerOptions()); + + services.EnsureWotBinderRegistry(); + + services.TryAddSingleton(new WotTargetVariableResolver()); + + services.TryAddSingleton(sp => + new WotProjectionBindingRuntimeFactory( + sp.GetRequiredService(), + sp.GetRequiredService())); + + services.TryAddSingleton(sp => + { + WotRegistryServerOptions options = + sp.GetRequiredService(); + // A store registered in DI wins over one set on the options, so a deployment can + // supply a shared store the same way the xRegistry server does. + IXRegistryResourceStore? resourceStore = + sp.GetService() ?? options.ResourceStore; + IWotRegistryStore store = string.IsNullOrEmpty(options.StorageFolder) + ? new InMemoryWotRegistryStore() + : resourceStore is null + ? new FileWotRegistryStore(options.StorageFolder!) + : new FileWotRegistryStore(options.StorageFolder!, resourceStore); + return new WotRegistryService(store, options.Bounds); + }); + + services.TryAddSingleton(sp => + new LifecycleWotProjectionHost( + sp.GetRequiredService(), + sp.GetRequiredService())); + + services.TryAddSingleton(sp => + { + WotRegistryServerOptions options = + sp.GetRequiredService(); + var converterOptions = new WotNodeSetConverterOptions + { + MaxJsonDocumentSize = options.Bounds.MaxDocumentBytes, + MaxResolverDocumentBytes = options.Bounds.MaxDocumentBytes + }; + return new WotMaterializationCoordinator( + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService(), + converterOptions, + // Both seams are optional: a deployment that registers neither gets exactly + // the previous behaviour. Registering an IWotDocumentConverter replaces the + // Thing Description to NodeSet conversion; registering IWotNodeSetContributor + // instances adds nodes (typically controller-specific StructureType DataTypes) + // to the converted NodeSet before it is materialized. + sp.GetService(), + sp.GetServices(), + sp.GetService()); + }); + + services.TryAddSingleton(sp => + new WotRegistryNodeManagerFactory( + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService())); + + services.AddSingleton(sp => + new OpcUaServerNodeManagerRegistration( + sp.GetRequiredService())); + + services.AddOpcUa(); + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/IWotDocumentConverter.cs b/src/Opc.Ua.WotCon.Server/Materialization/IWotDocumentConverter.cs new file mode 100644 index 0000000000..2f1b10cf29 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/IWotDocumentConverter.cs @@ -0,0 +1,180 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Export; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// The result of converting one registry document to a NodeSet2 model. + /// + public sealed class WotConversionOutput + { + /// + /// Initializes a successful or failed conversion output. + /// + public WotConversionOutput( + UANodeSet? nodeSet, + ImmutableArray errors, + ExpandedNodeId rootNodeId = default) + { + NodeSet = nodeSet; + Errors = errors.IsDefault ? [] : errors; + RootNodeId = rootNodeId; + } + + /// + /// Gets the produced NodeSet2, or null on failure. + /// + public UANodeSet? NodeSet { get; } + + /// + /// Gets the conversion error messages. + /// + public ImmutableArray Errors { get; } + + /// + /// Gets the root node of the projection (the type a Thing Model + /// materializes or the top-level instance a Thing Description projects), + /// as an absolute whose namespace URI is + /// resolved from the produced NodeSet, or ExpandedNodeId.Null + /// when the document has no identifiable root. + /// + public ExpandedNodeId RootNodeId { get; } + + /// + /// Gets whether the conversion succeeded. + /// + public bool Succeeded => NodeSet is not null && Errors.IsEmpty; + + /// + /// Creates a successful output. + /// + public static WotConversionOutput Success(UANodeSet nodeSet) + { + return new WotConversionOutput( + nodeSet, + [], + WotNodeSetConverter.TrySelectProjectionRoot(nodeSet)); + } + + /// + /// Creates a failed output. + /// + public static WotConversionOutput Failure(params string[] errors) + { + return new WotConversionOutput(null, [.. errors]); + } + } + + /// + /// Converts a stored registry document to a NodeSet2 model. The default + /// implementation delegates to and resolves + /// TM references from the registry snapshot; a test double can substitute a + /// deterministic conversion. + /// + public interface IWotDocumentConverter + { + /// + /// Converts a resource's default document to a NodeSet2 model. + /// + ValueTask ConvertAsync( + WotResource resource, + ReadOnlyMemory content, + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken); + } + + /// + /// The production converter over . + /// + public sealed class WotNodeSetDocumentConverter : IWotDocumentConverter + { + /// + /// Initializes a new converter with the supplied options. + /// + public WotNodeSetDocumentConverter(WotNodeSetConverterOptions? options = null) + { + m_options = options ?? new WotNodeSetConverterOptions(); + } + + /// + public async ValueTask ConvertAsync( + WotResource resource, + ReadOnlyMemory content, + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken) + { + try + { + using var document = WotDocument.Parse(content, m_options); + var resolver = new SnapshotThingResolver(snapshot); + // One resolution context per top-level conversion, seeded from + // the configured converter options, so depth/document/byte + // bounds and cycle detection apply across every link resolved + // while converting this resource. + var resolution = new WotResolutionContext(m_options.ToResolverOptions()); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, m_options, resolver, resolution, cancellationToken).ConfigureAwait(false); + ImmutableArray.Builder errors = ImmutableArray.CreateBuilder(); + foreach (WotDiagnostic diagnostic in result.Diagnostics) + { + if (diagnostic.Severity == WotDiagnosticSeverity.Error) + { + errors.Add(diagnostic.ToString()); + } + } + if (result.Value is null && errors.Count == 0) + { + errors.Add("The document could not be converted to a NodeSet."); + } + if (errors.Count != 0 || result.Value is null) + { + return new WotConversionOutput(null, errors.ToImmutable()); + } + return new WotConversionOutput( + result.Value, + [], + WotNodeSetConverter.TrySelectProjectionRoot(result.Value)); + } + catch (Exception ex) when (ex is System.Text.Json.JsonException or FormatException) + { + return WotConversionOutput.Failure(ex.Message); + } + } + + private readonly WotNodeSetConverterOptions m_options; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/IWotNodeSetContributor.cs b/src/Opc.Ua.WotCon.Server/Materialization/IWotNodeSetContributor.cs new file mode 100644 index 0000000000..ae29f3ef95 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/IWotNodeSetContributor.cs @@ -0,0 +1,79 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Export; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Contributes additional nodes to a converted document before it is materialized into the + /// AddressSpace — typically custom StructureType DataTypes that have no NodeSet to + /// import because they are specific to one controller program. + /// + /// + /// + /// Many industrial protocols expose user-defined types — Rockwell / Studio 5000 UDTs, TIA + /// Portal PLC data types, Beckhoff TwinCAT structured types — that must be generated from the + /// controller's own symbol table at onboarding time. A contributor runs once per resource, + /// after the Thing Description has been converted to a NodeSet and before any variable is + /// created, which is the point at which such a DataType has to exist: a + /// uav:mapByFieldPath mapping into a structured type can only resolve once that type is + /// registered. + /// + /// + /// A document that can already express its types declaratively does not need this seam — the + /// native projection (uav:NodeModel) carries DataType nodes with their + /// DataTypeDefinition directly. This interface is for types that can only be discovered + /// programmatically. + /// + /// + /// Contributors are resolved from dependency injection; registering none leaves conversion + /// unchanged. Implementations must be safe for concurrent calls across resources. + /// + /// + public interface IWotNodeSetContributor + { + /// + /// Contributes nodes for to . + /// + /// The registry resource being materialized. + /// + /// The converted NodeSet, mutated in place. A contributor adds nodes; it must not remove or + /// rewrite nodes produced by the conversion. + /// + /// The cancellation token. + ValueTask ContributeAsync( + WotResource resource, + UANodeSet nodeSet, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/IWotNodeSetResolver.cs b/src/Opc.Ua.WotCon.Server/Materialization/IWotNodeSetResolver.cs new file mode 100644 index 0000000000..5dbf307ac0 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/IWotNodeSetResolver.cs @@ -0,0 +1,80 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Resolves the NodeSet2 for an OPC UA namespace a Thing Description depends on but the server + /// does not already know. + /// + /// + /// + /// Thing Descriptions are uploaded at run time through the standard WoTAssetFileType + /// upload, so the set of namespaces a server will be asked to serve is not known at start-up + /// and static pre-loading is not sufficient. A resolver closes that gap: it is consulted for + /// each unknown namespace, and what it returns is loaded through the server's existing runtime + /// NodeSet support. + /// + /// + /// A document that carries its own model does not need a resolver at all — the + /// uav:nodeSet envelope embeds the NodeSet2 in the Thing Description itself. + /// + /// + /// Resolution is recursive: a resolved NodeSet's own dependencies are resolved the same way. + /// A namespace that cannot be resolved is reported as a diagnostic rather than failing the + /// whole onboarding, so an operator can see exactly what is missing. + /// + /// + /// No implementation ships with the library: resolving a namespace means reaching out to some + /// catalogue — a UA Cloud Library instance, a corporate model repository, a folder on disk — + /// which is a deployment decision. Registering none leaves behaviour unchanged. + /// Implementations must be safe for concurrent calls. + /// + /// + public interface IWotNodeSetResolver + { + /// + /// Attempts to resolve the NodeSet2 for . + /// + /// The namespace URI to resolve. + /// The cancellation token. + /// + /// A readable stream positioned at the start of the NodeSet2 XML, which the caller + /// disposes; or null when this resolver does not know the namespace. Returning + /// null is the expected way to decline — it is not an error. + /// + ValueTask TryResolveAsync( + string namespaceUri, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/IWotProjectionBindingRuntimeFactory.cs b/src/Opc.Ua.WotCon.Server/Materialization/IWotProjectionBindingRuntimeFactory.cs new file mode 100644 index 0000000000..97254f4b4f --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/IWotProjectionBindingRuntimeFactory.cs @@ -0,0 +1,83 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Server.Fluent; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Builds the per-generation OPC UA target-mapping binding runtime for a + /// runtime NodeSet. Injected into , + /// which invokes it from + /// once the generation's NodeSet2 content has been imported, so target + /// mappings are resolved against the freshly materialized predefined nodes. + /// The returned (if any) is owned by that + /// NodeSet generation and is disposed with it. + /// + public interface IWotProjectionBindingRuntimeFactory + { + /// + /// Wires the OPC UA target-mapping bindings declared by + /// onto the freshly imported predefined + /// nodes exposed by . + /// + /// + /// The fluent builder for the node manager generation being activated. + /// + /// + /// The prepared binding plans for the projected closure. Forms without + /// a target mapping, and non-executable forms, are ignored. + /// + /// The cancellation token. + /// + /// The generation-owned binding runtime, or null when no target + /// mapping was wired (for example an empty ). + /// + /// + /// A target mapping is missing, malformed, ambiguous, resolves to the + /// wrong node class, mismatches its declared target type, conflicts + /// with another mapping to the same target, duplicates a read or write + /// mapping, or is declared on an unsupported operation. Structured + /// (uav:mapByFieldPath) validation that depends on the + /// target's structure type being registered — the structure lookup, + /// root instance validation, and per-field path resolution — is + /// deferred past this call; see the class remarks on + /// for why, and for how a + /// first structured read or write fails deterministically instead. + /// + ValueTask CreateAsync( + INodeManagerBuilder builder, + ArrayOf bindingPlans, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/IWotProjectionHost.cs b/src/Opc.Ua.WotCon.Server/Materialization/IWotProjectionHost.cs new file mode 100644 index 0000000000..aef9b80401 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/IWotProjectionHost.cs @@ -0,0 +1,262 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Selects how the previous projection generation is retired after a + /// successful replacement. + /// + public enum WotProjectionRetirementPolicy + { + /// + /// Keep the previous generation alive until its monitored items and + /// requests drain. + /// + Graceful, + + /// + /// Invalidate its monitored items with BadNodeIdUnknown and dispose the + /// previous generation without waiting for drain. + /// + Immediate + } + + /// + /// One NodeSet2 document loaded as a runtime NodeManager source. A projection + /// closure produces one or more of these (TM type NodeSets loaded before the + /// dependent TD instance NodeSet). + /// + public sealed class WotProjectionSource + { + /// + /// Initializes a new projection source. + /// + public WotProjectionSource( + string name, + ImmutableArray modelNamespaceUris, + byte[] nodeSetXml) + { + Name = name ?? throw new ArgumentNullException(nameof(name)); + ModelNamespaceUris = modelNamespaceUris.IsDefault + ? [] : modelNamespaceUris; + NodeSetXml = nodeSetXml ?? throw new ArgumentNullException(nameof(nodeSetXml)); + } + + /// + /// Gets the diagnostic source name. + /// + public string Name { get; } + + /// + /// Gets the model namespace URIs this source owns. + /// + public ImmutableArray ModelNamespaceUris { get; } + + /// + /// Gets the serialized NodeSet2 XML bytes. + /// + public byte[] NodeSetXml { get; } + } + + /// + /// The full set of NodeSet2 sources for one projection closure to be added + /// or shadow-reloaded as a single runtime NodeManager. + /// + public sealed class WotProjectionDocument + { + /// + /// Initializes a new projection document. + /// + public WotProjectionDocument( + string closureKey, + ImmutableArray sources) + : this(closureKey, sources, []) + { + } + + /// + /// Initializes a new projection document that also carries the prepared + /// binding plans for the closure, so the projection host can wire a + /// per-generation binding runtime while it materializes the NodeSet. + /// + public WotProjectionDocument( + string closureKey, + ImmutableArray sources, + ArrayOf bindingPlans) + { + ClosureKey = closureKey ?? throw new ArgumentNullException(nameof(closureKey)); + Sources = sources.IsDefault ? [] : sources; + BindingPlans = bindingPlans; + } + + /// + /// Gets the stable closure key this document projects. + /// + public string ClosureKey { get; } + + /// + /// Gets the ordered NodeSet2 sources. + /// + public ImmutableArray Sources { get; } + + /// + /// Gets the prepared binding plans for the closure's members, in the + /// same order the members were projected. Empty when the coordinator + /// did not prepare any bindings (for example a dry run). + /// + public ArrayOf BindingPlans { get; } + } + + /// + /// Marks the host-specific registration carried by a + /// . Implementations are opaque to the + /// materialization pipeline; only the owning + /// interprets them. + /// + public interface IWotProjectionRegistration + { + /// + /// Gets the stable identifier the host assigned to this registration. It + /// is shared by every generation produced from the same closure and is + /// only used for diagnostics. + /// + Guid Id { get; } + } + + /// + /// An opaque handle to a live projection generation held by the host. It + /// wraps the underlying runtime NodeManager registration and records the + /// materialized root NodeIds and node count. + /// + public sealed class WotProjectionHandle + { + /// + /// Initializes a new projection handle. + /// + public WotProjectionHandle( + string closureKey, + long generation, + IWotProjectionRegistration? registration, + ImmutableArray rootNodeIds, + int materializedNodeCount, + string warning = "") + { + ClosureKey = closureKey ?? string.Empty; + Generation = generation; + Registration = registration; + RootNodeIds = rootNodeIds.IsDefault ? [] : rootNodeIds; + MaterializedNodeCount = materializedNodeCount; + Warning = warning ?? string.Empty; + } + + /// + /// Gets the closure key. + /// + public string ClosureKey { get; } + + /// + /// Gets the projection generation. + /// + public long Generation { get; } + + /// + /// Gets the underlying runtime registration (host-specific). + /// + public IWotProjectionRegistration? Registration { get; } + + /// + /// Gets the materialized root NodeIds. + /// + public ImmutableArray RootNodeIds { get; } + + /// + /// Gets the materialized node count. + /// + public int MaterializedNodeCount { get; } + + /// + /// Gets a non-fatal host warning produced after the replacement generation + /// was committed, for example deferred cleanup of the previous generation. + /// + public string Warning { get; } + } + + /// + /// The seam between the materialization coordinator and the live server's + /// NodeManager lifecycle. The production implementation adds a runtime + /// NodeSet on first activation and shadow-reloads it on update, keeping the + /// stable registry NodeManager separate. A test double records the sequence + /// of add/shadow-reload/remove operations without a running server. + /// + public interface IWotProjectionHost + { + /// + /// Adds a projection for its first activation and returns a handle to the + /// new live generation. + /// + ValueTask AddAsync( + WotProjectionDocument document, + CancellationToken cancellationToken = default); + + /// + /// Shadow-reloads a live projection: new service requests are routed to + /// the replacement generation while the previous generation keeps serving + /// its existing monitored items until they drain. + /// + ValueTask ShadowReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default); + + /// + /// Reloads a live projection and immediately retires the previous + /// generation. Affected data-change monitored items report + /// . + /// + ValueTask ImmediateReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default); + + /// + /// Removes a live projection after its monitored items drain, without + /// disconnecting clients. + /// + ValueTask RemoveAsync( + WotProjectionHandle handle, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/IWotTargetVariableResolver.cs b/src/Opc.Ua.WotCon.Server/Materialization/IWotTargetVariableResolver.cs new file mode 100644 index 0000000000..d0ef538aa0 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/IWotTargetVariableResolver.cs @@ -0,0 +1,166 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Opc.Ua.Server.Fluent; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Resolves the OPC UA target variable an OPC 10101 §6.5.4 target-mapping + /// descriptor declares, against a node manager's freshly imported + /// predefined nodes. Injectable so a host application can supply an + /// alternate resolution strategy (for example one that also consults an + /// external addressing table); is + /// the default, spec-compliant implementation and is always available via + /// direct construction. + /// + public interface IWotTargetVariableResolver + { + /// + /// Resolves the target variable declared by . + /// + /// + /// The fluent builder for the node manager generation whose predefined + /// nodes (including the freshly imported NodeSet2 content) the mapping + /// is resolved against. + /// + /// The target-mapping descriptor to resolve. + /// The resolved target variable. + /// + /// The mapping is missing, malformed, ambiguous, resolves to a node + /// that is not a , or (for a mapping + /// that declares both terms) resolves to a variable whose + /// DataType does not equal the declared target type. + /// + BaseVariableState Resolve(INodeManagerBuilder builder, WotTargetMappingDescriptor mapping); + } + + /// + /// The default . It implements the + /// OPC 10101 §6.5.4 target-mapping resolution rules by reusing the fluent + /// lookup surface (so lookup failures + /// throw the same deterministic + /// statuses the builder already defines for missing, ambiguous, or + /// wrong-node-class lookups): + /// + /// + /// uav:mapToNodeId alone resolves the exact target and requires it + /// to be a . + /// + /// + /// uav:mapToType alone resolves the unique variable whose + /// DataType equals the target type. + /// + /// + /// Both terms resolve the exact target and additionally validate that its + /// DataType equals the declared target type. + /// + /// + /// + public sealed class WotTargetVariableResolver : IWotTargetVariableResolver + { + /// + public BaseVariableState Resolve(INodeManagerBuilder builder, WotTargetMappingDescriptor mapping) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (mapping is null) + { + throw new ArgumentNullException(nameof(mapping)); + } + + bool hasTargetNodeId = !string.IsNullOrWhiteSpace(mapping.TargetNodeId); + bool hasTargetType = !string.IsNullOrWhiteSpace(mapping.TargetTypeNodeId); + + if (!hasTargetNodeId && !hasTargetType) + { + throw ServiceResultException.Create( + StatusCodes.BadNodeIdInvalid, + "The target mapping declares neither 'uav:mapToNodeId' nor 'uav:mapToType'."); + } + + if (hasTargetNodeId) + { + NodeId targetNodeId = ParsePortableNodeId(builder, mapping.TargetNodeId!, "uav:mapToNodeId"); + BaseVariableState variable = builder.Variable(targetNodeId).Node; + + if (hasTargetType) + { + NodeId targetTypeId = ParsePortableNodeId(builder, mapping.TargetTypeNodeId!, "uav:mapToType"); + if (variable.DataType != targetTypeId) + { + throw ServiceResultException.Create( + StatusCodes.BadTypeMismatch, + "Target variable '{0}' has DataType '{1}', which does not match the " + + "declared 'uav:mapToType' target type '{2}'.", + targetNodeId, + variable.DataType, + targetTypeId); + } + } + return variable; + } + + NodeId dataTypeId = ParsePortableNodeId(builder, mapping.TargetTypeNodeId!, "uav:mapToType"); + return builder.VariableFromDataTypeId(dataTypeId).Node; + } + + /// + /// Parses a portable NodeId (including nsu= forms) against the + /// builder's namespace table, translating every parse failure — + /// including a raised by the + /// parser itself — into a deterministic + /// naming the offending + /// term, so callers never need to special-case the parser's own + /// exception shape. + /// + /// + private static NodeId ParsePortableNodeId(INodeManagerBuilder builder, string text, string term) + { + try + { + return ExpandedNodeId.Parse(text, builder.Context.NamespaceUris); + } + catch (Exception ex) when ( + ex is not OperationCanceledException and not OutOfMemoryException) + { + throw ServiceResultException.Create( + StatusCodes.BadNodeIdInvalid, + "'{0}' value '{1}' is not a valid portable NodeId: {2}", + term, + text, + ex.Message); + } + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/LifecycleWotProjectionHost.cs b/src/Opc.Ua.WotCon.Server/Materialization/LifecycleWotProjectionHost.cs new file mode 100644 index 0000000000..ce27a71acf --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/LifecycleWotProjectionHost.cs @@ -0,0 +1,219 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Server; +using Opc.Ua.Server.RuntimeNodeSet; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// The production that projects WoT closures + /// onto the live server through the public NodeManager lifecycle. First + /// activation uses + /// ; + /// updates use + /// , + /// so the previous generation keeps serving its existing monitored items + /// until they drain. The stable WoT registry NodeManager is never touched. + /// + public sealed class LifecycleWotProjectionHost : IWotProjectionHost + { + /// + /// Initializes a new host over the supplied lifecycle. + /// + /// The node manager lifecycle to project onto. + /// + /// The optional projection binding runtime factory. When supplied, each + /// runtime NodeSet generation created for a document that carries + /// prepared owns its own + /// binding runtime: it is created after the NodeSet is imported (via + /// ) and disposed with + /// the generation. When null, no binding runtime is wired (the + /// NodeSet is materialized as data only). + /// + public LifecycleWotProjectionHost( + INodeManagerLifecycle lifecycle, + IWotProjectionBindingRuntimeFactory? runtimeFactory = null) + { + m_lifecycle = lifecycle ?? throw new ArgumentNullException(nameof(lifecycle)); + m_runtimeFactory = runtimeFactory; + } + + /// + public async ValueTask AddAsync( + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + RuntimeNodeSetOptions options = BuildOptions(document); + NodeManagerRegistration registration = await m_lifecycle + .AddRuntimeNodeSetAsync(options, cancellationToken) + .ConfigureAwait(false); + return new WotProjectionHandle( + document.ClosureKey, + registration.Generation, + new NodeManagerProjectionRegistration(registration), + [], + 0); + } + + /// + public async ValueTask ShadowReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + if (current?.Registration is not NodeManagerProjectionRegistration wrapper) + { + // No live registration to reload; fall back to a fresh add. + return await AddAsync(document, cancellationToken).ConfigureAwait(false); + } + RuntimeNodeSetOptions options = BuildOptions(document); + NodeManagerRegistration next; + string warning = string.Empty; + try + { + next = await m_lifecycle + .ShadowReloadRuntimeNodeSetAsync(wrapper.Registration, options, cancellationToken) + .ConfigureAwait(false); + } + catch (NodeManagerReloadCommittedException ex) + { + next = ex.Registration; + warning = "The replacement is active, but prior-generation cleanup is pending: " + + ex.Message; + } + return new WotProjectionHandle( + document.ClosureKey, + next.Generation, + new NodeManagerProjectionRegistration(next), + [], + 0, + warning); + } + + /// + public async ValueTask ImmediateReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + if (current?.Registration is not NodeManagerProjectionRegistration wrapper) + { + return await AddAsync(document, cancellationToken).ConfigureAwait(false); + } + RuntimeNodeSetOptions options = BuildOptions(document); + NodeManagerRegistration next; + string warning = string.Empty; + try + { + next = await m_lifecycle + .ImmediateReloadRuntimeNodeSetAsync(wrapper.Registration, options, cancellationToken) + .ConfigureAwait(false); + } + catch (NodeManagerReloadCommittedException ex) + { + next = ex.Registration; + warning = "The replacement is active, but prior-generation cleanup is pending: " + + ex.Message; + } + return new WotProjectionHandle( + document.ClosureKey, + next.Generation, + new NodeManagerProjectionRegistration(next), + [], + 0, + warning); + } + + /// + public async ValueTask RemoveAsync( + WotProjectionHandle handle, + CancellationToken cancellationToken = default) + { + if (handle?.Registration is NodeManagerProjectionRegistration wrapper) + { + await m_lifecycle + .RemoveAsync(wrapper.Registration, cancellationToken) + .ConfigureAwait(false); + } + } + + private RuntimeNodeSetOptions BuildOptions(WotProjectionDocument document) + { + var sources = new RuntimeNodeSetSource[document.Sources.Length]; + for (int i = 0; i < document.Sources.Length; i++) + { + WotProjectionSource source = document.Sources[i]; + byte[] xml = source.NodeSetXml; + var uris = new ArrayOf(source.ModelNamespaceUris.ToArray()); + sources[i] = RuntimeNodeSetSource.FromStream( + source.Name, + _ => new ValueTask(new MemoryStream(xml, writable: false)), + uris); + } + var options = new RuntimeNodeSetOptions + { + Sources = new ArrayOf(sources), + AllowLifecycleFromRequestCallback = true + }; + if (m_runtimeFactory is { } runtimeFactory) + { + ArrayOf bindingPlans = document.BindingPlans; + options.ConfigureAsync = (builder, cancellationToken) + => runtimeFactory.CreateAsync(builder, bindingPlans, cancellationToken); + } + return options; + } + + private readonly INodeManagerLifecycle m_lifecycle; + private readonly IWotProjectionBindingRuntimeFactory? m_runtimeFactory; + + /// + /// Carries the lifecycle registration owned by this host through the + /// host-agnostic . + /// + private sealed class NodeManagerProjectionRegistration : IWotProjectionRegistration + { + public NodeManagerProjectionRegistration(NodeManagerRegistration registration) + { + Registration = registration; + } + + public Guid Id => Registration.Id; + + public NodeManagerRegistration Registration { get; } + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotBindingChannelSlot.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotBindingChannelSlot.cs new file mode 100644 index 0000000000..2497b06e2f --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotBindingChannelSlot.cs @@ -0,0 +1,152 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Lazily opens and caches a single live channel for one compiled form, + /// shared by every reader/writer wired against that form for the lifetime + /// of a projection binding runtime generation. Concurrent first use opens + /// the channel exactly once; a failed open is evicted immediately so a + /// later call can retry. Disposing the slot disposes the channel only if + /// it was opened successfully — a faulted open leaves nothing to dispose + /// and never re-surfaces the original open failure. Once disposed, the + /// slot never opens another channel: racing with or + /// occurring after either observes the channel + /// already claimed for disposal or is rejected outright, so no channel + /// this slot opens can ever escape disposal. + /// + internal sealed class WotBindingChannelSlot + { + /// + /// Initializes a new channel slot for a compiled form. + /// + public WotBindingChannelSlot(WotCompiledForm form, IWotBindingChannelFactory channelFactory) + { + m_form = form ?? throw new ArgumentNullException(nameof(form)); + m_channelFactory = channelFactory ?? throw new ArgumentNullException(nameof(channelFactory)); + } + + /// + /// Gets the shared channel, opening it on first use. The channel open + /// itself is not bound to any single caller's cancellation token — it + /// is a generation-scoped resource shared by every reader/writer wired + /// against the same compiled form, so one caller cancelling must not + /// tear down the open for concurrent callers. + /// + /// + /// The slot has already been disposed, or is disposed concurrently + /// before this call is able to reuse or start an open. + /// + public ValueTask GetAsync(CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + Task task; + lock (m_gate) + { + if (m_disposed) + { + throw new ObjectDisposedException(nameof(WotBindingChannelSlot)); + } + task = m_channelTask ??= OpenAsync(); + } + return WaitAsync(task); + } + + /// + /// Marks the slot disposed so no later call can + /// start a new open, then disposes the cached channel if one was + /// successfully opened (including one still opening concurrently — the + /// disposal awaits it and disposes the result). A faulted or + /// never-started open has no resource to release and is silently + /// ignored so cleanup never re-reports the original open failure. + /// Safe to call more than once; only the first call finds a channel to + /// dispose. + /// + public async ValueTask DisposeAsync() + { + Task? task; + lock (m_gate) + { + task = m_channelTask; + m_channelTask = null; + m_disposed = true; + } + if (task is null) + { + return; + } + IWotBindingChannel channel; + try + { + channel = await task.ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + return; + } + await channel.DisposeAsync().ConfigureAwait(false); + } + + private Task OpenAsync() + { + return m_channelFactory.OpenChannelAsync(m_form, CancellationToken.None).AsTask(); + } + + private async ValueTask WaitAsync(Task task) + { + try + { + return await task.ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + lock (m_gate) + { + if (ReferenceEquals(m_channelTask, task)) + { + m_channelTask = null; + } + } + throw; + } + } + + private readonly WotCompiledForm m_form; + private readonly IWotBindingChannelFactory m_channelFactory; + private readonly Lock m_gate = new(); + private Task? m_channelTask; + private bool m_disposed; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotDependencyGraph.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotDependencyGraph.cs new file mode 100644 index 0000000000..1d6e1861eb --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotDependencyGraph.cs @@ -0,0 +1,565 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text.Json; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// One resolved (or unresolved) dependency edge between two documents. + /// + public sealed class WotDependency + { + /// + /// Initializes a new dependency edge. + /// + public WotDependency( + string sourceXid, + string targetHref, + string? targetXid, + string refType, + bool resolved) + { + SourceXid = sourceXid; + TargetHref = targetHref; + TargetXid = targetXid; + RefType = refType; + Resolved = resolved; + } + + /// + /// Gets the xid of the dependent document. + /// + public string SourceXid { get; } + + /// + /// Gets the raw href/URI of the dependency. + /// + public string TargetHref { get; } + + /// + /// Gets the xid of the resolved target document, if any. + /// + public string? TargetXid { get; } + + /// + /// Gets the dependency kind (tm:extends / tm:ref / links.rel=type). + /// + public string RefType { get; } + + /// + /// Gets whether the dependency resolved to a stored document. + /// + public bool Resolved { get; } + } + + /// + /// A dependency closure: a set of resources that must be materialized + /// together, with Thing Models topologically ordered before the Thing + /// Descriptions that depend on them. A closure is the default unit of + /// atomicity for a refresh. + /// + public sealed class WotDependencyClosure + { + internal WotDependencyClosure( + string key, + ImmutableArray members, + ImmutableArray orderedResources, + ImmutableArray dependencies, + ImmutableArray diagnostics, + bool hasCycle, + bool hasMissingDependency) + { + Key = key; + Members = members; + OrderedResources = orderedResources; + Dependencies = dependencies; + Diagnostics = diagnostics; + HasCycle = hasCycle; + HasMissingDependency = hasMissingDependency; + } + + /// + /// Gets the stable closure key (sorted member xids). + /// + public string Key { get; } + + /// + /// Gets every member of the closure (populated even on a cycle). + /// + public ImmutableArray Members { get; } + + /// + /// Gets the resources in topological (dependency-first) order. + /// + public ImmutableArray OrderedResources { get; } + + /// + /// Gets the dependency edges within the closure. + /// + public ImmutableArray Dependencies { get; } + + /// + /// Gets the diagnostics for the closure. + /// + public ImmutableArray Diagnostics { get; } + + /// + /// Gets whether the closure contains a dependency cycle. + /// + public bool HasCycle { get; } + + /// + /// Gets whether the closure has an unresolved dependency. + /// + public bool HasMissingDependency { get; } + + /// + /// Gets whether the closure is projectable (no cycle, no missing dependency). + /// + public bool IsProjectable => !HasCycle && !HasMissingDependency; + } + + /// + /// Builds the TD/TM dependency graph from a registry snapshot and partitions + /// it into deterministic dependency closures. References are extracted from + /// links (rel = tm:extends / type / tm:submodel), a top-level + /// tm:extends, and tm:ref pointers, then resolved against the + /// registry by Thing id, xid, or resource id. + /// + public static class WotDependencyGraph + { + /// + /// Resolves a WoT reference href to a stored resource, or null. + /// + public static WotResource? Resolve(WotRegistrySnapshot snapshot, string href) + { + if (snapshot is null || string.IsNullOrWhiteSpace(href)) + { + return null; + } + string trimmed = TrimFragment(href); + // Prefer Thing Models, then any resource, matching by thing id, xid or resource id. + return MatchIn(snapshot.ResourcesOfKind(WoTDocumentKindEnum.ThingModel), trimmed) + ?? MatchIn(snapshot.AllResources(), trimmed); + } + + /// + /// Extracts the outgoing dependency references of a single document. + /// + public static IReadOnlyList<(string Href, string RefType)> ExtractReferences( + ReadOnlyMemory document, + int maxJsonDepth) + { + var references = new List<(string, string)>(); + try + { + var options = new JsonDocumentOptions { MaxDepth = maxJsonDepth }; + using var json = JsonDocument.Parse(document, options); + JsonElement root = json.RootElement; + if (root.ValueKind != JsonValueKind.Object) + { + return references; + } + CollectLinks(root, references); + CollectExtends(root, references); + CollectTmRefs(root, references, 0, maxJsonDepth); + } + catch (JsonException) + { + // A document that cannot be parsed contributes no edges; its own + // projection reports the parse failure. + } + return references; + } + + /// + /// Builds the dependency closures for the selected resources. Selected + /// resources are grouped into weakly-connected components (so a shared + /// Thing Model lands in a single closure), then each component is + /// topologically ordered. + /// + public static ImmutableArray BuildClosures( + WotRegistrySnapshot snapshot, + IReadOnlyCollection selected, + int maxJsonDepth) + { + if (selected.Count == 0) + { + return []; + } + + // Expand the selection to include resolvable transitive dependencies. + var byXid = new Dictionary(StringComparer.Ordinal); + var queue = new Queue(); + foreach (WotResource resource in selected) + { + if (!byXid.ContainsKey(resource.Xid)) + { + byXid[resource.Xid] = resource; + queue.Enqueue(resource); + } + } + + var edges = new Dictionary>(StringComparer.Ordinal); + while (queue.Count > 0) + { + WotResource resource = queue.Dequeue(); + var list = new List(); + edges[resource.Xid] = list; + WotResourceVersion? version = resource.DefaultVersion; + if (version is null) + { + continue; + } + foreach ((string href, string refType) in ExtractReferences( + version.Content, maxJsonDepth)) + { + WotResource? target = Resolve(snapshot, href); + list.Add(new WotDependency( + resource.Xid, href, target?.Xid, refType, target is not null)); + if (target is not null && !byXid.ContainsKey(target.Xid)) + { + byXid[target.Xid] = target; + queue.Enqueue(target); + } + } + } + + // Weakly-connected components via union-find over resolved edges. + var parent = new Dictionary(StringComparer.Ordinal); + foreach (string xid in byXid.Keys) + { + parent[xid] = xid; + } + foreach (List list in edges.Values) + { + foreach (WotDependency edge in list) + { + if (edge.Resolved && + edge.TargetXid is not null && + byXid.ContainsKey(edge.TargetXid)) + { + Union(parent, edge.SourceXid, edge.TargetXid); + } + } + } + + var components = new Dictionary>(StringComparer.Ordinal); + foreach (KeyValuePair entry in byXid) + { + string root = Find(parent, entry.Key); + if (!components.TryGetValue(root, out List? members)) + { + members = []; + components[root] = members; + } + members.Add(entry.Value); + } + + ImmutableArray.Builder closures = + ImmutableArray.CreateBuilder(); + foreach (List members in components.Values) + { + closures.Add(BuildClosure(members, edges, byXid)); + } + // Deterministic order by closure key. + return [.. closures.OrderBy(c => c.Key, StringComparer.Ordinal)]; + } + + private static WotDependencyClosure BuildClosure( + List members, + Dictionary> edges, + Dictionary byXid) + { + var memberXids = new HashSet(members.Select(m => m.Xid), StringComparer.Ordinal); + ImmutableArray.Builder dependencies = ImmutableArray.CreateBuilder(); + ImmutableArray.Builder diagnostics = ImmutableArray.CreateBuilder(); + bool missing = false; + + // Adjacency (source depends on target): target must be ordered first. + var adjacency = new Dictionary>(StringComparer.Ordinal); + foreach (WotResource member in members) + { + adjacency[member.Xid] = []; + } + foreach (WotResource member in members) + { + if (!edges.TryGetValue(member.Xid, out List? list)) + { + continue; + } + foreach (WotDependency edge in list) + { + dependencies.Add(edge); + if (!edge.Resolved) + { + missing = true; + diagnostics.Add( + $"Unresolved {edge.RefType} dependency '{edge.TargetHref}' " + + $"referenced by '{edge.SourceXid}'."); + } + else if (edge.TargetXid is not null && memberXids.Contains(edge.TargetXid)) + { + adjacency[member.Xid].Add(edge.TargetXid); + } + } + } + + (ImmutableArray ordered, bool hasCycle) = TopologicalSort( + members, adjacency, byXid); + if (hasCycle) + { + diagnostics.Add( + "Dependency cycle detected among: " + + string.Join(", ", members.Select(m => m.Xid).OrderBy(x => x, StringComparer.Ordinal))); + } + + string key = string.Join( + "|", members.Select(m => m.Xid).OrderBy(x => x, StringComparer.Ordinal)); + var memberArray = members + .OrderBy(m => m.Xid, StringComparer.Ordinal) + .ToImmutableArray(); + return new WotDependencyClosure( + key, + memberArray, + ordered, + dependencies.ToImmutable(), + diagnostics.ToImmutable(), + hasCycle, + missing); + } + + private static (ImmutableArray Ordered, bool HasCycle) TopologicalSort( + List members, + Dictionary> adjacency, + Dictionary byXid) + { + // 0 = unvisited, 1 = in-progress, 2 = done. + var color = new Dictionary(StringComparer.Ordinal); + var ordered = new List(); + bool hasCycle = false; + + // Deterministic iteration order. + IEnumerable roots = members + .Select(m => m.Xid) + .OrderBy(x => x, StringComparer.Ordinal); + + void Visit(string xid) + { + if (hasCycle) + { + return; + } + color.TryGetValue(xid, out int state); + if (state == 2) + { + return; + } + if (state == 1) + { + hasCycle = true; + return; + } + color[xid] = 1; + foreach (string dependency in adjacency[xid] + .OrderBy(x => x, StringComparer.Ordinal)) + { + Visit(dependency); + if (hasCycle) + { + return; + } + } + color[xid] = 2; + ordered.Add(byXid[xid]); + } + + foreach (string root in roots) + { + Visit(root); + } + + return hasCycle + ? (ImmutableArray.Empty, true) + : ([.. ordered], false); + } + + private static WotResource? MatchIn(IEnumerable resources, string href) + { + foreach (WotResource resource in resources) + { + if (string.Equals(resource.ThingId, href, StringComparison.Ordinal) || + string.Equals(resource.Xid, href, StringComparison.Ordinal) || + string.Equals(RegistryUri(resource), href, StringComparison.Ordinal) || + string.Equals(resource.ResourceId, href, StringComparison.Ordinal) || + href.EndsWith("/" + resource.ResourceId, StringComparison.Ordinal)) + { + return resource; + } + } + return null; + } + + private static string RegistryUri(WotResource resource) + { + return $"urn:wot:{resource.GroupId}/{resource.ResourceId}"; + } + + private static string TrimFragment(string href) + { + int hash = href.AsSpan().IndexOf('#'); + return hash >= 0 ? href[..hash] : href; + } + + private static void CollectLinks( + JsonElement root, List<(string, string)> references) + { + if (!root.TryGetProperty("links", out JsonElement links) || + links.ValueKind != JsonValueKind.Array) + { + return; + } + foreach (JsonElement link in links.EnumerateArray()) + { + if (link.ValueKind != JsonValueKind.Object || + !link.TryGetProperty("href", out JsonElement hrefElement) || + hrefElement.ValueKind != JsonValueKind.String) + { + continue; + } + string rel = link.TryGetProperty("rel", out JsonElement relElement) && + relElement.ValueKind == JsonValueKind.String + ? relElement.GetString() ?? string.Empty + : string.Empty; + if (rel is "tm:extends" or "type" or "tm:submodel" or "collection" or "item") + { + references.Add((hrefElement.GetString() ?? string.Empty, rel)); + } + } + } + + private static void CollectExtends( + JsonElement root, List<(string, string)> references) + { + if (!root.TryGetProperty("tm:extends", out JsonElement extends)) + { + return; + } + switch (extends.ValueKind) + { + case JsonValueKind.String: + references.Add((extends.GetString() ?? string.Empty, "tm:extends")); + break; + case JsonValueKind.Array: + foreach (JsonElement item in extends.EnumerateArray()) + { + if (item.ValueKind == JsonValueKind.String) + { + references.Add((item.GetString() ?? string.Empty, "tm:extends")); + } + else if (item.ValueKind == JsonValueKind.Object && + item.TryGetProperty("href", out JsonElement href) && + href.ValueKind == JsonValueKind.String) + { + references.Add((href.GetString() ?? string.Empty, "tm:extends")); + } + } + break; + } + } + + private static void CollectTmRefs( + JsonElement element, + List<(string, string)> references, + int depth, + int maxDepth) + { + if (depth > maxDepth) + { + return; + } + switch (element.ValueKind) + { + case JsonValueKind.Object: + foreach (JsonProperty property in element.EnumerateObject()) + { + if (string.Equals(property.Name, "tm:ref", StringComparison.Ordinal) && + property.Value.ValueKind == JsonValueKind.String) + { + references.Add((property.Value.GetString() ?? string.Empty, "tm:ref")); + } + else + { + CollectTmRefs(property.Value, references, depth + 1, maxDepth); + } + } + break; + case JsonValueKind.Array: + foreach (JsonElement item in element.EnumerateArray()) + { + CollectTmRefs(item, references, depth + 1, maxDepth); + } + break; + } + } + + private static string Find(Dictionary parent, string node) + { + string root = node; + while (!string.Equals(parent[root], root, StringComparison.Ordinal)) + { + root = parent[root]; + } + // Path compression. + while (!string.Equals(parent[node], root, StringComparison.Ordinal)) + { + string next = parent[node]; + parent[node] = root; + node = next; + } + return root; + } + + private static void Union(Dictionary parent, string a, string b) + { + string rootA = Find(parent, a); + string rootB = Find(parent, b); + if (!string.Equals(rootA, rootB, StringComparison.Ordinal)) + { + parent[rootB] = rootA; + } + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotMaterializationCoordinator.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotMaterializationCoordinator.cs new file mode 100644 index 0000000000..03c63cbe47 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotMaterializationCoordinator.cs @@ -0,0 +1,1239 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Export; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Coordinates projecting registry documents into the AddressSpace. It parses + /// and validates each document with , builds the TD/TM + /// dependency closures, converts each closure to one or more NodeSet2 + /// documents and projects them through the + /// (runtime NodeSet Add for first activation, ShadowReload for updates). The + /// stable registry NodeManager is kept separate. Independent closures commit + /// independently; a failed or invalid closure retains its previous active + /// generation. An unchanged closure (same digest, options and binder version) + /// returns and emits no model change. + /// + public sealed class WotMaterializationCoordinator : IDisposable + { + /// + /// Initializes a new coordinator. + /// + public WotMaterializationCoordinator( + IWotRegistryService registry, + IWotProjectionHost projectionHost, + IWotBinderRegistry? binderRegistry = null, + WotNodeSetConverterOptions? converterOptions = null, + IWotDocumentConverter? documentConverter = null, + IEnumerable? nodeSetContributors = null, + IWotNodeSetResolver? nodeSetResolver = null) + { + m_registry = registry ?? throw new ArgumentNullException(nameof(registry)); + m_host = projectionHost ?? throw new ArgumentNullException(nameof(projectionHost)); + m_binders = binderRegistry ?? NullWotBinderRegistry.Instance; + m_converterOptions = converterOptions ?? new WotNodeSetConverterOptions(); + m_converter = documentConverter + ?? new WotNodeSetDocumentConverter(m_converterOptions); + m_nodeSetContributors = nodeSetContributors is null + ? [] + : [.. nodeSetContributors]; + m_nodeSetResolver = nodeSetResolver; + } + + /// + /// Raised for each materialization event (resource / validation / load / refresh). + /// + public event EventHandler? Event; + + /// + /// Gets the current refresh generation. + /// + public uint Generation => m_generation; + + /// + /// Refreshes (re-projects) the registry into the AddressSpace and returns + /// the detailed result. + /// + /// + public async ValueTask RefreshAsync( + WotRefreshRequest request, + CancellationToken cancellationToken = default) + { + if (request is null) + { + throw new ArgumentNullException(nameof(request)); + } + + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + DateTime start = DateTime.UtcNow; + WotRegistrySnapshot snapshot = m_registry.Current; + + if (request.ExpectedGeneration != 0 && + request.ExpectedGeneration != (uint)snapshot.Generation) + { + return RejectedResult(request, snapshot, start); + } + + bool dryRun = request.Options?.DryRun ?? false; + bool force = request.Options?.Force ?? false; + bool strict = StrictBindings; + HashSet selectedXids = ResolveSelection(snapshot, request.Selection); + + var enabled = snapshot.AllResources() + .Where(r => r.Enabled && r.DefaultVersion is not null) + .ToList(); + ImmutableArray closures = + WotDependencyGraph.BuildClosures( + snapshot, enabled, m_converterOptions.MaxJsonDepth); + + var targetKeys = new HashSet( + closures.Select(c => c.Key), StringComparer.Ordinal); + + uint newGeneration = ++m_generation; + ImmutableArray.Builder results = + ImmutableArray.CreateBuilder(); + var projections = new List(); + int succeeded = 0; + int unchanged = 0; + int failed = 0; + int skipped = 0; + int retired = 0; + + // Retire tracked closures no longer desired (deleted / disabled / + // membership changed) after their monitored items drain. + retired += await ReconcileRetirementsAsync( + targetKeys, cancellationToken).ConfigureAwait(false); + + foreach (WotDependencyClosure closure in closures) + { + cancellationToken.ThrowIfCancellationRequested(); + bool inScope = selectedXids.Count == 0 || + closure.OrderedResources.Any(r => selectedXids.Contains(r.Xid)) || + MembersOf(closure).Any(r => selectedXids.Contains(r.Xid)); + + ClosureOutcome outcome = await ProcessClosureAsync( + snapshot, closure, newGeneration, force && inScope, + dryRun, strict, cancellationToken).ConfigureAwait(false); + + foreach (WoTResourceLoadResultDataType result in outcome.Results) + { + string resultXid = result.Xid ?? string.Empty; + if (selectedXids.Count != 0 && !selectedXids.Contains(resultXid)) + { + continue; + } + results.Add(result); + switch (result.Outcome) + { + case WoTOutcomeEnum.Success: + case WoTOutcomeEnum.Warning: + succeeded++; + break; + case WoTOutcomeEnum.Unchanged: + unchanged++; + break; + case WoTOutcomeEnum.Skipped: + skipped++; + break; + default: + failed++; + break; + } + } + projections.AddRange(outcome.Projections); + } + + if (!dryRun && projections.Count > 0) + { + await m_registry.ApplyProjectionResultsAsync( + projections, cancellationToken).ConfigureAwait(false); + } + + WoTOutcomeEnum overall = failed > 0 + ? (succeeded > 0 ? WoTOutcomeEnum.Warning : WoTOutcomeEnum.Failed) + : (succeeded > 0 ? WoTOutcomeEnum.Success : WoTOutcomeEnum.Unchanged); + + var summary = new WoTRefreshSummaryDataType + { + RequestId = request.RequestId ?? string.Empty, + Generation = dryRun ? 0 : newGeneration, + Outcome = overall, + Atomicity = request.Options?.Atomicity ?? WoTAtomicityEnum.PerClosure, + StartTime = start, + EndTime = DateTime.UtcNow, + Total = (uint)results.Count, + Succeeded = (uint)succeeded, + Unchanged = (uint)unchanged, + Failed = (uint)failed, + Skipped = (uint)skipped, + Retired = (uint)retired + }; + + RaiseEvent(new WotMaterializationEventArgs( + WotMaterializationEventKind.RefreshCompleted) + { + Generation = newGeneration, + RequestId = request.RequestId ?? string.Empty, + Outcome = overall, + Summary = summary + }); + + return new WotRefreshResult( + summary, results.ToImmutable(), dryRun ? 0u : newGeneration); + } + finally + { + m_mutex.Release(); + } + } + + /// + /// Removes all live projections (used during NodeManager shutdown). + /// + public async ValueTask RemoveAllAsync(CancellationToken cancellationToken = default) + { + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + foreach (ClosureState state in m_closures.Values) + { + // Deactivate bindings before removing the projection (before + // retirement / unload), then release the projection handle. + foreach (WotBindingPlan plan in state.BindingPlans) + { + await m_binders.DeactivateAsync(plan, cancellationToken) + .ConfigureAwait(false); + } + if (state.Handle is not null) + { + await m_host.RemoveAsync(state.Handle, cancellationToken) + .ConfigureAwait(false); + } + } + m_closures.Clear(); + } + finally + { + m_mutex.Release(); + } + } + + /// + /// Gets or sets whether unsupported forms fail a strict closure. + /// + public bool StrictBindings { get; set; } + + /// + /// Gets or sets how previous projection generations are retired after a + /// successful version switch. + /// + public WotProjectionRetirementPolicy RetirementPolicy { get; set; } = + WotProjectionRetirementPolicy.Graceful; + + /// + /// Gets the binding capability snapshots advertised by the registered + /// binders. These populate the registry SelectedBindings node and + /// contribute to refresh unchanged-detection. + /// + public IReadOnlyList BindingCapabilities => m_binders.Capabilities; + + /// + /// Gets or sets the live server namespace table used to resolve a + /// projection's recorded root into a + /// concrete server NodeId after its owning namespace is registered by + /// the projection host. When null, materialized root NodeIds are + /// not reported. + /// + public NamespaceTable? ServerNamespaceUris { get; set; } + + /// + /// Releases the mutex used to serialise refreshes. + /// + public void Dispose() + { + m_mutex.Dispose(); + } + + private static ByteString DigestOf(WotResource resource) + { + return (ByteString)(resource.DefaultVersion?.Digest ?? []); + } + + private async ValueTask ProcessClosureAsync( + WotRegistrySnapshot snapshot, + WotDependencyClosure closure, + uint generation, + bool force, + bool dryRun, + bool strict, + CancellationToken cancellationToken) + { + ImmutableArray.Builder results = + ImmutableArray.CreateBuilder(); + var projections = new List(); + IReadOnlyList members = MembersOf(closure); + + // Unprojectable closure: cycle or missing dependency. Retain the + // previous active generation and mark members failed. + if (!closure.IsProjectable) + { + WoTPhaseEnum phase = closure.HasMissingDependency + ? WoTPhaseEnum.DependencyResolution + : WoTPhaseEnum.DependencyResolution; + string reason = string.Join("; ", closure.Diagnostics); + foreach (WotResource member in members) + { + results.Add(FailResult(member, generation, phase, reason)); + projections.Add(FailProjection(member, reason)); + RaiseLoadFailure(member, generation, reason); + } + return new ClosureOutcome(results.ToImmutable(), projections); + } + + // Project in topological (dependency-first) order. + members = closure.OrderedResources; + + byte[] aggregateDigest = ComputeAggregateDigest(members); + m_closures.TryGetValue(closure.Key, out ClosureState? tracked); + + // Unchanged: same digest/options/binder version, and not forced. + if (tracked?.Handle is not null && + !force && + WotContentDigest.Equal(tracked.AggregateDigest, aggregateDigest)) + { + foreach (WotResource member in members) + { + results.Add(UnchangedResult(member, tracked.Generation)); + } + return new ClosureOutcome(results.ToImmutable(), projections); + } + + // Convert every member to a NodeSet2 source in dependency order. + ImmutableArray.Builder sources = ImmutableArray.CreateBuilder(); + var perMemberNodeCount = new Dictionary(StringComparer.Ordinal); + var perMemberRoot = new Dictionary(StringComparer.Ordinal); + var bindingPlans = new List(); + bool degraded = false; + var requiredNamespaces = new HashSet(StringComparer.Ordinal); + var ownedNamespaces = new HashSet(StringComparer.Ordinal); + + foreach (WotResource member in members) + { + WotResourceVersion? version = member.DefaultVersion; + if (version is null) + { + const string reason = "Resource has no default version."; + results.Add(FailResult(member, generation, WoTPhaseEnum.Fetch, reason)); + projections.Add(FailProjection(member, reason)); + RaiseLoadFailure(member, generation, reason); + return new ClosureOutcome(results.ToImmutable(), projections); + } + + (UANodeSet? nodeSet, ExpandedNodeId root, string? conversionError) = + await TryConvertAsync(member, snapshot, cancellationToken) + .ConfigureAwait(false); + if (nodeSet is not null && m_nodeSetContributors.Length > 0) + { + // Contributors run after conversion and before any variable is created, which + // is when a programmatically discovered DataType (a controller UDT, say) has to + // exist for a uav:mapByFieldPath mapping to resolve against it. + foreach (IWotNodeSetContributor contributor in m_nodeSetContributors) + { + await contributor + .ContributeAsync(member, nodeSet, cancellationToken) + .ConfigureAwait(false); + } + } + if (nodeSet is null) + { + WoTValidationOutcomeDataType validation = FormatFailure(conversionError); + results.Add(FailResult( + member, generation, WoTPhaseEnum.FormatValidation, conversionError)); + projections.Add(FailProjection(member, conversionError, validation)); + RaiseValidationFailure(member, generation, validation, conversionError); + return new ClosureOutcome(results.ToImmutable(), projections); + } + + WotBindingPlan plan = m_binders.Prepare(BuildPlanRequest(member, version)); + bindingPlans.Add(plan); + if (!plan.FullySupported) + { + if (strict) + { + const string reason = "Unsupported binding forms in a strict closure."; + results.Add(FailResult( + member, generation, WoTPhaseEnum.Projection, reason)); + projections.Add(FailProjection(member, reason)); + RaiseBindingFailure(member, reason); + return new ClosureOutcome(results.ToImmutable(), projections); + } + degraded = true; + RaiseBindingFailure(member, + "Unsupported binding forms materialized as degraded nodes."); + } + else if (plan.HasNonExecutableForms) + { + // A validated plan whose binding has no runtime executor (for + // example a planner-only protocol): materialize the nodes but + // flag the closure as degraded so callers know they cannot be + // driven yet. + degraded = true; + } + + byte[] xml = SerializeNodeSet(nodeSet); + perMemberNodeCount[member.Xid] = nodeSet.Items?.Length ?? 0; + if (!root.IsNull) + { + perMemberRoot[member.Xid] = root; + } + sources.Add(new WotProjectionSource( + member.ResourceId, OwnedModelUris(nodeSet), xml)); + CollectRequiredNamespaces(nodeSet, requiredNamespaces, ownedNamespaces); + } + + // Resolve any companion-specification namespace the closure depends on that neither the + // closure itself nor the server already provides. Resolved models are prepended to the + // sources so they materialize before the documents that reference them. A namespace + // that stays unresolved is reported, never silently dropped: the projection then fails + // with a message naming exactly what is missing. + (ImmutableArray resolved, ImmutableArray unresolved) = + await ResolveDependencyModelsAsync( + requiredNamespaces, ownedNamespaces, cancellationToken) + .ConfigureAwait(false); + if (!resolved.IsDefaultOrEmpty) + { + sources.InsertRange(0, resolved); + } + if (!unresolved.IsDefaultOrEmpty) + { + degraded = true; + foreach (WotResource member in members) + { + RaiseBindingFailure( + member, + "Unresolved dependency namespace(s): " + string.Join(", ", unresolved)); + } + } + + if (dryRun) + { + foreach (WotResource member in members) + { + results.Add(new WoTResourceLoadResultDataType + { + Xid = member.Xid, + GroupId = member.GroupId, + ResourceId = member.ResourceId, + VersionId = member.DefaultVersionId ?? string.Empty, + Kind = member.Kind, + Outcome = degraded ? WoTOutcomeEnum.Warning : WoTOutcomeEnum.Success, + Phase = WoTPhaseEnum.Projection, + LoadState = member.LoadState, + Generation = 0, + MaterializedNodeCount = (uint)(perMemberNodeCount.TryGetValue( + member.Xid, out int c) ? c : 0), + ContentDigest = DigestOf(member), + Message = "Dry run; no projection committed." + }); + } + return new ClosureOutcome(results.ToImmutable(), projections); + } + + var document = new WotProjectionDocument( + closure.Key, sources.ToImmutable(), bindingPlans.ToArrayOf()); + WotProjectionHandle handle; + try + { + if (tracked?.Handle is null) + { + handle = await m_host.AddAsync(document, cancellationToken) + .ConfigureAwait(false); + } + else if (RetirementPolicy == WotProjectionRetirementPolicy.Immediate) + { + handle = await m_host.ImmediateReloadAsync( + tracked.Handle, document, cancellationToken).ConfigureAwait(false); + } + else + { + handle = await m_host.ShadowReloadAsync( + tracked.Handle, document, cancellationToken).ConfigureAwait(false); + } + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + // Projection failed: retain the previous active generation and its + // tracked binding plans. The shadow switch never happened, so the + // old plans remain active and no deactivation is performed + // (rollback: old plans survive when the new switch fails). + foreach (WotResource member in members) + { + results.Add(FailResult( + member, generation, WoTPhaseEnum.Activation, ex.Message)); + projections.Add(FailProjection(member, ex.Message)); + RaiseLoadFailure(member, generation, ex.Message); + } + return new ClosureOutcome(results.ToImmutable(), projections); + } + + string projectionWarning = handle.Warning; + if (projectionWarning.Length != 0) + { + degraded = true; + } + + // The shadow switch (or first add) succeeded. On an update, retire the + // previously tracked binding plans before publishing the new closure + // state so they are not leaked. This runs after the successful switch + // and before the closure state is replaced; deactivating the old plans + // first (then activating the new plans below) keeps a resource that is + // shared between the old and new plan sets continuously bound. + if (tracked is not null) + { + foreach (WotBindingPlan plan in tracked.BindingPlans) + { + await m_binders.DeactivateAsync(plan, cancellationToken).ConfigureAwait(false); + } + } + + m_closures[closure.Key] = new ClosureState + { + Key = closure.Key, + Handle = handle, + AggregateDigest = aggregateDigest, + Generation = generation, + MemberXids = [.. members.Select(m => m.Xid)], + ModelNamespaceUris = [.. sources.SelectMany(s => s.ModelNamespaceUris)], + BindingPlans = [.. bindingPlans] + }; + foreach (string namespaceUri in sources.SelectMany(s => s.ModelNamespaceUris)) + { + m_projectionNamespaceUris.Add(namespaceUri); + } + + foreach (WotBindingPlan plan in bindingPlans) + { + await m_binders.ActivateAsync(plan, cancellationToken).ConfigureAwait(false); + } + + WoTOutcomeEnum memberOutcome = degraded ? WoTOutcomeEnum.Warning : WoTOutcomeEnum.Success; + foreach (WotResource member in members) + { + int nodeCount = perMemberNodeCount.TryGetValue(member.Xid, out int c) ? c : 0; + NodeId rootNodeId = perMemberRoot.TryGetValue(member.Xid, out ExpandedNodeId root) + ? ResolveRootNodeId(root) + : NodeId.Null; + WoTValidationOutcomeDataType validation = SuccessValidation(); + results.Add(new WoTResourceLoadResultDataType + { + Xid = member.Xid, + GroupId = member.GroupId, + ResourceId = member.ResourceId, + VersionId = member.DefaultVersionId ?? string.Empty, + Kind = member.Kind, + Outcome = memberOutcome, + Phase = WoTPhaseEnum.Activation, + LoadState = WoTLoadStateEnum.Active, + Generation = generation, + MaterializedNodeCount = (uint)nodeCount, + RootNodeId = rootNodeId, + ContentDigest = DigestOf(member), + Message = projectionWarning.Length != 0 + ? "Projected with warning: " + projectionWarning + : degraded ? "Projected with degraded bindings." : "Projected." + }); + projections.Add(new WotResourceProjection( + member.GroupId, + member.ResourceId, + WoTLoadStateEnum.Active, + member.DefaultVersionId, + generation, + nodeCount, + rootNodeId, + validation, + projectionWarning.Length == 0 + ? [] + : [projectionWarning], + DateTime.UtcNow)); + RaiseResource(member, generation, memberOutcome, WoTLoadStateEnum.Active); + } + + return new ClosureOutcome(results.ToImmutable(), projections); + } + + private async ValueTask ReconcileRetirementsAsync( + HashSet targetKeys, + CancellationToken cancellationToken) + { + int retired = 0; + foreach (string key in (List)[.. m_closures.Keys.Where(k => !targetKeys.Contains(k))]) + { + if (m_closures.TryGetValue(key, out ClosureState? state)) + { + if (state.Handle is not null) + { + // Deactivate bindings before retiring the projection. + foreach (WotBindingPlan plan in state.BindingPlans) + { + await m_binders.DeactivateAsync(plan, cancellationToken) + .ConfigureAwait(false); + } + await m_host.RemoveAsync(state.Handle, cancellationToken) + .ConfigureAwait(false); + retired++; + } + m_closures.Remove(key); + } + } + return retired; + } + + private async ValueTask<(UANodeSet? NodeSet, ExpandedNodeId Root, string? Error)> TryConvertAsync( + WotResource resource, WotRegistrySnapshot snapshot, CancellationToken cancellationToken) + { + WotResourceVersion? version = resource.DefaultVersion; + if (version is null) + { + return (null, default, "Resource has no default version."); + } + WotConversionOutput output = await m_converter + .ConvertAsync(resource, version.Content, snapshot, cancellationToken) + .ConfigureAwait(false); + if (!output.Succeeded) + { + return (null, default, output.Errors.IsDefaultOrEmpty + ? "The document could not be converted to a NodeSet." + : string.Join("; ", output.Errors)); + } + return (output.NodeSet, output.RootNodeId, null); + } + + /// + /// Resolves a projection root, recorded before lifecycle add as an + /// absolute , into a concrete server NodeId + /// once its owning namespace has been registered by the projection host. + /// Returns NodeId.Null when there is no root or the namespace table is + /// unavailable or does not yet contain the owning namespace. + /// + private NodeId ResolveRootNodeId(ExpandedNodeId root) + { + if (root.IsNull) + { + return NodeId.Null; + } + NamespaceTable? namespaces = ServerNamespaceUris; + if (namespaces is null) + { + return NodeId.Null; + } + var resolved = ExpandedNodeId.ToNodeId(root, namespaces); + return resolved.IsNull ? NodeId.Null : resolved; + } + + private WotBindingPlanRequest BuildPlanRequest( + WotResource resource, WotResourceVersion version) + { + return WotBindingPlanRequest.FromDocument( + resource.Xid, resource.Kind, version.Content, m_converterOptions.MaxJsonDepth); + } + + private byte[] ComputeAggregateDigest(IReadOnlyList members) + { + using var sha = SHA256.Create(); + using var buffer = new MemoryStream(); + using (var writer = new BinaryWriter(buffer, Encoding.UTF8, leaveOpen: true)) + { + foreach (WotResource member in members + .OrderBy(m => m.Xid, StringComparer.Ordinal)) + { + writer.Write(member.Xid); + writer.Write(member.DefaultVersionId ?? string.Empty); + byte[] digest = member.DefaultVersion?.Digest ?? []; + writer.Write(digest.Length); + writer.Write(digest); + } + writer.Write(m_converterOptions.MaxJsonDepth); + writer.Write(BinderVersion); + } + buffer.Position = 0; + // TODO: SHA256.HashData(ReadOnlySpan) is only available on .NET 5+; + // this project also targets net472/net48/netstandard2.1, where the instance + // ComputeHash API is the portable equivalent. Revisit if the minimum TFM + // floor is ever raised to drop those targets. +#pragma warning disable CA1850 + return sha.ComputeHash(buffer.ToArray()); +#pragma warning restore CA1850 + } + + private string BinderVersion + { + get + { + IReadOnlyList caps = m_binders.Capabilities; + if (caps.Count == 0) + { + return "none"; + } + var builder = new StringBuilder(); + foreach (WoTBindingCapabilityDataType cap in caps) + { + builder.Append(cap.BindingUri).Append(';').Append(cap.ProfileVersion).Append('|'); + } + return builder.ToString(); + } + } + + private static byte[] SerializeNodeSet(UANodeSet nodeSet) + { + using var stream = new MemoryStream(); + nodeSet.Write(stream); + return stream.ToArray(); + } + + private static ImmutableArray OwnedModelUris(UANodeSet nodeSet) + { + if (nodeSet.Models is { Length: > 0 }) + { + var uris = new List(nodeSet.Models.Length); + foreach (ModelTableEntry model in nodeSet.Models) + { + if (!string.IsNullOrEmpty(model.ModelUri)) + { + uris.Add(model.ModelUri); + } + } + if (uris.Count > 0) + { + return [.. uris]; + } + } + if (nodeSet.NamespaceUris is { Length: > 0 }) + { + return + [ + .. nodeSet.NamespaceUris + .Where(u => !string.Equals(u, Ua.Namespaces.OpcUa, StringComparison.Ordinal)) + ]; + } + return []; + } + + /// + /// Records the namespaces a converted NodeSet owns and the ones it declares a dependency + /// on, so the closure's unmet dependencies can be resolved once for the whole projection. + /// + private static void CollectRequiredNamespaces( + UANodeSet nodeSet, + HashSet required, + HashSet owned) + { + foreach (string uri in OwnedModelUris(nodeSet)) + { + owned.Add(uri); + } + if (nodeSet.Models is null) + { + return; + } + foreach (ModelTableEntry model in nodeSet.Models) + { + if (model?.RequiredModel is null) + { + continue; + } + foreach (ModelTableEntry dependency in model.RequiredModel) + { + if (!string.IsNullOrEmpty(dependency?.ModelUri) && + !string.Equals( + dependency!.ModelUri, Ua.Namespaces.OpcUa, StringComparison.Ordinal)) + { + required.Add(dependency.ModelUri); + } + } + } + } + + /// + /// Asks the configured for every dependency namespace the + /// closure needs but neither owns nor finds on the server, recursing into whatever it gets + /// back. Returns the resolved models in dependency order together with the namespaces that + /// stayed unresolved. + /// + private async ValueTask<(ImmutableArray Resolved, + ImmutableArray Unresolved)> ResolveDependencyModelsAsync( + HashSet required, + HashSet owned, + CancellationToken cancellationToken) + { + var pending = new Queue(); + foreach (string uri in required) + { + if (!owned.Contains(uri) && !IsKnownToServer(uri)) + { + pending.Enqueue(uri); + } + } + if (pending.Count == 0) + { + return ([], []); + } + if (m_nodeSetResolver is null) + { + return ([], [.. pending]); + } + + ImmutableArray.Builder resolved = + ImmutableArray.CreateBuilder(); + ImmutableArray.Builder unresolved = ImmutableArray.CreateBuilder(); + var seen = new HashSet(pending, StringComparer.Ordinal); + while (pending.Count > 0) + { + cancellationToken.ThrowIfCancellationRequested(); + string uri = pending.Dequeue(); + Stream? stream = await m_nodeSetResolver + .TryResolveAsync(uri, cancellationToken) + .ConfigureAwait(false); + if (stream is null) + { + unresolved.Add(uri); + continue; + } + + byte[] xml; + UANodeSet? dependency; + using (stream) + { + MemoryStream? buffer = await CopyResolverDocumentAsync( + stream, uri, unresolved, cancellationToken) + .ConfigureAwait(false); + if (buffer is null) + { + continue; + } + using (buffer) + { + xml = buffer.ToArray(); + buffer.Position = 0; + dependency = UANodeSet.Read(buffer); + } + } + if (dependency is null) + { + // A resolver that hands back something unreadable is treated exactly like one + // that declined, so the namespace is reported rather than faulting onboarding. + unresolved.Add(uri); + continue; + } + + foreach (string ownedUri in OwnedModelUris(dependency)) + { + owned.Add(ownedUri); + } + // A resolved model may itself depend on further namespaces. + var nested = new HashSet(StringComparer.Ordinal); + CollectRequiredNamespaces(dependency, nested, owned); + foreach (string nestedUri in nested) + { + if (!owned.Contains(nestedUri) && + !IsKnownToServer(nestedUri) && + seen.Add(nestedUri)) + { + pending.Enqueue(nestedUri); + } + } + resolved.Add(new WotProjectionSource(uri, OwnedModelUris(dependency), xml)); + } + + // Dependencies are appended in resolution order, so reverse to put the deepest model + // first: a model must be materialized before the model that requires it. + resolved.Reverse(); + return (resolved.ToImmutable(), unresolved.ToImmutable()); + } + + private bool IsKnownToServer(string namespaceUri) + { + foreach (ClosureState closure in m_closures.Values) + { + if (closure.ModelNamespaceUris.Contains(namespaceUri, StringComparer.Ordinal)) + { + return true; + } + } + if (m_projectionNamespaceUris.Contains(namespaceUri)) + { + return false; + } + NamespaceTable? namespaces = ServerNamespaceUris; + return namespaces is not null && namespaces.GetIndex(namespaceUri) >= 0; + } + + private async ValueTask CopyResolverDocumentAsync( + Stream stream, + string namespaceUri, + ImmutableArray.Builder unresolved, + CancellationToken cancellationToken) + { + int maxBytes = m_converterOptions.MaxResolverDocumentBytes; + var buffer = new MemoryStream(); + var chunk = new byte[81920]; + bool keepBuffer = false; + try + { + while (true) + { + int read = await ReadBlockAsync(stream, chunk, cancellationToken) + .ConfigureAwait(false); + if (read == 0) + { + buffer.Position = 0; + keepBuffer = true; + return buffer; + } + if (buffer.Length + read > maxBytes) + { + unresolved.Add( + namespaceUri + + " (resolver response exceeded " + + maxBytes.ToString(CultureInfo.InvariantCulture) + + " bytes)"); + return null; + } + buffer.Write(chunk, 0, read); + } + } + finally + { + if (!keepBuffer) + { + buffer.Dispose(); + } + } + } + + private static async ValueTask ReadBlockAsync( + Stream stream, + byte[] buffer, + CancellationToken cancellationToken) + { +#if NETFRAMEWORK || NETSTANDARD2_0 + return await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken) + .ConfigureAwait(false); +#else + return await stream.ReadAsync(buffer.AsMemory(), cancellationToken) + .ConfigureAwait(false); +#endif + } + + private static IReadOnlyList MembersOf(WotDependencyClosure closure) + { + return closure.Members.IsDefaultOrEmpty + ? Array.Empty() + : closure.Members; + } + + private HashSet ResolveSelection( + WotRegistrySnapshot snapshot, + ImmutableArray selectors) + { + var set = new HashSet(StringComparer.Ordinal); + if (selectors.IsDefaultOrEmpty) + { + return set; + } + foreach (WoTResourceSelectorDataType selector in selectors) + { + foreach (WotResource resource in snapshot.AllResources()) + { + if (Matches(resource, selector)) + { + set.Add(resource.Xid); + } + } + } + return set; + } + + private static bool Matches(WotResource resource, WoTResourceSelectorDataType selector) + { + if (!string.IsNullOrEmpty(selector.Xid) && + !string.Equals(selector.Xid, resource.Xid, StringComparison.Ordinal)) + { + return false; + } + if (!string.IsNullOrEmpty(selector.GroupId) && + !string.Equals(selector.GroupId, resource.GroupId, StringComparison.Ordinal)) + { + return false; + } + if (!string.IsNullOrEmpty(selector.ResourceId) && + !string.Equals(selector.ResourceId, resource.ResourceId, StringComparison.Ordinal)) + { + return false; + } + return true; + } + + private static WoTResourceLoadResultDataType FailResult( + WotResource resource, uint generation, WoTPhaseEnum phase, string? message) + { + return new() + { + Xid = resource.Xid, + GroupId = resource.GroupId, + ResourceId = resource.ResourceId, + VersionId = resource.DefaultVersionId ?? string.Empty, + Kind = resource.Kind, + Outcome = WoTOutcomeEnum.Failed, + Phase = phase, + LoadState = WoTLoadStateEnum.Failed, + Generation = generation, + MaterializedNodeCount = 0, + ContentDigest = DigestOf(resource), + Message = message ?? string.Empty + }; + } + + private static WoTResourceLoadResultDataType UnchangedResult( + WotResource resource, uint generation) + { + return new() + { + Xid = resource.Xid, + GroupId = resource.GroupId, + ResourceId = resource.ResourceId, + VersionId = resource.ActiveVersionId ?? resource.DefaultVersionId ?? string.Empty, + Kind = resource.Kind, + Outcome = WoTOutcomeEnum.Unchanged, + Phase = WoTPhaseEnum.Activation, + LoadState = WoTLoadStateEnum.Active, + Generation = generation, + MaterializedNodeCount = (uint)resource.MaterializedNodeCount, + ContentDigest = DigestOf(resource), + Message = "Content digest unchanged." + }; + } + + private static WotResourceProjection FailProjection( + WotResource resource, string? message, WoTValidationOutcomeDataType? validation = null) + { + return new( + resource.GroupId, + resource.ResourceId, + WoTLoadStateEnum.Failed, + activeVersionId: null, + resource.RefreshGeneration, + resource.MaterializedNodeCount, + rootNodeId: NodeId.Null, + validation, + string.IsNullOrEmpty(message) + ? [] + : [message!], + DateTime.UtcNow) + { + // Keep the previous active projection when a refresh fails. + RetainPreviousActiveVersion = true + }; + } + + private static WoTValidationOutcomeDataType SuccessValidation() + { + return new() + { + FormatValidated = true, + FormatOutcome = WoTOutcomeEnum.Success, + CompatibilityValidated = true, + CompatibilityOutcome = WoTOutcomeEnum.Success, + ValidatedAt = DateTime.UtcNow, + VocabularyVersion = WotNodeSetConverter.VocabularyNamespace + }; + } + + private static WoTValidationOutcomeDataType FormatFailure(string? reason) + { + return new() + { + FormatValidated = true, + FormatOutcome = WoTOutcomeEnum.Failed, + FormatReason = reason ?? string.Empty, + CompatibilityValidated = false, + CompatibilityOutcome = WoTOutcomeEnum.Skipped, + ValidatedAt = DateTime.UtcNow, + VocabularyVersion = WotNodeSetConverter.VocabularyNamespace + }; + } + + private void RaiseResource( + WotResource resource, uint generation, WoTOutcomeEnum outcome, WoTLoadStateEnum state) + { + RaiseEvent(new WotMaterializationEventArgs(WotMaterializationEventKind.Resource) + { + Xid = resource.Xid, + ResourceId = resource.ResourceId, + VersionId = resource.DefaultVersionId ?? string.Empty, + DocumentKind = resource.Kind, + Generation = generation, + Phase = WoTPhaseEnum.Activation, + Outcome = outcome, + LoadState = state + }); + } + + private void RaiseLoadFailure(WotResource resource, uint generation, string? reason) + { + RaiseEvent(new WotMaterializationEventArgs(WotMaterializationEventKind.LoadFailure) + { + Xid = resource.Xid, + ResourceId = resource.ResourceId, + VersionId = resource.DefaultVersionId ?? string.Empty, + DocumentKind = resource.Kind, + Generation = generation, + Phase = WoTPhaseEnum.Projection, + Outcome = WoTOutcomeEnum.Failed, + LoadState = WoTLoadStateEnum.Failed, + Reason = reason ?? string.Empty + }); + } + + private void RaiseValidationFailure( + WotResource resource, uint generation, + WoTValidationOutcomeDataType validation, string? reason) + { + RaiseEvent(new WotMaterializationEventArgs( + WotMaterializationEventKind.ValidationFailure) + { + Xid = resource.Xid, + ResourceId = resource.ResourceId, + VersionId = resource.DefaultVersionId ?? string.Empty, + DocumentKind = resource.Kind, + Generation = generation, + Phase = WoTPhaseEnum.FormatValidation, + Outcome = WoTOutcomeEnum.Failed, + LoadState = WoTLoadStateEnum.Failed, + Validation = validation, + Reason = reason ?? string.Empty + }); + } + + private void RaiseBindingFailure(WotResource resource, string? reason) + { + RaiseEvent(new WotMaterializationEventArgs( + WotMaterializationEventKind.BindingFailure) + { + Xid = resource.Xid, + ResourceId = resource.ResourceId, + DocumentKind = resource.Kind, + Outcome = WoTOutcomeEnum.Failed, + LoadState = WoTLoadStateEnum.Failed, + Reason = reason ?? string.Empty + }); + } + + private void RaiseEvent(WotMaterializationEventArgs args) + { + Event?.Invoke(this, args); + } + + private WotRefreshResult RejectedResult( + WotRefreshRequest request, WotRegistrySnapshot snapshot, DateTime start) + { + var summary = new WoTRefreshSummaryDataType + { + RequestId = request.RequestId ?? string.Empty, + Generation = 0, + Outcome = WoTOutcomeEnum.Rejected, + StartTime = start, + EndTime = DateTime.UtcNow + }; + return new WotRefreshResult( + summary, [], + (uint)snapshot.Generation); + } + + private sealed class ClosureState + { + public string Key { get; set; } = string.Empty; + public WotProjectionHandle? Handle { get; set; } + public byte[] AggregateDigest { get; set; } = []; + public uint Generation { get; set; } + public ImmutableArray MemberXids { get; set; } = []; + + public ImmutableArray ModelNamespaceUris { get; set; } = []; + + public ImmutableArray BindingPlans { get; set; } + = []; + } + + private sealed class ClosureOutcome + { + public ClosureOutcome( + ImmutableArray results, + List projections) + { + Results = results; + Projections = projections; + } + + public ImmutableArray Results { get; } + public List Projections { get; } + } + + private readonly IWotRegistryService m_registry; + private readonly IWotProjectionHost m_host; + private readonly IWotBinderRegistry m_binders; + private readonly IWotDocumentConverter m_converter; + private readonly ImmutableArray m_nodeSetContributors; + private readonly IWotNodeSetResolver? m_nodeSetResolver; + private readonly WotNodeSetConverterOptions m_converterOptions; + private readonly SemaphoreSlim m_mutex = new(1, 1); + + private readonly Dictionary m_closures = + new(StringComparer.Ordinal); + private readonly HashSet m_projectionNamespaceUris = + new(StringComparer.Ordinal); + + private uint m_generation; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotMaterializationTypes.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotMaterializationTypes.cs new file mode 100644 index 0000000000..5676824bed --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotMaterializationTypes.cs @@ -0,0 +1,251 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// A request to refresh (re-project) the registry into the AddressSpace. + /// Mirrors the generated WoTRegistryType.Refresh Method signature. + /// + public sealed class WotRefreshRequest + { + /// + /// Gets or sets the resource selectors; empty selects all resources. + /// + public ImmutableArray Selection { get; set; } + = []; + + /// + /// Gets or sets the refresh options. + /// + public WoTRefreshOptionsDataType Options { get; set; } = new WoTRefreshOptionsDataType(); + + /// + /// Gets or sets the caller's expected registry generation. When non-zero + /// and it does not match the current generation, the refresh is rejected. + /// + public uint ExpectedGeneration { get; set; } + + /// + /// Gets or sets an opaque request id echoed in the summary. + /// + public string RequestId { get; set; } = string.Empty; + } + + /// + /// The detailed result of a refresh, matching the generated + /// WoTRegistryType.Refresh output arguments. + /// + public sealed class WotRefreshResult + { + internal WotRefreshResult( + WoTRefreshSummaryDataType summary, + ImmutableArray results, + uint newGeneration) + { + Summary = summary; + Results = results; + NewGeneration = newGeneration; + } + + /// + /// Gets the overall refresh summary. + /// + public WoTRefreshSummaryDataType Summary { get; } + + /// + /// Gets the per-resource results. + /// + public ImmutableArray Results { get; } + + /// + /// Gets the committed refresh generation. + /// + public uint NewGeneration { get; } + } + + /// + /// The kind of materialization event emitted by the coordinator. + /// + public enum WotMaterializationEventKind + { + /// + /// A refresh completed. + /// + RefreshCompleted, + + /// + /// A resource projection changed state. + /// + Resource, + + /// + /// A resource failed format/compatibility validation. + /// + ValidationFailure, + + /// + /// A resource failed to load/project. + /// + LoadFailure, + + /// + /// A binding failed. + /// + BindingFailure + } + + /// + /// The payload the coordinator raises for each material event. The NodeManager + /// maps it to the generated WoTResourceEventType / + /// WoTValidationFailureEventType / WoTLoadFailureEventType / + /// WoTBindingFailureEventType / WoTRefreshCompletedEventType. + /// + public sealed class WotMaterializationEventArgs : EventArgs + { + internal WotMaterializationEventArgs(WotMaterializationEventKind kind) + { + Kind = kind; + } + + /// + /// Gets the event kind. + /// + public WotMaterializationEventKind Kind { get; } + + /// + /// Gets or sets the affected resource xid. + /// + public string Xid { get; init; } = string.Empty; + + /// + /// Gets or sets the resource id. + /// + public string ResourceId { get; init; } = string.Empty; + + /// + /// Gets or sets the version id. + /// + public string VersionId { get; init; } = string.Empty; + + /// + /// Gets or sets the document kind. + /// + public WoTDocumentKindEnum DocumentKind { get; init; } + + /// + /// Gets or sets the refresh generation. + /// + public uint Generation { get; init; } + + /// + /// Gets or sets the phase reached. + /// + public WoTPhaseEnum Phase { get; init; } + + /// + /// Gets or sets the outcome. + /// + public WoTOutcomeEnum Outcome { get; init; } + + /// + /// Gets or sets the resulting load state. + /// + public WoTLoadStateEnum LoadState { get; init; } + + /// + /// Gets or sets the validation outcome, if any. + /// + public WoTValidationOutcomeDataType? Validation { get; init; } + + /// + /// Gets or sets the failing node id, if any. + /// + public NodeId FailedNodeId { get; init; } + + /// + /// Gets or sets the binding URI, if any. + /// + public string BindingUri { get; init; } = string.Empty; + + /// + /// Gets or sets a human-readable reason/message. + /// + public string Reason { get; init; } = string.Empty; + + /// + /// Gets or sets the refresh summary (RefreshCompleted only). + /// + public WoTRefreshSummaryDataType? Summary { get; init; } + + /// + /// Gets or sets the request id (RefreshCompleted only). + /// + public string RequestId { get; init; } = string.Empty; + } + + /// + /// An that resolves referenced TD/TM + /// documents from a registry snapshot, so a Thing Description synthesized by + /// the converter can pull in the Thing Models it depends on. + /// + internal sealed class SnapshotThingResolver : IWotThingResolver + { + public SnapshotThingResolver(WotRegistrySnapshot snapshot) + { + m_snapshot = snapshot; + } + + /// + /// Resolves a Thing Description or Thing Model reference from the registry snapshot. + /// + public ValueTask ResolveThingAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + WotResource? resource = WotDependencyGraph.Resolve(m_snapshot, reference); + WotResourceVersion? version = resource?.DefaultVersion; + WotResolverResult result = version is null + ? WotResolverResult.NotFound + : WotResolverResult.FromBytes(version.Content); + return new ValueTask(result); + } + + private readonly WotRegistrySnapshot m_snapshot; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotProjectionBindingRuntime.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotProjectionBindingRuntime.cs new file mode 100644 index 0000000000..81bb0f3c6f --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotProjectionBindingRuntime.cs @@ -0,0 +1,546 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Server.Fluent; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// The per-generation OPC UA target-mapping binding runtime wired onto a + /// freshly imported NodeSet by . + /// It groups executable, target-mapped compiled forms by their resolved + /// target variable, wires either a direct (whole-value) or a structured + /// (field-by-field) handler per group, and owns every channel it lazily + /// opens for the lifetime of the generation. + /// + public sealed class WotProjectionBindingRuntime : IAsyncDisposable + { + internal WotProjectionBindingRuntime( + INodeManagerBuilder builder, + IWotBindingChannelFactory channelFactory, + IWotTargetVariableResolver resolver) + { + m_builder = builder; + m_channelFactory = channelFactory; + m_resolver = resolver; + } + + /// + /// Groups the closure's target-mapped, executable compiled forms by + /// resolved target variable and wires each group. Runs entirely + /// synchronously against the address space (no transport I/O); channel + /// opens are deferred to first use. + /// + /// + /// See . + /// + internal void Wire(ArrayOf bindingPlans) + { + var groups = new Dictionary(); + for (int p = 0; p < bindingPlans.Count; p++) + { + WotBindingPlan plan = bindingPlans[p]; + if (plan is null) + { + continue; + } + foreach (WotCompiledForm form in plan.CompiledForms) + { + if (form is null || form.TargetMapping.IsEmpty || !form.IsExecutable) + { + // Not target-mapped, or validated but not executable: + // out of scope for this runtime. + continue; + } + + if (form.Operation is not (WoTBindingCapabilityEnum.ReadProperty + or WoTBindingCapabilityEnum.WriteProperty or WoTBindingCapabilityEnum.ObserveProperty)) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Affordance '{0}' carries an OPC UA target mapping on its '{1}' form, but " + + "only readproperty, writeproperty and observeproperty support target binding.", + form.AffordanceName, + form.OpToken); + } + + BaseVariableState variable = m_resolver.Resolve(m_builder, form.TargetMapping); + if (!groups.TryGetValue(variable.NodeId, out VariableGroup? group)) + { + group = new VariableGroup(variable); + groups.Add(variable.NodeId, group); + } + group.Entries.Add(form); + } + } + + foreach (VariableGroup group in groups.Values) + { + WireGroup(group); + } + } + + /// + /// Disposes every channel this generation successfully opened. + /// Faulted opens have no resource and are silently skipped by + /// ; actual disposal + /// failures are aggregated. + /// + /// + public async ValueTask DisposeAsync() + { + List? errors = null; + foreach (WotBindingChannelSlot slot in m_slots.Values) + { + try + { + await slot.DisposeAsync().ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + (errors ??= []).Add(ex); + } + } + if (errors is { Count: > 0 }) + { + throw new AggregateException( + "One or more WoT projection binding channels failed to dispose.", errors); + } + } + + private void WireGroup(VariableGroup group) + { + bool hasDirect = false; + bool hasField = false; + foreach (WotCompiledForm entry in group.Entries) + { + if (string.IsNullOrEmpty(entry.TargetMapping.FieldPath)) + { + hasDirect = true; + } + else + { + hasField = true; + } + } + if (hasDirect && hasField) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Target '{0}' is mapped both directly ('uav:mapToNodeId' / 'uav:mapToType' alone) and " + + "by field path ('uav:mapByFieldPath'); a target cannot be both a whole-value and a " + + "structured-field target.", + group.Variable.NodeId); + } + + INodeBuilder nodeBuilder = m_builder.Node(group.Variable.NodeId); + if (hasField) + { + WireStructuredGroup(group, nodeBuilder); + } + else + { + WireDirectGroup(group, nodeBuilder); + } + } + + private void WireDirectGroup(VariableGroup group, INodeBuilder nodeBuilder) + { + WotCompiledForm? read = null; + WotCompiledForm? write = null; + foreach (WotCompiledForm entry in group.Entries) + { + switch (entry.Operation) + { + case WoTBindingCapabilityEnum.ObserveProperty: + // Local monitored items sample the async read handler; + // no separate observe bridge is created. + continue; + case WoTBindingCapabilityEnum.ReadProperty: + if (read is not null) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Target '{0}' has more than one readproperty target mapping.", + group.Variable.NodeId); + } + read = entry; + break; + case WoTBindingCapabilityEnum.WriteProperty: + if (write is not null) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Target '{0}' has more than one writeproperty target mapping.", + group.Variable.NodeId); + } + write = entry; + break; + } + } + + if (read is not null) + { + nodeBuilder.OnRead(BuildDirectReadHandler(GetOrCreateSlot(read))); + } + if (write is not null) + { + nodeBuilder.OnWrite(BuildDirectWriteHandler(GetOrCreateSlot(write))); + } + } + + /// + /// Wires a structured (field-mapped) group. Target-variable resolution + /// and read/write duplicate-path detection run now, synchronously + /// against the address space; the structure encodeable lookup, root + /// instance validation and per-field + /// calls are + /// deferred to on + /// the first structured read or write, because the target's structure + /// type is not guaranteed to be registered in the shared + /// yet at wiring time (see the class + /// remarks on ). + /// + /// + private void WireStructuredGroup(VariableGroup group, INodeBuilder nodeBuilder) + { + NodeId targetNodeId = group.Variable.NodeId; + + var readByPath = new Dictionary(StringComparer.Ordinal); + var writeByPath = new Dictionary(StringComparer.Ordinal); + foreach (WotCompiledForm entry in group.Entries) + { + string fieldPath = entry.TargetMapping.FieldPath ?? string.Empty; + switch (entry.Operation) + { + case WoTBindingCapabilityEnum.ObserveProperty: + continue; + case WoTBindingCapabilityEnum.ReadProperty: + if (readByPath.ContainsKey(fieldPath)) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Target '{0}' field '{1}' has more than one readproperty mapping.", + targetNodeId, + fieldPath); + } + readByPath.Add(fieldPath, entry); + break; + case WoTBindingCapabilityEnum.WriteProperty: + if (writeByPath.ContainsKey(fieldPath)) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Target '{0}' field '{1}' has more than one writeproperty mapping.", + targetNodeId, + fieldPath); + } + writeByPath.Add(fieldPath, entry); + break; + } + } + + List<(string Path, WotBindingChannelSlot Slot)> readSlots = [.. readByPath + .OrderBy(kv => kv.Key, StringComparer.Ordinal) + .Select(kv => (kv.Key, GetOrCreateSlot(kv.Value)))]; + List<(string Path, WotBindingChannelSlot Slot)> writeSlots = [.. writeByPath + .OrderBy(kv => kv.Key, StringComparer.Ordinal) + .Select(kv => (kv.Key, GetOrCreateSlot(kv.Value)))]; + + var state = new WotStructuredGroupState( + m_builder.Context.EncodeableFactory, + m_builder.Context.NamespaceUris, + group.Variable.DataType, + targetNodeId, + readSlots, + writeSlots); + + if (readSlots.Count > 0) + { + nodeBuilder.OnRead(BuildStructuredReadHandler(state)); + } + if (writeSlots.Count > 0) + { + nodeBuilder.OnWrite(BuildStructuredWriteHandler(state)); + } + } + + private WotBindingChannelSlot GetOrCreateSlot(WotCompiledForm form) + { + if (!m_slots.TryGetValue(form, out WotBindingChannelSlot? slot)) + { + slot = new WotBindingChannelSlot(form, m_channelFactory); + m_slots.Add(form, slot); + } + return slot; + } + + private static NodeValueEventHandlerAsync BuildDirectReadHandler(WotBindingChannelSlot slot) + { + return async (context, node, indexRange, dataEncoding, cancellationToken) => + { + IWotBindingChannel channel = await slot.GetAsync(cancellationToken).ConfigureAwait(false); + WotReadResult result = await channel.ReadAsync(cancellationToken).ConfigureAwait(false); + if (!result.Success) + { + DateTimeUtc failedTimestamp = result.Value.SourceTimestamp != DateTimeUtc.MinValue + ? result.Value.SourceTimestamp + : DateTimeUtc.Now; + if (node is BaseVariableState failedVariable) + { + failedVariable.Value = Variant.Null; + failedVariable.StatusCode = result.Status; + failedVariable.Timestamp = failedTimestamp; + } + return new AttributeReadResult( + new ServiceResult(result.Status), + Variant.Null, + result.Status, + failedTimestamp); + } + DataValue value = result.Value; + DateTimeUtc timestamp = value.SourceTimestamp != DateTimeUtc.MinValue + ? value.SourceTimestamp + : DateTimeUtc.Now; + if (node is BaseVariableState variable) + { + variable.Value = value.WrappedValue; + variable.StatusCode = value.StatusCode; + variable.Timestamp = timestamp; + } + return new AttributeReadResult( + ServiceResult.Good, + value.WrappedValue, + value.StatusCode, + timestamp); + }; + } + + private static NodeValueWriteEventHandlerAsync BuildDirectWriteHandler(WotBindingChannelSlot slot) + { + return async (context, node, indexRange, value, cancellationToken) => + { + IWotBindingChannel channel = await slot.GetAsync(cancellationToken).ConfigureAwait(false); + WotWriteResult result = await channel + .WriteAsync(new DataValue(value), cancellationToken) + .ConfigureAwait(false); + return new AttributeWriteResult( + result.Success ? ServiceResult.Good : new ServiceResult(result.Status)); + }; + } + + private static NodeValueEventHandlerAsync BuildStructuredReadHandler(WotStructuredGroupState state) + { + return async (context, node, indexRange, dataEncoding, cancellationToken) => + { + WotStructuredGroupResolution resolution = state.EnsureResolved(); + if (!resolution.Success) + { + return new AttributeReadResult( + resolution.Error, Variant.Null, resolution.Error.StatusCode, DateTimeUtc.Now); + } + + IEncodeable rootEncodeable = resolution.RootType!.CreateInstance(); + if (rootEncodeable is not IStructure root) + { + return new AttributeReadResult( + new ServiceResult(StatusCodes.BadConfigurationError), + Variant.Null, + StatusCodes.BadConfigurationError, + DateTimeUtc.Now); + } + + List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> fields = resolution.ReadFields; + var tasks = new Task<(WotFieldPathPlan Plan, WotReadResult Result)>[fields.Count]; + for (int i = 0; i < fields.Count; i++) + { + tasks[i] = ReadFieldAsync(fields[i].Plan, fields[i].Slot, cancellationToken); + } + (WotFieldPathPlan Plan, WotReadResult Result)[] results = await Task.WhenAll(tasks) + .ConfigureAwait(false); + + foreach ((WotFieldPathPlan _, WotReadResult result) in results) + { + if (!result.Success) + { + DateTimeUtc failedTimestamp = result.Value.SourceTimestamp != DateTimeUtc.MinValue + ? result.Value.SourceTimestamp + : DateTimeUtc.Now; + return new AttributeReadResult( + new ServiceResult(result.Status), Variant.Null, result.Status, failedTimestamp); + } + } + + foreach ((WotFieldPathPlan plan, WotReadResult result) in results) + { + IStructure parent = WotStructuredFieldNavigator.CreateOrGetChild(root, plan.IntermediateSegments); + parent[plan.LeafFieldName] = result.Value.WrappedValue; + } + + (StatusCode status, DateTimeUtc timestamp) = AggregateFieldMetadata(results); + return new AttributeReadResult( + ServiceResult.Good, + new Variant(new ExtensionObject(rootEncodeable)), + status, + timestamp); + }; + } + + private static NodeValueWriteEventHandlerAsync BuildStructuredWriteHandler(WotStructuredGroupState state) + { + return async (context, node, indexRange, value, cancellationToken) => + { + WotStructuredGroupResolution resolution = state.EnsureResolved(); + if (!resolution.Success) + { + return new AttributeWriteResult(resolution.Error); + } + + IServiceMessageContext messageContext = context.AsMessageContext(); + if (!value.TryGetValue(out ExtensionObject extensionObject) || + !extensionObject.TryGetValue(out IEncodeable? rootEncodeable, messageContext) || + rootEncodeable is not IStructure root) + { + return new AttributeWriteResult(new ServiceResult(StatusCodes.BadTypeMismatch)); + } + + List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> fields = resolution.WriteFields; + var tasks = new Task[fields.Count]; + for (int i = 0; i < fields.Count; i++) + { + tasks[i] = WriteFieldAsync( + root, + fields[i].Plan, + fields[i].Slot, + state.TargetNodeId, + messageContext, + cancellationToken); + } + WotWriteResult[] results = await Task.WhenAll(tasks).ConfigureAwait(false); + + foreach (WotWriteResult result in results) + { + if (!result.Success) + { + return new AttributeWriteResult(new ServiceResult(result.Status)); + } + } + return new AttributeWriteResult(ServiceResult.Good); + }; + } + + /// + /// Aggregates the per-field metadata of an all-succeeded structured + /// read into a single status/timestamp pair for the composed value: + /// the first non-default Good status found across the fields (or + /// plain if every field reported it), + /// and the oldest non- source + /// timestamp across the fields (or now, if none carried one). + /// + private static (StatusCode Status, DateTimeUtc Timestamp) AggregateFieldMetadata( + (WotFieldPathPlan Plan, WotReadResult Result)[] results) + { + StatusCode status = StatusCodes.Good; + DateTimeUtc oldest = DateTimeUtc.MinValue; + foreach ((WotFieldPathPlan _, WotReadResult result) in results) + { + StatusCode fieldStatus = result.Value.StatusCode; + if (status == StatusCodes.Good && fieldStatus != StatusCodes.Good) + { + status = fieldStatus; + } + + DateTimeUtc fieldTimestamp = result.Value.SourceTimestamp; + if (fieldTimestamp != DateTimeUtc.MinValue && + (oldest == DateTimeUtc.MinValue || fieldTimestamp < oldest)) + { + oldest = fieldTimestamp; + } + } + return (status, oldest == DateTimeUtc.MinValue ? DateTimeUtc.Now : oldest); + } + + private static async Task<(WotFieldPathPlan Plan, WotReadResult Result)> ReadFieldAsync( + WotFieldPathPlan plan, WotBindingChannelSlot slot, CancellationToken cancellationToken) + { + IWotBindingChannel channel = await slot.GetAsync(cancellationToken).ConfigureAwait(false); + WotReadResult result = await channel.ReadAsync(cancellationToken).ConfigureAwait(false); + return (plan, result); + } + + private static async Task WriteFieldAsync( + IStructure root, + WotFieldPathPlan plan, + WotBindingChannelSlot slot, + NodeId targetNodeId, + IServiceMessageContext messageContext, + CancellationToken cancellationToken) + { + IStructure parent; + try + { + parent = WotStructuredFieldNavigator.GetExistingChild( + root, + plan.IntermediateSegments, + targetNodeId, + messageContext); + } + catch (ServiceResultException ex) + { + return new WotWriteResult(ex.StatusCode, ex.Message); + } + Variant fieldValue = parent[plan.LeafFieldName]; + IWotBindingChannel channel = await slot.GetAsync(cancellationToken).ConfigureAwait(false); + return await channel.WriteAsync(new DataValue(fieldValue), cancellationToken).ConfigureAwait(false); + } + + private readonly INodeManagerBuilder m_builder; + private readonly IWotBindingChannelFactory m_channelFactory; + private readonly IWotTargetVariableResolver m_resolver; + private readonly Dictionary m_slots = []; + + private sealed class VariableGroup + { + public VariableGroup(BaseVariableState variable) + { + Variable = variable; + } + + public BaseVariableState Variable { get; } + + public List Entries { get; } = []; + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotProjectionBindingRuntimeFactory.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotProjectionBindingRuntimeFactory.cs new file mode 100644 index 0000000000..611eedece6 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotProjectionBindingRuntimeFactory.cs @@ -0,0 +1,107 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Server.Fluent; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// The default . It builds + /// a for the closure's prepared + /// binding plans and wires it against the freshly imported predefined + /// nodes. Always available via direct construction (no dependency + /// injection container required) given an + /// — typically the same + /// WotProtocolBinderRegistry instance exposed as + /// . + /// + public sealed class WotProjectionBindingRuntimeFactory : IWotProjectionBindingRuntimeFactory + { + /// + /// Initializes a new projection binding runtime factory. + /// + /// The channel factory used to open live channels. + /// + /// The target-variable resolver. Defaults to a new + /// when null. + /// + public WotProjectionBindingRuntimeFactory( + IWotBindingChannelFactory channelFactory, + IWotTargetVariableResolver? resolver = null) + { + m_channelFactory = channelFactory ?? throw new ArgumentNullException(nameof(channelFactory)); + m_resolver = resolver ?? new WotTargetVariableResolver(); + } + + /// + public async ValueTask CreateAsync( + INodeManagerBuilder builder, + ArrayOf bindingPlans, + CancellationToken cancellationToken = default) + { + if (builder is null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (bindingPlans.IsEmpty) + { + return null; + } + return await CreateWiredRuntimeAsync(builder, bindingPlans).ConfigureAwait(false); + } + + /// + /// Creates the runtime and wires it, disposing it again if wiring + /// fails so ownership never escapes unwired: the returned instance is + /// always the fully-wired runtime the caller is meant to own. + /// + private async ValueTask CreateWiredRuntimeAsync( + INodeManagerBuilder builder, ArrayOf bindingPlans) + { + var runtime = new WotProjectionBindingRuntime(builder, m_channelFactory, m_resolver); + try + { + runtime.Wire(bindingPlans); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + await runtime.DisposeAsync().ConfigureAwait(false); + throw; + } + return runtime; + } + + private readonly IWotBindingChannelFactory m_channelFactory; + private readonly IWotTargetVariableResolver m_resolver; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotRefreshArguments.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotRefreshArguments.cs new file mode 100644 index 0000000000..12cf3f7940 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotRefreshArguments.cs @@ -0,0 +1,362 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Immutable; +using Opc.Ua.Encoders; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Decodes the four WoTRegistryType.Refresh input arguments - + /// Selection ([]), + /// Options (), + /// ExpectedGeneration () and RequestId + /// () - into a . Structured + /// arguments are accepted in every form a caller may present them: an already + /// decoded encodeable, an wrapping the + /// encodeable, a binary-encoded ExtensionObject body, and both plain-array and + /// array containers. A value whose type does not match + /// the argument's schema is rejected with + /// rather than silently ignored. + /// + internal static class WotRefreshArguments + { + /// + /// Decodes the Refresh input arguments into a . + /// + /// The raw input argument variants. + /// The message context used to decode encoded bodies. + /// The decoded request on success. + /// + /// on success, or + /// when an argument is present + /// but has the wrong type. + /// + public static ServiceResult TryDecode( + ArrayOf inputArguments, + IServiceMessageContext context, + out WotRefreshRequest request) + { + request = new WotRefreshRequest(); + + ServiceResult selection = TryDecodeSelection( + ArgumentAt(inputArguments, 0), context, + out ImmutableArray selectors); + if (ServiceResult.IsBad(selection)) + { + return selection; + } + + ServiceResult options = TryDecodeStructure( + ArgumentAt(inputArguments, 1), context, + out WoTRefreshOptionsDataType? decodedOptions); + if (ServiceResult.IsBad(options)) + { + return options; + } + + ServiceResult generation = TryDecodeUInt32( + ArgumentAt(inputArguments, 2), out uint expectedGeneration); + if (ServiceResult.IsBad(generation)) + { + return generation; + } + + ServiceResult requestId = TryDecodeString( + ArgumentAt(inputArguments, 3), out string? id); + if (ServiceResult.IsBad(requestId)) + { + return requestId; + } + + request = new WotRefreshRequest + { + Selection = selectors, + Options = decodedOptions ?? new WoTRefreshOptionsDataType(), + ExpectedGeneration = expectedGeneration, + RequestId = id ?? string.Empty + }; + return ServiceResult.Good; + } + + private static Variant ArgumentAt(ArrayOf inputArguments, int index) + { + return index < inputArguments.Count ? inputArguments[index] : Variant.Null; + } + + private static ServiceResult TryDecodeSelection( + Variant value, + IServiceMessageContext context, + out ImmutableArray selectors) + { + selectors = []; + if (value.IsNull) + { + return ServiceResult.Good; + } + + ImmutableArray.Builder builder = + ImmutableArray.CreateBuilder(); + foreach (object? element in Enumerate(value.AsBoxedObject(Variant.BoxingBehavior.Legacy))) + { + if (element is null) + { + continue; + } + ServiceResult status = TryCoerce( + element, context, out WoTResourceSelectorDataType? selector); + if (ServiceResult.IsBad(status) || selector is null) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The Selection argument must be an array of WoTResourceSelectorDataType."); + } + builder.Add(selector); + } + selectors = builder.ToImmutable(); + return ServiceResult.Good; + } + + private static ServiceResult TryDecodeStructure( + Variant value, + IServiceMessageContext context, + out WoTRefreshOptionsDataType? options) + { + options = null; + if (value.IsNull) + { + return ServiceResult.Good; + } + ServiceResult status = TryCoerce( + value.AsBoxedObject(Variant.BoxingBehavior.Legacy), context, out options); + if (ServiceResult.IsBad(status) || options is null) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The Options argument must be a single WoTRefreshOptionsDataType."); + } + return ServiceResult.Good; + } + + private static ServiceResult TryDecodeUInt32(Variant value, out uint result) + { + result = 0; + if (value.IsNull) + { + return ServiceResult.Good; + } + switch (value.AsBoxedObject(Variant.BoxingBehavior.Legacy)) + { + case uint u: + result = u; + return ServiceResult.Good; + case int i when i >= 0: + result = (uint)i; + return ServiceResult.Good; + case long l when l is >= 0 and <= uint.MaxValue: + result = (uint)l; + return ServiceResult.Good; + case ushort us: + result = us; + return ServiceResult.Good; + case byte b: + result = b; + return ServiceResult.Good; + default: + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The ExpectedGeneration argument must be a UInt32."); + } + } + + private static ServiceResult TryDecodeString(Variant value, out string? result) + { + result = null; + if (value.IsNull) + { + return ServiceResult.Good; + } + if (value.AsBoxedObject(Variant.BoxingBehavior.Legacy) is string s) + { + result = s; + return ServiceResult.Good; + } + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The RequestId argument must be a String."); + } + + private static IEnumerable Enumerate(object? boxed) + { + switch (boxed) + { + case null: + yield break; + case ExtensionObject single: + yield return single; + break; + case IConvertableToArray convertible: + var array = convertible.ToArray(); + if (array is not null) + { + foreach (object? item in array) + { + yield return item; + } + } + break; + case IEnumerable enumerable when boxed is not string: + foreach (object? item in enumerable) + { + yield return item; + } + break; + default: + yield return boxed; + break; + } + } + + private static ServiceResult TryCoerce( + object? element, + IServiceMessageContext context, + out T? value) + where T : class, IEncodeable, new() + { + value = null; + switch (element) + { + case T typed: + value = typed; + return ServiceResult.Good; + case ExtensionObject extension: + return TryDecodeExtensionObject(extension, context, out value); + case IEncodeable encodeable: + return TryDecodeExtensionObject( + new ExtensionObject(encodeable), + context, + out value); + default: + return StatusCodes.BadInvalidArgument; + } + } + + private static ServiceResult TryDecodeExtensionObject( + ExtensionObject extension, + IServiceMessageContext context, + out T? value) + where T : class, IEncodeable, new() + { + value = null; + if (extension.IsNull) + { + return StatusCodes.BadInvalidArgument; + } +#pragma warning disable IDE0018, IDE0059 // must stay a separate, non-inlined out-var (see IDE0001 note below) + T? typed = default; +#pragma warning disable IDE0001 // explicit avoids CS8631/CS8634: inference from a nullable out-var picks 'T?' + if (new Variant(extension).TryGetStructure(context, out typed)) +#pragma warning restore IDE0001, IDE0018, IDE0059 + { + value = typed; + return ServiceResult.Good; + } + if (typeof(T) == typeof(WoTRefreshOptionsDataType) && + extension.TryGetValue(out Structure? structure, context) && + structure is not null && + TryDecodeDynamicOptions(structure, out WoTRefreshOptionsDataType? options)) + { + value = (T)(IEncodeable)options!; + return ServiceResult.Good; + } + if (extension.TryGetAsBinary(out ByteString body, context) && !body.IsNull) + { + try + { + using var decoder = new BinaryDecoder(body.Span.ToArray(), context); + value = new T(); + value.Decode(decoder); + return ServiceResult.Good; + } + catch (Exception ex) when (ex is ServiceResultException or FormatException) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The encoded argument body could not be decoded."); + } + } + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The encoded argument body could not be decoded."); + } + + private static bool TryDecodeDynamicOptions( + Structure structure, + out WoTRefreshOptionsDataType? options) + { + options = null; + if (structure.TypeId != DataTypeIds.WoTRefreshOptionsDataType || + structure.BinaryEncodingId != ObjectIds.WoTRefreshOptionsDataType_Encoding_DefaultBinary) + { + return false; + } + options = new WoTRefreshOptionsDataType + { + Atomicity = GetEnum(structure, "Atomicity"), + Force = GetBoolean(structure, "Force"), + DryRun = GetBoolean(structure, "DryRun"), + IncludeDependents = GetBoolean(structure, "IncludeDependents"), + DeletePolicy = GetEnum(structure, "DeletePolicy"), + MaxParallelism = GetUInt32(structure, "MaxParallelism"), + Timeout = GetDouble(structure, "Timeout") + }; + return true; + } + + private static bool GetBoolean(Structure structure, string fieldName) + => structure[fieldName].TryGetValue(out bool value) && value; + + private static double GetDouble(Structure structure, string fieldName) + => structure[fieldName].TryGetValue(out double value) ? value : 0; + + private static TEnum GetEnum(Structure structure, string fieldName) + where TEnum : struct + { + return structure[fieldName].TryGetValue(out int value) + ? (TEnum)(object)value + : default; + } + + private static uint GetUInt32(Structure structure, string fieldName) + => structure[fieldName].TryGetValue(out uint value) ? value : 0; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotStructuredFieldBinding.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotStructuredFieldBinding.cs new file mode 100644 index 0000000000..473c6090e8 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotStructuredFieldBinding.cs @@ -0,0 +1,275 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// One non-leaf segment of a validated uav:mapByFieldPath path: the + /// field name to descend through and the encodeable type of the nested + /// structure it holds. + /// + internal sealed class WotFieldPathSegment + { + public WotFieldPathSegment(string name, IEncodeableType nestedType) + { + Name = name; + NestedType = nestedType; + } + + public string Name { get; } + + public IEncodeableType NestedType { get; } + } + + /// + /// A validated, pre-resolved walk from a structured target's root down to + /// one leaf field, built once during activation so repeated reads/writes + /// never re-walk metadata. + /// + internal sealed class WotFieldPathPlan + { + public WotFieldPathPlan(ImmutableArray intermediateSegments, string leafFieldName) + { + IntermediateSegments = intermediateSegments; + LeafFieldName = leafFieldName; + } + + public ImmutableArray IntermediateSegments { get; } + + public string LeafFieldName { get; } + } + + /// + /// Validates uav:mapByFieldPath paths against + /// metadata and navigates + /// instances while composing (read direction) or + /// extracting (write direction) a structured target value. No reflection + /// and no public API are used: nested structures are + /// read and written exclusively through and + /// . + /// + internal static class WotStructuredFieldNavigator + { + /// + /// Validates a slash-separated field path against the root type's + /// structure definition tree and returns the pre-resolved plan. + /// + /// + /// The path is empty, contains an empty segment, references an unknown + /// field, traverses an array-valued intermediate field, or traverses an + /// intermediate field whose DataType is not a structure type. + /// + /// + public static WotFieldPathPlan BuildPlan( + IEncodeableFactory factory, + NamespaceTable namespaceUris, + IEncodeableType rootType, + string fieldPath, + NodeId targetNodeId) + { + if (string.IsNullOrWhiteSpace(fieldPath)) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "'uav:mapByFieldPath' for target '{0}' must not be empty.", + targetNodeId); + } + + string[] segments = fieldPath.Split('/'); + ImmutableArray.Builder intermediate = + ImmutableArray.CreateBuilder(); + IEncodeableType currentType = rootType; + + for (int i = 0; i < segments.Length; i++) + { + string segment = segments[i]; + if (string.IsNullOrEmpty(segment)) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "'uav:mapByFieldPath' value '{0}' for target '{1}' contains an empty segment.", + fieldPath, + targetNodeId); + } + + StructureDefinition definition = GetStructureDefinition( + currentType, namespaceUris, fieldPath, targetNodeId); + StructureField? field = FindField(definition, segment) ?? + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "'uav:mapByFieldPath' value '{0}' for target '{1}' references unknown field '{2}'.", + fieldPath, + targetNodeId, + segment); + + bool isLast = i == segments.Length - 1; + if (isLast) + { + return new WotFieldPathPlan(intermediate.ToImmutable(), segment); + } + + if (field.ValueRank != ValueRanks.Scalar) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "'uav:mapByFieldPath' value '{0}' for target '{1}' traverses array-valued field " + + "'{2}' (ValueRank {3}); only scalar structures can be traversed.", + fieldPath, + targetNodeId, + segment, + field.ValueRank); + } + + var nestedTypeId = NodeId.ToExpandedNodeId(field.DataType, namespaceUris); + if (!factory.TryGetEncodeableType(nestedTypeId, out IEncodeableType? nestedType) || + nestedType.CreateInstance() is not IStructure) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "'uav:mapByFieldPath' value '{0}' for target '{1}' traverses field '{2}' whose " + + "DataType '{3}' is not a registered structure type.", + fieldPath, + targetNodeId, + segment, + field.DataType); + } + + intermediate.Add(new WotFieldPathSegment(segment, nestedType)); + currentType = nestedType; + } + + // Unreachable: segments.Length > 0 is guaranteed by the empty-path + // check above, so the loop always returns via the isLast branch. + throw new InvalidOperationException("Field path resolution did not reach a leaf segment."); + } + + /// + /// Navigates from to the parent of the leaf + /// field, creating any missing nested structure instance along the + /// way. Used when composing a fresh structured value for a read. + /// + /// + public static IStructure CreateOrGetChild( + IStructure root, ImmutableArray intermediateSegments) + { + IStructure current = root; + foreach (WotFieldPathSegment segment in intermediateSegments) + { + Variant existing = current[segment.Name]; + if (existing.TryGetValue(out ExtensionObject extensionObject) && + extensionObject.TryGetValue(out IEncodeable? existingEncodeable) && + existingEncodeable is IStructure existingChild) + { + current = existingChild; + continue; + } + + IEncodeable createdChild = segment.NestedType.CreateInstance(); + if (createdChild is not IStructure child) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Field '{0}' could not be instantiated as a structure.", + segment.Name); + } + current[segment.Name] = new Variant(new ExtensionObject(createdChild)); + current = child; + } + return current; + } + + /// + /// Navigates from to the parent of the leaf + /// field without creating anything. Used when extracting a field from + /// an incoming structured value for a write. + /// + /// + /// An intermediate field is missing, null, or not the expected + /// structure type. + /// + public static IStructure GetExistingChild( + IStructure root, + ImmutableArray intermediateSegments, + NodeId targetNodeId, + IServiceMessageContext messageContext) + { + IStructure current = root; + foreach (WotFieldPathSegment segment in intermediateSegments) + { + Variant existing = current[segment.Name]; + if (!existing.TryGetValue(out ExtensionObject extensionObject) || + !extensionObject.TryGetValue(out IEncodeable? existingEncodeable, messageContext) || + existingEncodeable is not IStructure existingChild) + { + throw ServiceResultException.Create( + StatusCodes.BadStructureMissing, + "Target '{0}' is missing the nested structure at field '{1}'.", + targetNodeId, + segment.Name); + } + current = existingChild; + } + return current; + } + + private static StructureDefinition GetStructureDefinition( + IEncodeableType type, NamespaceTable namespaceUris, string fieldPath, NodeId targetNodeId) + { + if (type is not IDataTypeDefinitionSource source || + source.GetDataTypeDefinition(namespaceUris) is not StructureDefinition definition) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "'uav:mapByFieldPath' value '{0}' for target '{1}' traverses type '{2}', which does " + + "not expose a structure definition.", + fieldPath, + targetNodeId, + type.XmlName); + } + return definition; + } + + private static StructureField? FindField(StructureDefinition definition, string name) + { + ArrayOf fields = definition.Fields; + for (int i = 0; i < fields.Count; i++) + { + StructureField field = fields[i]; + if (string.Equals(field.Name, name, StringComparison.Ordinal)) + { + return field; + } + } + return null; + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Materialization/WotStructuredGroupState.cs b/src/Opc.Ua.WotCon.Server/Materialization/WotStructuredGroupState.cs new file mode 100644 index 0000000000..a26a3d82ec --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Materialization/WotStructuredGroupState.cs @@ -0,0 +1,239 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; + +namespace Opc.Ua.WotCon.Server.Materialization +{ + /// + /// Holds the not-yet-resolved slots for one structured (field-mapped) + /// target variable and lazily resolves the target's structure + /// plus every field's + /// on first use. + /// + /// Resolution cannot run while a runtime NodeSet is being wired: the + /// generation's binding runtime is wired by + /// , + /// which completes before NodeManagerLifecycle.RefreshComplexTypesAsync + /// registers the server's custom structure types into the shared + /// . Deferring resolution to the first + /// structured read or write lets that same factory instance — mutated in + /// place by RefreshComplexTypesAsync before the NodeManager is + /// published — already carry the type by the time it is needed. + /// + /// + /// Thread-safe and retryable: concurrent first use resolves at most once + /// under a single lock; a successful resolution is cached forever, and a + /// failed resolution (the type is still unavailable, or validation still + /// fails) is retried, uncached, on every subsequent call. + /// + /// + internal sealed class WotStructuredGroupState + { + /// + /// Initializes a new lazily-resolved structured group. + /// + /// + /// The server's . Captured by reference + /// so a later mutation (type registration) is visible to resolution. + /// + /// The node manager's namespace table. + /// The target variable's declared DataType. + /// The target variable's NodeId, for diagnostics. + /// + /// The read-direction field paths and their channel slots, already + /// duplicate-checked and ordered by . + /// + /// + /// The write-direction field paths and their channel slots, already + /// duplicate-checked and ordered by . + /// + public WotStructuredGroupState( + IEncodeableFactory factory, + NamespaceTable namespaceUris, + NodeId dataTypeId, + NodeId targetNodeId, + List<(string Path, WotBindingChannelSlot Slot)> readSlots, + List<(string Path, WotBindingChannelSlot Slot)> writeSlots) + { + m_factory = factory; + m_namespaceUris = namespaceUris; + m_dataTypeId = dataTypeId; + TargetNodeId = targetNodeId; + m_readSlots = readSlots; + m_writeSlots = writeSlots; + } + + /// + /// Gets the target variable's NodeId. + /// + public NodeId TargetNodeId { get; } + + /// + /// Resolves the structure type and every field's navigation plan on + /// first call, and returns the cached result on every later call. + /// A failed attempt resolves nothing permanently: the next call + /// retries from scratch against the (possibly by-then-populated) + /// factory. + /// + /// + /// On success, together with the + /// resolved root type and field plans. On failure, the deterministic + /// describing why resolution could not + /// complete, with empty field plan lists. + /// + public WotStructuredGroupResolution EnsureResolved() + { + lock (m_gate) + { + if (m_resolution is { } cached) + { + return cached; + } + + try + { + var rootTypeId = NodeId.ToExpandedNodeId(m_dataTypeId, m_namespaceUris); + if (!m_factory.TryGetEncodeableType(rootTypeId, out IEncodeableType? rootType) || + rootType.CreateInstance() is not IStructure) + { + throw ServiceResultException.Create( + StatusCodes.BadConfigurationError, + "Target '{0}' has DataType '{1}', which is not a registered structure type; " + + "'uav:mapByFieldPath' requires a structured target.", + TargetNodeId, + m_dataTypeId); + } + + var resolution = new WotStructuredGroupResolution( + ServiceResult.Good, + rootType, + BuildFieldPlans(rootType, m_readSlots), + BuildFieldPlans(rootType, m_writeSlots)); + + // Cache only the successful resolution; a failure below is + // never cached so the next first use retries. + m_resolution = resolution; + return resolution; + } + catch (ServiceResultException ex) + { + return WotStructuredGroupResolution.Failed(new ServiceResult(ex)); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + return WotStructuredGroupResolution.Failed(new ServiceResult( + StatusCodes.BadConfigurationError, + new LocalizedText( + $"Target '{TargetNodeId}' structure mapping could not be resolved: {ex.Message}"))); + } + } + } + + private List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> BuildFieldPlans( + IEncodeableType rootType, List<(string Path, WotBindingChannelSlot Slot)> slots) + { + var plans = new List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)>(slots.Count); + foreach ((string path, WotBindingChannelSlot slot) in slots) + { + plans.Add(( + WotStructuredFieldNavigator.BuildPlan(m_factory, m_namespaceUris, rootType, path, TargetNodeId), + slot)); + } + return plans; + } + + private readonly IEncodeableFactory m_factory; + private readonly NamespaceTable m_namespaceUris; + private readonly NodeId m_dataTypeId; + private readonly List<(string Path, WotBindingChannelSlot Slot)> m_readSlots; + private readonly List<(string Path, WotBindingChannelSlot Slot)> m_writeSlots; + private readonly Lock m_gate = new(); + private WotStructuredGroupResolution? m_resolution; + } + + /// + /// The outcome of : + /// either the resolved structure type with its field plans, or the + /// deterministic failure status naming why resolution could not complete. + /// + internal sealed class WotStructuredGroupResolution + { + /// + /// Initializes a new resolution outcome. + /// + public WotStructuredGroupResolution( + ServiceResult error, + IEncodeableType? rootType, + List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> readFields, + List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> writeFields) + { + Error = error; + RootType = rootType; + ReadFields = readFields; + WriteFields = writeFields; + } + + /// + /// Gets the failure status, or when + /// resolution succeeded. + /// + public ServiceResult Error { get; } + + /// + /// Gets whether resolution succeeded. + /// + public bool Success => ServiceResult.IsGood(Error); + + /// + /// Gets the resolved structure type, or null on failure. + /// + public IEncodeableType? RootType { get; } + + /// + /// Gets the resolved read-direction field plans; empty on failure. + /// + public List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> ReadFields { get; } + + /// + /// Gets the resolved write-direction field plans; empty on failure. + /// + public List<(WotFieldPathPlan Plan, WotBindingChannelSlot Slot)> WriteFields { get; } + + /// + /// Creates a failed resolution outcome carrying only the error. + /// + public static WotStructuredGroupResolution Failed(ServiceResult error) + { + return new(error, null, [], []); + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/NugetREADME.md b/src/Opc.Ua.WotCon.Server/NugetREADME.md index 846302a985..c65292915c 100644 --- a/src/Opc.Ua.WotCon.Server/NugetREADME.md +++ b/src/Opc.Ua.WotCon.Server/NugetREADME.md @@ -15,6 +15,8 @@ WoT-configured asset connections. The split provider model (FileSystem, ThingDescription, ConnectionStore) lets each backing store be swapped independently. +The package also hosts the WoT Connectivity 1.1 registry materialization coordinator and generic target-mapping runtime. Prepared binding plans are wired onto runtime-loaded NodeSet generations, channels open lazily, local monitored items sample the async read handlers, and shadow reload keeps existing monitored items on the retired generation until they drain. + ## Target frameworks `net472`, `net48`, `netstandard2.1`, `net8.0`, `net9.0`, @@ -25,3 +27,5 @@ store be swapped independently. See the [main repository README](https://github.com/OPCFoundation/UA-.NETStandard) and the [WoT Connectivity guide](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/docs/WoTConnectivity.md). + +See also the [WoT protocol bindings guide](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/docs/WotBindings.md) and [WoT aggregation sample](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/samples/WotCon/README.md). diff --git a/src/Opc.Ua.WotCon.Server/Opc.Ua.WotCon.Server.csproj b/src/Opc.Ua.WotCon.Server/Opc.Ua.WotCon.Server.csproj index ddc4d2f039..8c7189aa07 100644 --- a/src/Opc.Ua.WotCon.Server/Opc.Ua.WotCon.Server.csproj +++ b/src/Opc.Ua.WotCon.Server/Opc.Ua.WotCon.Server.csproj @@ -5,24 +5,34 @@ $(LibTargetFrameworks) $(PackagePrefix).Opc.Ua.WotCon.Server Opc.Ua.WotCon.Server - $(NoWarn);CS1591 enable - OPC UA WoT Connectivity (OPC 10100-1) server class library + OPC UA WoT Connectivity 1.1 server class library — hosts the deprecated OPC 10100-1 v1.02 asset-management surface and the registry-first materialization runtime. true NugetREADME.md true true true $(NoWarn);SYSLIB1100;SYSLIB1101;IL2026;IL3050 @@ -36,6 +46,8 @@ + + diff --git a/src/Opc.Ua.WotCon.Server/Registry/FileWotRegistryStore.cs b/src/Opc.Ua.WotCon.Server/Registry/FileWotRegistryStore.cs new file mode 100644 index 0000000000..fe7e164e7a --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/FileWotRegistryStore.cs @@ -0,0 +1,2444 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.ComponentModel; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text.Json; +using System.Text.Json.Serialization; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Win32.SafeHandles; +using Opc.Ua.XRegistry.Server; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// A durable, file-backed registry store. A storage-root lock serializes loads + /// and commits across store instances and processes. Every load validates the + /// primary manifest and all content-addressed blobs; any failure other than an + /// absent primary manifest with no store-owned recovery artifacts fails closed. + /// + /// + /// + /// A revalidates the expected on-disk generation and + /// requires a strictly newer snapshot under the lock. It flushes new blobs and + /// synchronizes the blobs and root directory entries before atomically switching + /// manifest.json, then synchronizes the storage root again. A stale store + /// instance is rejected before it can stage blobs or replace the primary manifest. + /// A confirmed pre-switch failure on a proven-pristine store rolls back only the + /// artifacts created by that attempt and durably synchronizes their removal. + /// Every lock acquisition also resynchronizes the root path component parents so + /// a partially completed multi-level root creation is retry-safe. + /// A reported manifest-replacement failure is classified only after validating + /// the primary, staged manifest, recovery backup, and all referenced blobs. + /// + /// + /// A manifest.json.bak left by an operator or older implementation is + /// never loaded or overwritten automatically. Atomic replacement uses a unique + /// recovery backup and preserves staged artifacts whenever replacement reports + /// failure. Blobs are not pruned automatically, so operator recovery evidence + /// cannot lose referenced content. + /// + /// + public sealed class FileWotRegistryStore : IWotRegistryStore + { + /// + /// Initializes a new file-backed store rooted at . + /// + public FileWotRegistryStore(string rootFolder) + : this( + rootFolder, + directorySyncFailureInjector: null, + manifestReplace: null) + { + } + + /// + /// Initializes a new file-backed store that keeps the manifest itself but delegates the + /// document bytes to . + /// + /// Substituting the byte layer is what lets a WoT registry run in a high-availability or + /// distributed deployment: the documents then live in a store every node can reach. The + /// manifest is still written and switched atomically by this class, which is safe because + /// blobs are content-addressed and therefore immutable — a document is always written + /// before the manifest that references it, so an interrupted commit can leave an orphaned + /// document but never a dangling reference. + /// + /// + /// When a store is supplied it owns the durability of the document bytes; the directory + /// fsync this class performs for its own blobs folder does not apply to it. + /// + /// + /// The registry folder that holds the manifest. + /// The store that holds the document bytes. + /// is null. + public FileWotRegistryStore(string rootFolder, IXRegistryResourceStore resourceStore) + : this( + rootFolder, + directorySyncFailureInjector: null, + manifestReplace: null, + resourceStore: resourceStore ?? throw new ArgumentNullException(nameof(resourceStore))) + { + } + + internal FileWotRegistryStore( + string rootFolder, + Action? directorySyncFailureInjector, + Action? manifestReplace = null, + IXRegistryResourceStore? resourceStore = null) + { + m_root = Path.GetFullPath( + rootFolder ?? throw new ArgumentNullException(nameof(rootFolder))); + m_blobsFolder = Path.Combine(m_root, "blobs"); + m_lockPath = Path.Combine(m_root, LockFile); + m_resourceStore = resourceStore; + m_directorySyncFailureInjector = directorySyncFailureInjector; + m_manifestReplace = manifestReplace; + } + + /// + public async ValueTask LoadAsync( + CancellationToken cancellationToken = default) + { + m_expectedManifest = null; + m_expectedGeneration = null; + using StorageLock storageLock = await AcquireStorageLockAsync(cancellationToken) + .ConfigureAwait(false); + LoadedGeneration? loaded = await ReadGenerationAsync(cancellationToken) + .ConfigureAwait(false); + if (loaded is null) + { + string[] recoveryArtifacts = FindRecoveryArtifacts(); + if (recoveryArtifacts.Length != 0) + { + throw CreateRecoveryArtifactsException(recoveryArtifacts); + } + m_expectedManifest = ManifestStamp.Absent; + m_expectedGeneration = WotRegistrySnapshot.Empty.Generation; + return WotRegistrySnapshot.Empty; + } + + m_expectedManifest = loaded.Stamp; + m_expectedGeneration = loaded.Snapshot.Generation; + return loaded.Snapshot; + } + + private string[] FindRecoveryArtifacts() + { + try + { + return Directory.GetFileSystemEntries(m_root) + .Where(path => + { + string name = Path.GetFileName(path); + return string.Equals(name, "blobs", StringComparison.Ordinal) || + string.Equals(name, ManifestFile, StringComparison.Ordinal) || + name.StartsWith(ManifestFile + ".", StringComparison.Ordinal); + }) + .OrderBy(path => path, StringComparer.Ordinal) + .ToArray(); + } + catch (UnauthorizedAccessException ex) + { + throw new IOException( + $"Access to WoT registry root '{m_root}' was denied while checking " + + "for recovery artifacts.", + ex); + } + catch (IOException ex) + { + throw new IOException( + $"Unable to inspect WoT registry root '{m_root}' for recovery artifacts.", + ex); + } + } + + private static InvalidDataException CreateRecoveryArtifactsException( + string[] recoveryArtifacts) + { + return new InvalidDataException( + "The WoT registry primary manifest is absent, but store-owned " + + "recovery artifacts indicate prior or staged state: " + + $"{string.Join(", ", recoveryArtifacts)}. Operator recovery " + + "is required; the registry cannot be treated as empty."); + } + + /// + public async ValueTask CommitAsync( + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken = default) + { + snapshot ??= WotRegistrySnapshot.Empty; + ValidatedCommit intended = await ValidateIntendedSnapshotAsync( + snapshot, + cancellationToken) + .ConfigureAwait(false); + using StorageLock storageLock = await AcquireStorageLockAsync(cancellationToken) + .ConfigureAwait(false); + if (m_expectedManifest is not { } expected || + m_expectedGeneration is not { } expectedGeneration) + { + throw new InvalidOperationException( + "LoadAsync must complete successfully before this file-backed " + + "registry store can commit."); + } + + PristineCommitArtifacts? pristineArtifacts = null; + LoadedGeneration? current = await ReadGenerationAsync(cancellationToken) + .ConfigureAwait(false); + if (current is null && !expected.Exists) + { + string[] recoveryArtifacts = FindRecoveryArtifacts(); + if (recoveryArtifacts.Length != 0) + { + m_expectedManifest = null; + m_expectedGeneration = null; + InvalidDataException validationFailure = + CreateRecoveryArtifactsException(recoveryArtifacts); + throw new WotRegistryCommitIndeterminateException( + snapshot, + new InvalidOperationException( + "The commit was not attempted because the expected absent " + + "primary manifest state is indeterminate."), + validationFailure); + } + pristineArtifacts = new PristineCommitArtifacts(); + } + ManifestStamp actual = current?.Stamp ?? ManifestStamp.Absent; + if (!expected.Equals(actual)) + { + throw new InvalidOperationException( + $"The on-disk WoT registry changed after this store loaded it. " + + $"Expected {expected}; found {actual}. Reload before retrying."); + } + if (snapshot.Generation <= expectedGeneration) + { + throw new InvalidOperationException( + $"WoT registry snapshot generation {snapshot.Generation} must be " + + $"strictly greater than the loaded generation {expectedGeneration}."); + } + try + { + pristineArtifacts?.ClaimBlobsDirectory(); + Directory.CreateDirectory(m_blobsFolder); + + // 1. Stage every referenced version blob durably before the manifest + // that points at it is switched in. Blobs are content-addressed, so an + // unchanged document is written at most once and shared across + // versions/resources. + foreach (KeyValuePair blob in intended.Blobs) + { + if (m_resourceStore is not null) + { + // An injected store owns the durability of the bytes it holds, so the + // directory fsync below does not apply to it. Content addressing makes + // matching blobs immutable, so never rewrite one that already verifies. + if (!await ResourceStoreBlobMatchesAsync( + m_resourceStore, blob.Key, blob.Value, cancellationToken) + .ConfigureAwait(false)) + { + await m_resourceStore + .WriteAsync(blob.Key, 0, ByteString.From(blob.Value), cancellationToken) + .ConfigureAwait(false); + } + continue; + } + await EnsureBlobAsync( + BlobPath(blob.Key), + blob.Value, + blob.Key, + pristineArtifacts, + cancellationToken) + .ConfigureAwait(false); + } + SyncDirectory(m_blobsFolder, DirectorySyncPhase.BlobsBeforeManifest); + SyncDirectory(m_root, DirectorySyncPhase.RootBeforeManifest); + } + catch (Exception failure) + when (IsConfirmedPreSwitchFailure(failure)) + { + await RollbackPristinePreSwitchFailureAsync( + snapshot, + pristineArtifacts, + failure) + .ConfigureAwait(false); + throw; + } + + // 2. Durably switch the prevalidated manifest only after blob directory + // entries are on stable storage. + string? replaceBackupPath = await AtomicReplaceManifestAsync( + snapshot, + intended.ManifestBytes, + intended.Stamp, + expected, + expectedGeneration, + pristineArtifacts, + cancellationToken) + .ConfigureAwait(false); + + try + { + SyncDirectory(m_root, DirectorySyncPhase.RootAfterManifest); + } + catch (IOException durabilityFailure) + { + await ResolvePostSwitchFailureAsync( + snapshot, + intended.ManifestBytes, + intended.Stamp, + durabilityFailure) + .ConfigureAwait(false); + } + + m_expectedManifest = intended.Stamp; + m_expectedGeneration = snapshot.Generation; + if (replaceBackupPath is not null) + { + TryDelete(replaceBackupPath); + } + } + + private async ValueTask ValidateIntendedSnapshotAsync( + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken) + { + if (snapshot.Generation < 0) + { + throw new InvalidDataException( + $"WoT registry snapshot generation {snapshot.Generation} cannot be negative."); + } + + var blobs = new Dictionary(StringComparer.Ordinal); + foreach (KeyValuePair groupEntry in snapshot.Groups) + { + cancellationToken.ThrowIfCancellationRequested(); + WotResourceGroup group = groupEntry.Value; + if (!string.Equals( + groupEntry.Key, + group.GroupId, + StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry snapshot group key '{groupEntry.Key}' does not " + + $"match group id '{group.GroupId}'."); + } + + foreach (KeyValuePair resourceEntry in group.Resources) + { + WotResource resource = resourceEntry.Value; + if (!string.Equals( + resourceEntry.Key, + resource.ResourceId, + StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry snapshot resource key '{resourceEntry.Key}' " + + $"does not match resource id '{resource.ResourceId}'."); + } + if (!string.Equals( + resource.GroupId, + group.GroupId, + StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry snapshot resource " + + $"'{resource.GroupId}/{resource.ResourceId}' does not belong " + + $"to group '{group.GroupId}'."); + } + + foreach (WotResourceVersion version in resource.Versions) + { + byte[] content = version.Content.ToArray(); + string digestHex = WotContentDigest.ToHex(version.Digest); + string actualDigest = WotContentDigest.ToHex( + WotContentDigest.Compute(content)); + if (!string.Equals( + digestHex, + actualDigest, + StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"Registry snapshot version '{version.VersionId}' has " + + $"digest '{digestHex}', but its content hashes to " + + $"'{actualDigest}'."); + } + if (blobs.TryGetValue(digestHex, out byte[]? existing)) + { + if (!existing.AsSpan().SequenceEqual(content)) + { + throw new InvalidDataException( + $"Registry snapshot digest '{digestHex}' identifies " + + "different content."); + } + } + else + { + blobs.Add(digestHex, content); + } + } + } + } + + ManifestDto manifest = ToManifest(snapshot); + byte[] manifestBytes = JsonSerializer.SerializeToUtf8Bytes( + manifest, + WotRegistryStoreJson.Default.ManifestDto); + ManifestDto roundTripped = JsonSerializer.Deserialize( + manifestBytes, + WotRegistryStoreJson.Default.ManifestDto) ?? + throw new InvalidDataException( + "The serialized WoT registry snapshot manifest was null."); + if (roundTripped.SchemaVersion != CurrentSchemaVersion) + { + throw new NotSupportedException( + $"WoT registry snapshot manifest uses schema " + + $"{roundTripped.SchemaVersion}; expected {CurrentSchemaVersion}."); + } + + WotRegistrySnapshot validated = await LoadSnapshotAsync( + roundTripped, + "intended snapshot manifest", + blobs, + cancellationToken) + .ConfigureAwait(false); + if (validated.Generation != snapshot.Generation) + { + throw new InvalidDataException( + $"WoT registry snapshot generation {snapshot.Generation} does not " + + $"cover contained epoch {validated.Generation}."); + } + + return new ValidatedCommit( + manifestBytes, + new ManifestStamp( + exists: true, + roundTripped.Generation, + WotContentDigest.ToHex(WotContentDigest.Compute(manifestBytes))), + blobs); + } + + private async ValueTask ResolvePostSwitchFailureAsync( + WotRegistrySnapshot intendedSnapshot, + byte[] intendedManifestBytes, + ManifestStamp intendedStamp, + IOException durabilityFailure) + { + m_expectedManifest = null; + m_expectedGeneration = null; + + LoadedGeneration actual; + try + { + actual = await ReadGenerationAsync(CancellationToken.None) + .ConfigureAwait(false) ?? + throw new InvalidDataException( + "The primary manifest is missing after its atomic switch."); + if (actual.Snapshot.Generation != intendedSnapshot.Generation || + !actual.Stamp.Equals(intendedStamp) || + !actual.ManifestBytes.AsSpan().SequenceEqual(intendedManifestBytes)) + { + throw new InvalidDataException( + "The primary manifest does not exactly match the intended " + + "committed generation."); + } + } + catch (Exception validationFailure) + when (IsCommitValidationFailure(validationFailure)) + { + throw new WotRegistryCommitIndeterminateException( + intendedSnapshot, + durabilityFailure, + validationFailure); + } + + m_expectedManifest = actual.Stamp; + m_expectedGeneration = actual.Snapshot.Generation; + throw new WotRegistryCommitDurabilityUncertainException( + actual.Snapshot, + durabilityFailure); + } + + private static bool IsCommitValidationFailure(Exception exception) + { + return exception is InvalidDataException or IOException or + NotSupportedException or ArgumentException or InvalidOperationException or + ServiceResultException; + } + + private ValueTask ReadGenerationAsync( + CancellationToken cancellationToken) + { + return ReadGenerationAsync( + Path.Combine(m_root, ManifestFile), + "primary manifest", + cancellationToken); + } + + private async ValueTask ReadGenerationAsync( + string manifestPath, + string manifestRole, + CancellationToken cancellationToken) + { + byte[] manifestBytes; + try + { + manifestBytes = await ReadAllBytesAsync(manifestPath, cancellationToken) + .ConfigureAwait(false); + } + catch (FileNotFoundException) + { + return null; + } + catch (IOException ex) + { + throw new IOException( + $"Unable to read WoT registry {manifestRole} '{manifestPath}'. " + + "The registry was left unchanged.", + ex); + } + catch (UnauthorizedAccessException ex) + { + throw new IOException( + $"Access to WoT registry {manifestRole} '{manifestPath}' was denied. " + + "The registry was left unchanged.", + ex); + } + + ManifestDto manifest; + try + { + manifest = JsonSerializer.Deserialize( + manifestBytes, WotRegistryStoreJson.Default.ManifestDto) ?? + throw new JsonException("The manifest root is null."); + } + catch (JsonException ex) + { + throw new InvalidDataException( + $"WoT registry {manifestRole} '{manifestPath}' is corrupt. " + + "The registry was left unchanged.", + ex); + } + if (manifest.SchemaVersion != CurrentSchemaVersion) + { + throw new NotSupportedException( + $"WoT registry {manifestRole} '{manifestPath}' uses schema " + + $"{manifest.SchemaVersion}; expected {CurrentSchemaVersion}. " + + "The registry was left unchanged."); + } + + WotRegistrySnapshot loaded = await LoadSnapshotAsync( + manifest, + manifestRole, + suppliedBlobs: null, + cancellationToken) + .ConfigureAwait(false); + return new LoadedGeneration( + loaded, + new ManifestStamp( + exists: true, + manifest.Generation, + WotContentDigest.ToHex(WotContentDigest.Compute(manifestBytes))), + manifestBytes); + } + + private async ValueTask LoadSnapshotAsync( + ManifestDto manifest, + string manifestRole, + IReadOnlyDictionary? suppliedBlobs, + CancellationToken cancellationToken) + { + ImmutableSortedDictionary registryLabels = + ToLabels(manifest.RegistryLabels); + long generation = manifest.Generation; + var loadedBlobs = new Dictionary(StringComparer.Ordinal); + ImmutableDictionary.Builder groups = + ImmutableDictionary.CreateBuilder(); + var identities = new HashSet(StringComparer.Ordinal) + { + RegistryXid, + RegistryNodeIdPath + }; + if (manifest.Groups is not null) + { + foreach (GroupDto groupDto in manifest.Groups) + { + cancellationToken.ThrowIfCancellationRequested(); + if (string.IsNullOrEmpty(groupDto.GroupId)) + { + throw new InvalidDataException( + "WoT registry manifest contains an empty group id."); + } + ValidateSegment(groupDto.GroupId, "group id"); + string groupXid = $"/groups/{groupDto.GroupId}"; + string groupNodeIdPath = + $"{RegistryNodeIdPath}/groups/{groupDto.GroupId}"; + if (!identities.Add(groupXid) || + !identities.Add(groupNodeIdPath)) + { + throw new InvalidDataException( + $"WoT registry manifest contains duplicate group id or " + + $"identity '{groupDto.GroupId}'."); + } + ImmutableDictionary.Builder resources = + ImmutableDictionary.CreateBuilder(); + if (groupDto.Resources is not null) + { + foreach (ResourceDto resourceDto in groupDto.Resources) + { + cancellationToken.ThrowIfCancellationRequested(); + if (!string.Equals( + resourceDto.GroupId, + groupDto.GroupId, + StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry manifest resource " + + $"'{resourceDto.GroupId}/{resourceDto.ResourceId}' " + + $"does not belong to containing group " + + $"'{groupDto.GroupId}'."); + } + if (string.IsNullOrEmpty(resourceDto.ResourceId)) + { + throw new InvalidDataException( + $"WoT registry manifest group '{groupDto.GroupId}' " + + "contains an empty resource id."); + } + ValidateSegment(resourceDto.ResourceId, "resource id"); + string resourceXid = + $"/groups/{resourceDto.GroupId}/resources/" + + resourceDto.ResourceId; + string resourceNodeIdPath = + $"{RegistryNodeIdPath}/groups/{resourceDto.GroupId}/" + + $"resources/{resourceDto.ResourceId}"; + if (!identities.Add(resourceXid) || + !identities.Add(resourceNodeIdPath)) + { + throw new InvalidDataException( + $"WoT registry manifest contains duplicate resource id " + + $"or identity '{resourceXid}'."); + } + WotResource resource = await LoadResourceAsync( + resourceDto, + loadedBlobs, + manifestRole, + suppliedBlobs, + cancellationToken) + .ConfigureAwait(false); + resources[resource.ResourceId] = resource; + generation = Math.Max(generation, resource.Epoch); + } + } + + var group = new WotResourceGroup( + groupDto.GroupId, + (WoTDocumentKindEnum)groupDto.Kind, + resources.ToImmutable(), + groupDto.Name, + groupDto.Description, + groupDto.Epoch, + ToLabels(groupDto.Labels)); + groups[group.GroupId] = group; + generation = Math.Max(generation, groupDto.Epoch); + } + } + + return new WotRegistrySnapshot( + generation, groups.ToImmutable(), registryLabels); + } + + private async ValueTask LoadResourceAsync( + ResourceDto dto, + Dictionary loadedBlobs, + string manifestRole, + IReadOnlyDictionary? suppliedBlobs, + CancellationToken cancellationToken) + { + ImmutableArray.Builder versions = + ImmutableArray.CreateBuilder(); + var versionIds = new HashSet(StringComparer.Ordinal); + if (dto.Versions is not null) + { + foreach (VersionDto version in dto.Versions) + { + if (string.IsNullOrEmpty(version.VersionId) || + !versionIds.Add(version.VersionId)) + { + throw new InvalidDataException( + $"Registry resource '{dto.GroupId}/{dto.ResourceId}' " + + $"contains a duplicate or empty version id " + + $"'{version.VersionId}'."); + } + ValidateSegment(version.VersionId, "version id"); + if (!IsSha256Hex(version.DigestHex)) + { + throw new InvalidDataException( + $"Registry resource '{dto.GroupId}/{dto.ResourceId}' version " + + $"'{version.VersionId}' has an invalid SHA-256 DigestHex."); + } + string digestHex = version.DigestHex!.ToLowerInvariant(); + if (!loadedBlobs.TryGetValue(digestHex, out byte[]? content)) + { + if (suppliedBlobs is not null) + { + if (!suppliedBlobs.TryGetValue(digestHex, out content)) + { + throw new InvalidDataException( + $"WoT registry blob '{digestHex}' referenced by the " + + $"{manifestRole} is missing."); + } + string suppliedDigest = WotContentDigest.ToHex( + WotContentDigest.Compute(content)); + if (!string.Equals( + digestHex, + suppliedDigest, + StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry blob supplied for the {manifestRole} " + + $"has SHA-256 '{suppliedDigest}', not '{digestHex}'."); + } + } + else + { + content = m_resourceStore is not null + ? await ReadFromResourceStoreAsync( + digestHex, manifestRole, cancellationToken) + .ConfigureAwait(false) + : await ReadBlobAsync( + BlobPath(digestHex), + digestHex, + manifestRole, + cancellationToken) + .ConfigureAwait(false); + } + loadedBlobs.Add(digestHex, content); + } + versions.Add(new WotResourceVersion( + version.VersionId, + content, + version.ContentType ?? string.Empty, + version.Format ?? string.Empty, + ParseDate(version.CreatedAt), + ParseDate(version.ModifiedAt))); + } + } + + return new WotResource( + dto.GroupId, + dto.ResourceId, + (WoTDocumentKindEnum)dto.Kind, + versions.ToImmutable(), + defaultVersionId: dto.DefaultVersionId, + desiredVersionId: dto.DesiredVersionId, + activeVersionId: dto.ActiveVersionId, + enabled: dto.Enabled, + loadState: (WoTLoadStateEnum)dto.LoadState, + validation: FromDto(dto.Validation), + diagnostics: dto.Diagnostics is null + ? [] + : ImmutableArray.Create(dto.Diagnostics), + epoch: dto.Epoch, + refreshGeneration: dto.RefreshGeneration, + lastRefreshTime: ParseDate(dto.LastRefreshTime), + materializedNodeCount: dto.MaterializedNodeCount, + rootNodeId: ParseNodeId(dto.RootNodeId), + name: dto.Name, + description: dto.Description, + thingId: dto.ThingId, + title: dto.Title, + labels: ToLabels(dto.Labels)); + } + + private static ManifestDto ToManifest(WotRegistrySnapshot snapshot) + { + var groups = new List(snapshot.Groups.Count); + foreach (WotResourceGroup group in snapshot.Groups.Values) + { + var resources = new List(group.Resources.Count); + foreach (WotResource resource in group.Resources.Values) + { + resources.Add(ToDto(resource)); + } + groups.Add(new GroupDto + { + GroupId = group.GroupId, + Kind = (int)group.Kind, + Name = group.Name, + Description = group.Description, + Epoch = group.Epoch, + Labels = FromLabels(group.Labels), + Resources = resources.Count == 0 ? null : [.. resources] + }); + } + return new ManifestDto + { + SchemaVersion = CurrentSchemaVersion, + Generation = snapshot.Generation, + RegistryLabels = FromLabels(snapshot.Labels), + Groups = groups.Count == 0 ? null : [.. groups] + }; + } + + private static ResourceDto ToDto(WotResource resource) + { + var versions = new VersionDto[resource.Versions.Length]; + for (int i = 0; i < resource.Versions.Length; i++) + { + WotResourceVersion v = resource.Versions[i]; + versions[i] = new VersionDto + { + VersionId = v.VersionId, + ContentType = v.ContentType, + Format = v.Format, + CreatedAt = FormatDate(v.CreatedAt), + ModifiedAt = FormatDate(v.ModifiedAt), + DigestHex = v.DigestHex + }; + } + return new ResourceDto + { + GroupId = resource.GroupId, + ResourceId = resource.ResourceId, + Kind = (int)resource.Kind, + Name = resource.Name, + Description = resource.Description, + DefaultVersionId = resource.DefaultVersionId, + DesiredVersionId = resource.DesiredVersionId, + ActiveVersionId = resource.ActiveVersionId, + Enabled = resource.Enabled, + LoadState = (int)resource.LoadState, + Epoch = resource.Epoch, + RefreshGeneration = resource.RefreshGeneration, + LastRefreshTime = FormatDate(resource.LastRefreshTime), + MaterializedNodeCount = resource.MaterializedNodeCount, + RootNodeId = resource.RootNodeId.IsNull ? null : resource.RootNodeId.ToString(), + ThingId = resource.ThingId, + Title = resource.Title, + Diagnostics = resource.Diagnostics.IsDefaultOrEmpty + ? null + : System.Linq.Enumerable.ToArray(resource.Diagnostics), + Validation = ToDto(resource.Validation), + Versions = versions.Length == 0 ? null : versions, + Labels = FromLabels(resource.Labels) + }; + } + + /// + /// Converts a possibly-null DTO dictionary into the ordinally-ordered + /// immutable label dictionary, defaulting to . + /// + private static ImmutableSortedDictionary ToLabels( + Dictionary? labels) + { + if (labels is null || labels.Count == 0) + { + return WotLabels.Empty; + } + return ImmutableSortedDictionary.CreateRange(StringComparer.Ordinal, labels); + } + + /// + /// Converts the immutable label dictionary into a plain + /// for JSON serialization, or + /// null when empty (kept out of the persisted document). + /// + private static Dictionary? FromLabels( + ImmutableSortedDictionary labels) + { + return labels.Count == 0 ? null : new Dictionary(labels); + } + + private static ValidationDto? ToDto(WoTValidationOutcomeDataType? validation) + { + if (validation is null) + { + return null; + } + return new ValidationDto + { + FormatValidated = validation.FormatValidated, + FormatOutcome = (int)validation.FormatOutcome, + FormatReason = validation.FormatReason, + CompatibilityValidated = validation.CompatibilityValidated, + CompatibilityOutcome = (int)validation.CompatibilityOutcome, + CompatibilityReason = validation.CompatibilityReason, + CompatibilityPolicy = validation.CompatibilityPolicy, + ValidatedAt = FormatDate(validation.ValidatedAt.ToDateTime()), + VocabularyVersion = validation.VocabularyVersion + }; + } + + private static WoTValidationOutcomeDataType? FromDto(ValidationDto? dto) + { + if (dto is null) + { + return null; + } + return new WoTValidationOutcomeDataType + { + FormatValidated = dto.FormatValidated, + FormatOutcome = (WoTOutcomeEnum)dto.FormatOutcome, + FormatReason = dto.FormatReason, + CompatibilityValidated = dto.CompatibilityValidated, + CompatibilityOutcome = (WoTOutcomeEnum)dto.CompatibilityOutcome, + CompatibilityReason = dto.CompatibilityReason, + CompatibilityPolicy = dto.CompatibilityPolicy, + ValidatedAt = ParseDate(dto.ValidatedAt), + VocabularyVersion = dto.VocabularyVersion + }; + } + + private string BlobPath(string digestHex) + { + return Path.Combine(m_blobsFolder, digestHex + ".bin"); + } + + private async ValueTask AcquireStorageLockAsync( + CancellationToken cancellationToken) + { + EnsureRootDirectoryDurable(); + + while (true) + { + cancellationToken.ThrowIfCancellationRequested(); + try + { + FileStream? lockStream = null; + try + { + lockStream = new FileStream( + m_lockPath, + FileMode.OpenOrCreate, + FileAccess.ReadWrite, + FileShare.None, + bufferSize: 1, + FileOptions.None); + var storageLock = new StorageLock(lockStream); + lockStream = null; + return storageLock; + } + finally + { + lockStream?.Dispose(); + } + } + catch (IOException ex) when (IsLockContention(ex)) + { + } + await Task.Delay(s_lockRetryDelay, cancellationToken) + .ConfigureAwait(false); + } + } + + private void EnsureRootDirectoryDurable() + { + string[] durabilityPath = m_rootDurabilityPath ??= + BuildRootDurabilityPath(); + foreach (string path in durabilityPath) + { + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + DirectoryInfo? parent = Directory.GetParent(path); + if (parent is null) + { + continue; + } + SyncDirectory( + parent.FullName, + DirectorySyncPhase.RootComponentParent); + } + } + + private string[] BuildRootDurabilityPath() + { + var components = new Stack(); + DirectoryInfo? current = new DirectoryInfo(m_root); + while (current is not null && !current.Exists) + { + components.Push(current.FullName); + current = current.Parent; + } + if (current is null) + { + throw new IOException( + $"No existing ancestor was found for registry root '{m_root}'."); + } + + var durabilityPath = new List(components.Count + 1) + { + current.FullName + }; + while (components.Count > 0) + { + durabilityPath.Add(components.Pop()); + } + return [.. durabilityPath]; + } + + private static bool IsLockContention(IOException exception) + { + int error = exception.HResult & 0xffff; + // Unix contention may surface as errno or the mapped Win32 sharing code. + return error is 4 or 11 or 13 or 16 or 32 or 33 or 35; + } + + private async ValueTask ReadFromResourceStoreAsync( + string expectedDigest, + string manifestRole, + CancellationToken cancellationToken) + { + long length = await m_resourceStore!.GetLengthAsync(expectedDigest, cancellationToken) + .ConfigureAwait(false); + if (length < 0) + { + throw new InvalidDataException( + $"WoT registry document '{expectedDigest}' referenced by the {manifestRole} " + + "is missing from the resource store. The registry was left unchanged."); + } + + ByteString document = await m_resourceStore + .ReadAsync(expectedDigest, 0, checked((int)length), cancellationToken) + .ConfigureAwait(false); + if (document.IsNull) + { + // A null ByteString is how the contract reports an unknown key, which can only + // happen here if the document was removed between the two calls. + throw new InvalidDataException( + $"WoT registry document '{expectedDigest}' referenced by the {manifestRole} " + + "is missing from the resource store. The registry was left unchanged."); + } + + byte[] content = document.Span.ToArray(); + string actualDigest = WotContentDigest.ToHex(WotContentDigest.Compute(content)); + if (!string.Equals(expectedDigest, actualDigest, StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry document '{expectedDigest}' has SHA-256 '{actualDigest}', " + + $"but the {manifestRole} requires '{expectedDigest}'. " + + "The registry was left unchanged."); + } + return content; + } + + private async ValueTask ReadBlobAsync( + string path, + string expectedDigest, + string manifestRole, + CancellationToken cancellationToken) + { + byte[] content; + try + { + content = await ReadAllBytesAsync(path, cancellationToken) + .ConfigureAwait(false); + } + catch (FileNotFoundException ex) + { + throw new InvalidDataException( + $"WoT registry blob '{path}' referenced by the {manifestRole} " + + "is missing. The registry was left unchanged.", + ex); + } + catch (DirectoryNotFoundException ex) + { + throw new InvalidDataException( + $"WoT registry blob directory for '{path}' referenced by the " + + $"{manifestRole} is missing. " + + "The registry was left unchanged.", + ex); + } + catch (IOException ex) + { + throw new IOException( + $"Unable to read WoT registry blob '{path}'. " + + "The registry was left unchanged.", + ex); + } + catch (UnauthorizedAccessException ex) + { + throw new IOException( + $"Access to WoT registry blob '{path}' was denied. " + + "The registry was left unchanged.", + ex); + } + + string actualDigest = WotContentDigest.ToHex(WotContentDigest.Compute(content)); + if (!string.Equals(expectedDigest, actualDigest, StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry blob '{path}' has SHA-256 '{actualDigest}', " + + $"but the {manifestRole} requires '{expectedDigest}'. " + + "The registry was left unchanged."); + } + return content; + } + + private static bool IsSha256Hex(string? value) + { + if (value?.Length != Sha256HexLength) + { + return false; + } + foreach (char character in value) + { + if (!((character >= '0' && character <= '9') || + (character >= 'a' && character <= 'f') || + (character >= 'A' && character <= 'F'))) + { + return false; + } + } + return true; + } + + private static void ValidateSegment(string value, string description) + { + string normalized; + try + { + normalized = WotRegistryService.NormalizeSegment(value, description); + } + catch (ArgumentException ex) + { + throw new InvalidDataException( + $"WoT registry {description} '{value}' is not segment-safe.", + ex); + } + if (!string.Equals(value, normalized, StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"WoT registry {description} '{value}' is not segment-safe."); + } + } + + private async ValueTask RollbackPristinePreSwitchFailureAsync( + WotRegistrySnapshot intendedSnapshot, + PristineCommitArtifacts? artifacts, + Exception persistenceFailure) + { + if (artifacts is null) + { + return; + } + + try + { + await RollbackPristinePreSwitchArtifactsAsync(artifacts) + .ConfigureAwait(false); + } + catch (Exception cleanupFailure) + when (IsConfirmedPreSwitchFailure(cleanupFailure)) + { + throw CreatePristineRollbackIndeterminate( + intendedSnapshot, + persistenceFailure, + cleanupFailure); + } + } + + private async ValueTask RollbackPristinePreSwitchArtifactsAsync( + PristineCommitArtifacts artifacts) + { + if (!ValidatePristinePreSwitchArtifacts(artifacts)) + { + return; + } + + string rollbackMarker = Path.Combine( + m_root, + ManifestFile + ".rollback-" + Guid.NewGuid().ToString("N")); + byte[] markerBytes = Array.Empty(); + await WriteThroughAsync( + rollbackMarker, + markerBytes, + CancellationToken.None, + artifacts.TrackFile) + .ConfigureAwait(false); + SyncDirectory( + m_root, + DirectorySyncPhase.RootAfterPristineRollbackMarker); + + foreach (string path in artifacts.Files + .Where(path => !PathsEqual(path, rollbackMarker)) + .OrderBy(path => path, s_fileSystemPathComparer)) + { + if (Directory.Exists(path)) + { + throw new InvalidDataException( + $"Pristine WoT registry rollback artifact '{path}' changed " + + "from a file to a directory."); + } + if (File.Exists(path)) + { + File.Delete(path); + } + } + + if (Directory.Exists(m_blobsFolder)) + { + string[] remaining = Directory.GetFileSystemEntries(m_blobsFolder); + if (remaining.Length != 0) + { + throw new InvalidDataException( + "The pristine WoT registry blob directory acquired unknown " + + $"artifacts during rollback: {string.Join(", ", remaining)}."); + } + SyncDirectory( + m_blobsFolder, + DirectorySyncPhase.BlobsAfterPristineRollback); + Directory.Delete(m_blobsFolder); + } + SyncDirectory( + m_root, + DirectorySyncPhase.RootAfterPristineRollback); + + await RemovePristineRollbackMarkerAsync(rollbackMarker, markerBytes) + .ConfigureAwait(false); + } + + private bool ValidatePristinePreSwitchArtifacts( + PristineCommitArtifacts artifacts) + { + bool foundArtifacts = false; + foreach (string path in FindRecoveryArtifacts()) + { + if (PathsEqual(path, m_blobsFolder)) + { + if (!artifacts.OwnsBlobsDirectory || !Directory.Exists(path)) + { + throw new InvalidDataException( + $"Unexpected WoT registry artifact '{path}' prevents " + + "a proven pristine rollback."); + } + foundArtifacts = true; + continue; + } + if (!artifacts.OwnsFile(path)) + { + throw new InvalidDataException( + $"Unknown WoT registry artifact '{path}' prevents a proven " + + "pristine rollback."); + } + ValidateOwnedRollbackFile(path); + foundArtifacts = true; + } + + if (Directory.Exists(m_blobsFolder)) + { + foreach (string path in Directory.GetFileSystemEntries(m_blobsFolder)) + { + if (!artifacts.OwnsFile(path)) + { + throw new InvalidDataException( + $"Unknown WoT registry blob artifact '{path}' prevents a " + + "proven pristine rollback."); + } + ValidateOwnedRollbackFile(path); + } + } + return foundArtifacts; + } + + private static void ValidateOwnedRollbackFile(string path) + { + FileAttributes attributes = File.GetAttributes(path); + if ((attributes & (FileAttributes.Directory | FileAttributes.ReparsePoint)) != 0) + { + throw new InvalidDataException( + $"Pristine WoT registry rollback artifact '{path}' is not a " + + "regular file."); + } + } + + private async ValueTask RemovePristineRollbackMarkerAsync( + string rollbackMarker, + byte[] markerBytes) + { + try + { + File.Delete(rollbackMarker); + SyncDirectory( + m_root, + DirectorySyncPhase.RootAfterPristineRollbackMarkerRemoval); + } + catch (Exception cleanupFailure) + when (IsConfirmedPreSwitchFailure(cleanupFailure)) + { + throw await PreservePristineRollbackMarkerAsync( + rollbackMarker, + markerBytes, + cleanupFailure) + .ConfigureAwait(false); + } + } + + private async ValueTask PreservePristineRollbackMarkerAsync( + string rollbackMarker, + byte[] markerBytes, + Exception cleanupFailure) + { + try + { + if (!File.Exists(rollbackMarker)) + { + await WriteThroughAsync( + rollbackMarker, + markerBytes, + CancellationToken.None) + .ConfigureAwait(false); + } + SyncDirectory( + m_root, + DirectorySyncPhase.RootAfterPristineRollbackMarker); + return new IOException( + "The pristine WoT registry rollback marker could not be " + + "durably removed and was retained.", + cleanupFailure); + } + catch (Exception retentionFailure) + when (IsConfirmedPreSwitchFailure(retentionFailure)) + { + return CreateRollbackMarkerRetentionFailure( + cleanupFailure, + retentionFailure); + } + } + + private static IOException CreateRollbackMarkerRetentionFailure( + Exception cleanupFailure, + Exception retentionFailure) + { + return new IOException( + "The pristine WoT registry rollback marker could neither be " + + "durably removed nor retained.", + new AggregateException(cleanupFailure, retentionFailure)); + } + + private WotRegistryCommitIndeterminateException + CreatePristineRollbackIndeterminate( + WotRegistrySnapshot intendedSnapshot, + Exception persistenceFailure, + Exception cleanupFailure) + { + m_expectedManifest = null; + m_expectedGeneration = null; + return new WotRegistryCommitIndeterminateException( + intendedSnapshot, + persistenceFailure, + new IOException( + "The confirmed pre-switch failure occurred on a pristine WoT " + + "registry, but rollback could not be proven durable. Any remaining " + + "store-owned artifacts were retained for fail-closed recovery. " + + $"Cleanup failure: {cleanupFailure.Message}", + cleanupFailure)); + } + + private static bool PathsEqual(string left, string right) + { + return s_fileSystemPathComparer.Equals(left, right); + } + + private static bool IsConfirmedPreSwitchFailure(Exception exception) + { + return exception is OperationCanceledException or + UnauthorizedAccessException or InvalidDataException or IOException; + } + + private static async ValueTask EnsureBlobAsync( + string path, + byte[] content, + string expectedDigest, + PristineCommitArtifacts? pristineArtifacts, + CancellationToken cancellationToken) + { + try + { + byte[] existing = await ReadAllBytesAsync(path, cancellationToken) + .ConfigureAwait(false); + string existingDigest = WotContentDigest.ToHex( + WotContentDigest.Compute(existing)); + if (!string.Equals( + expectedDigest, existingDigest, StringComparison.Ordinal)) + { + throw new InvalidDataException( + $"Existing WoT registry blob '{path}' has SHA-256 " + + $"'{existingDigest}', not '{expectedDigest}'."); + } + return; + } + catch (InvalidDataException) + { + throw; + } + catch (FileNotFoundException) + { + } + catch (DirectoryNotFoundException) + { + } + catch (UnauthorizedAccessException ex) + { + throw new IOException( + $"Access to existing WoT registry blob '{path}' was denied.", + ex); + } + catch (IOException ex) + { + throw new IOException( + $"Unable to validate existing WoT registry blob '{path}'.", + ex); + } + + await DurableWriteAsync( + path, + content, + pristineArtifacts, + cancellationToken) + .ConfigureAwait(false); + } + + private static async ValueTask ResourceStoreBlobMatchesAsync( + IXRegistryResourceStore resourceStore, + string resourceKey, + byte[] expected, + CancellationToken cancellationToken) + { + long length = await resourceStore.GetLengthAsync(resourceKey, cancellationToken) + .ConfigureAwait(false); + if (length != expected.Length || length < 0 || length > int.MaxValue) + { + return false; + } + + ByteString existing = await resourceStore + .ReadAsync(resourceKey, 0, (int)length, cancellationToken) + .ConfigureAwait(false); + if (existing.IsNull || existing.Length != expected.Length) + { + return false; + } + + return string.Equals( + resourceKey, + WotContentDigest.ToHex(WotContentDigest.Compute(existing.Span.ToArray())), + StringComparison.Ordinal); + } + + private static async ValueTask DurableWriteAsync( + string path, + byte[] bytes, + PristineCommitArtifacts? pristineArtifacts, + CancellationToken cancellationToken) + { + string directory = Path.GetDirectoryName(path)!; + Directory.CreateDirectory(directory); + string tmp = path + ".tmp-" + Guid.NewGuid().ToString("N"); + bool moved = false; + try + { + await WriteThroughAsync( + tmp, + bytes, + cancellationToken, + pristineArtifacts is null + ? null + : pristineArtifacts.TrackFile) + .ConfigureAwait(false); + File.Move(tmp, path); + pristineArtifacts?.TrackFile(path); + moved = true; + } + finally + { + if (!moved) + { + TryDelete(tmp); + } + } + } + + private async ValueTask AtomicReplaceManifestAsync( + WotRegistrySnapshot intendedSnapshot, + byte[] bytes, + ManifestStamp intendedStamp, + ManifestStamp expectedStamp, + long expectedGeneration, + PristineCommitArtifacts? pristineArtifacts, + CancellationToken cancellationToken) + { + string path = Path.Combine(m_root, ManifestFile); + string directory = Path.GetDirectoryName(path)!; + Directory.CreateDirectory(directory); + string tmp = path + ".tmp-" + Guid.NewGuid().ToString("N"); + string? replaceBackupPath = null; + bool preserveTemporary = false; + try + { + try + { + await WriteThroughAsync( + tmp, + bytes, + cancellationToken, + pristineArtifacts is null + ? null + : pristineArtifacts.TrackFile) + .ConfigureAwait(false); + SyncDirectory( + m_root, + DirectorySyncPhase.RootAfterManifestStaging); + } + catch (Exception failure) + when (pristineArtifacts is not null && + IsConfirmedPreSwitchFailure(failure)) + { + preserveTemporary = true; + await RollbackPristinePreSwitchFailureAsync( + intendedSnapshot, + pristineArtifacts, + failure) + .ConfigureAwait(false); + throw; + } + if (expectedStamp.Exists) + { + replaceBackupPath = + path + ".replace-backup-" + Guid.NewGuid().ToString("N"); + try + { + if (m_manifestReplace is null) + { + File.Replace(tmp, path, replaceBackupPath); + } + else + { + m_manifestReplace(tmp, path, replaceBackupPath); + } + } + catch (Exception replaceFailure) + { + // ReplaceFile can report failure after moving either source + // or destination. Preserve every artifact and classify only + // from validated disk state while the root lock is held. + preserveTemporary = true; + await ResolveReplaceFailureAsync( + intendedSnapshot, + bytes, + intendedStamp, + expectedStamp, + expectedGeneration, + tmp, + replaceBackupPath, + replaceFailure) + .ConfigureAwait(false); + throw; + } + } + else + { + File.Move(tmp, path); + } + preserveTemporary = true; + return replaceBackupPath; + } + finally + { + if (!preserveTemporary) + { + TryDelete(tmp); + } + } + } + + private async ValueTask ResolveReplaceFailureAsync( + WotRegistrySnapshot intendedSnapshot, + byte[] intendedManifestBytes, + ManifestStamp intendedStamp, + ManifestStamp expectedStamp, + long expectedGeneration, + string temporaryManifestPath, + string replaceBackupPath, + Exception replaceFailure) + { + ManifestCandidate primary = await InspectManifestCandidateAsync( + Path.Combine(m_root, ManifestFile), + "primary manifest") + .ConfigureAwait(false); + ManifestCandidate temporary = await InspectManifestCandidateAsync( + temporaryManifestPath, + "staged manifest") + .ConfigureAwait(false); + ManifestCandidate backup = await InspectManifestCandidateAsync( + replaceBackupPath, + "replace backup manifest") + .ConfigureAwait(false); + + if (MatchesIntended( + primary, + intendedSnapshot.Generation, + intendedStamp, + intendedManifestBytes)) + { + LoadedGeneration committed = primary.Generation!; + m_expectedManifest = committed.Stamp; + m_expectedGeneration = committed.Snapshot.Generation; + throw new WotRegistryCommitDurabilityUncertainException( + committed.Snapshot, + replaceFailure); + } + + if (MatchesGeneration(primary, expectedGeneration, expectedStamp) && + MatchesIntended( + temporary, + intendedSnapshot.Generation, + intendedStamp, + intendedManifestBytes)) + { + m_expectedManifest = expectedStamp; + m_expectedGeneration = expectedGeneration; + throw new WotRegistryCommitNotCommittedException( + intendedSnapshot, + replaceFailure, + temporaryManifestPath); + } + + m_expectedManifest = null; + m_expectedGeneration = null; + throw new WotRegistryCommitIndeterminateException( + intendedSnapshot, + replaceFailure, + new InvalidDataException( + "Unable to establish the result of the manifest replacement. " + + $"{primary.Describe()}; {temporary.Describe()}; {backup.Describe()}.")); + } + + private async ValueTask InspectManifestCandidateAsync( + string path, + string role) + { + try + { + LoadedGeneration? generation = await ReadGenerationAsync( + path, + role, + CancellationToken.None) + .ConfigureAwait(false); + return generation is null + ? ManifestCandidate.Missing(path, role) + : ManifestCandidate.Valid(path, role, generation); + } + catch (Exception validationFailure) + { + return ManifestCandidate.Invalid(path, role, validationFailure); + } + } + + private static bool MatchesGeneration( + ManifestCandidate candidate, + long generation, + ManifestStamp stamp) + { + return candidate.Generation is { } loaded && + loaded.Snapshot.Generation == generation && + loaded.Stamp.Equals(stamp); + } + + private static bool MatchesIntended( + ManifestCandidate candidate, + long generation, + ManifestStamp stamp, + byte[] manifestBytes) + { + return MatchesGeneration(candidate, generation, stamp) && + candidate.Generation!.ManifestBytes.AsSpan().SequenceEqual(manifestBytes); + } + + private static async ValueTask WriteThroughAsync( + string path, + byte[] bytes, + CancellationToken cancellationToken, + Action? fileCreated = null) + { + // FileOptions.WriteThrough bypasses the OS write cache so the bytes + // reach stable storage before the handle closes; this preserves the + // "blobs durable before manifest switch" ordering the commit relies on. + using var stream = new FileStream( + path, + FileMode.CreateNew, + FileAccess.Write, + FileShare.None, + bufferSize: 4096, + FileOptions.WriteThrough | FileOptions.Asynchronous); + fileCreated?.Invoke(path); +#if NETSTANDARD2_1_OR_GREATER || NET + await stream.WriteAsync(bytes.AsMemory(), cancellationToken).ConfigureAwait(false); +#else + await stream.WriteAsync(bytes, 0, bytes.Length, cancellationToken).ConfigureAwait(false); +#endif + await stream.FlushAsync(cancellationToken).ConfigureAwait(false); + stream.Flush(flushToDisk: true); + } + + private void SyncDirectory(string path, DirectorySyncPhase phase) + { + m_directorySyncFailureInjector?.Invoke(phase); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + using SafeFileHandle handle = CreateFileW( + path, + GenericWrite, + FileShareRead | FileShareWrite | FileShareDelete, + IntPtr.Zero, + OpenExisting, + FileFlagBackupSemantics, + IntPtr.Zero); + if (handle.IsInvalid) + { + int error = Marshal.GetLastWin32Error(); + throw new IOException( + $"Unable to open WoT registry directory '{path}' for a " + + $"durability flush.", + new Win32Exception(error)); + } + if (!FlushFileBuffers(handle)) + { + int error = Marshal.GetLastWin32Error(); + throw new IOException( + $"Unable to durably synchronize WoT registry directory '{path}'.", + new Win32Exception(error)); + } + return; + } + + byte[] utf8Path = System.Text.Encoding.UTF8.GetBytes(path + "\0"); + using SafeUnixDirectoryHandle directory = + OpenUnixDirectory(utf8Path, OpenReadOnly); + if (directory.IsInvalid) + { + int error = Marshal.GetLastWin32Error(); + throw new IOException( + $"Unable to open WoT registry directory '{path}' for a " + + $"durability flush.", + new Win32Exception(error)); + } + if (Fsync(directory) != 0) + { + int error = Marshal.GetLastWin32Error(); + throw new IOException( + $"Unable to durably synchronize WoT registry directory '{path}'.", + new Win32Exception(error)); + } + } + + private static async ValueTask ReadAllBytesAsync( + string path, + CancellationToken cancellationToken) + { +#if NETSTANDARD2_1_OR_GREATER || NET + return await File.ReadAllBytesAsync(path, cancellationToken).ConfigureAwait(false); +#else + await Task.CompletedTask.ConfigureAwait(false); + return File.ReadAllBytes(path); +#endif + } + + private static void TryDelete(string path) + { + try + { + if (File.Exists(path)) + { + File.Delete(path); + } + } + catch (IOException) + { + } + catch (UnauthorizedAccessException) + { + } + } + + private static string FormatDate(DateTime value) + { + return value.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture); + } + + private static DateTime ParseDate(string? value) + { + if (string.IsNullOrEmpty(value)) + { + return DateTime.MinValue; + } + return DateTime.TryParse( + value, + CultureInfo.InvariantCulture, + DateTimeStyles.RoundtripKind, + out DateTime parsed) + ? parsed + : DateTime.MinValue; + } + + private static NodeId ParseNodeId(string? value) + { + if (string.IsNullOrEmpty(value)) + { + return NodeId.Null; + } + try + { + return NodeId.Parse(value); + } + catch (ServiceResultException) + { + return NodeId.Null; + } + } + + [DllImport( + "kernel32.dll", + EntryPoint = "CreateFileW", + ExactSpelling = true, + CharSet = CharSet.Unicode, + SetLastError = true)] + [DefaultDllImportSearchPaths(DllImportSearchPath.System32)] + private static extern SafeFileHandle CreateFileW( + string fileName, + uint desiredAccess, + uint shareMode, + IntPtr securityAttributes, + uint creationDisposition, + uint flagsAndAttributes, + IntPtr templateFile); + + [DllImport( + "kernel32.dll", + EntryPoint = "FlushFileBuffers", + ExactSpelling = true, + SetLastError = true)] + [DefaultDllImportSearchPaths(DllImportSearchPath.System32)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool FlushFileBuffers(SafeFileHandle file); + + [DllImport( + "libc", + EntryPoint = "open", + ExactSpelling = true, + CallingConvention = CallingConvention.Cdecl, + SetLastError = true)] + [DefaultDllImportSearchPaths(DllImportSearchPath.SafeDirectories)] + private static extern SafeUnixDirectoryHandle OpenUnixDirectory( + [In] byte[] path, + int flags); + + [DllImport( + "libc", + EntryPoint = "fsync", + CallingConvention = CallingConvention.Cdecl, + SetLastError = true)] + [DefaultDllImportSearchPaths(DllImportSearchPath.SafeDirectories)] + private static extern int Fsync(SafeUnixDirectoryHandle file); + + [DllImport( + "libc", + EntryPoint = "close", + CallingConvention = CallingConvention.Cdecl, + SetLastError = true)] + [DefaultDllImportSearchPaths(DllImportSearchPath.SafeDirectories)] + private static extern int CloseUnix(IntPtr file); + + /// + /// Identifies the file-system durability barrier reached while committing manifest version 2. + /// + internal enum DirectorySyncPhase + { + /// + /// The parent directory for a created root path component is being flushed. + /// + RootComponentParent, + + /// + /// Blob content has been written and is being flushed before the manifest switch. + /// + BlobsBeforeManifest, + + /// + /// The registry root is being flushed before replacing the primary manifest. + /// + RootBeforeManifest, + + /// + /// The registry root is being flushed after staging the replacement manifest. + /// + RootAfterManifestStaging, + + /// + /// The registry root is being flushed after the primary manifest replacement. + /// + RootAfterManifest, + + /// + /// The registry root is being flushed after writing the pristine rollback marker. + /// + RootAfterPristineRollbackMarker, + + /// + /// Blob content is being flushed after restoring a pristine generation. + /// + BlobsAfterPristineRollback, + + /// + /// The registry root is being flushed after restoring pristine content. + /// + RootAfterPristineRollback, + + /// + /// The registry root is being flushed after removing the pristine rollback marker. + /// + RootAfterPristineRollbackMarkerRemoval + } + + private sealed class PristineCommitArtifacts + { + public PristineCommitArtifacts() + { + Files = new HashSet(s_fileSystemPathComparer); + } + + public bool OwnsBlobsDirectory { get; private set; } + + public HashSet Files { get; } + + public void ClaimBlobsDirectory() + { + OwnsBlobsDirectory = true; + } + + public bool OwnsFile(string path) + { + return Files.Contains(path); + } + + public void TrackFile(string path) + { + Files.Add(path); + } + } + + private sealed class StorageLock : IDisposable + { + public StorageLock(FileStream stream) + { + m_stream = stream; + } + + public void Dispose() + { + Interlocked.Exchange(ref m_stream, null)?.Dispose(); + } + private FileStream? m_stream; + } + + private sealed class SafeUnixDirectoryHandle : SafeHandleMinusOneIsInvalid + { + private SafeUnixDirectoryHandle() + : base(ownsHandle: true) + { + } + + protected override bool ReleaseHandle() + { + return CloseUnix(handle) == 0; + } + } + + private sealed class LoadedGeneration + { + public LoadedGeneration( + WotRegistrySnapshot snapshot, + ManifestStamp stamp, + byte[] manifestBytes) + { + Snapshot = snapshot; + Stamp = stamp; + ManifestBytes = manifestBytes; + } + + public WotRegistrySnapshot Snapshot { get; } + + public ManifestStamp Stamp { get; } + + public byte[] ManifestBytes { get; } + } + + private sealed class ValidatedCommit + { + public ValidatedCommit( + byte[] manifestBytes, + ManifestStamp stamp, + Dictionary blobs) + { + ManifestBytes = manifestBytes; + Stamp = stamp; + Blobs = blobs; + } + + public byte[] ManifestBytes { get; } + + public ManifestStamp Stamp { get; } + + public Dictionary Blobs { get; } + } + + private sealed class ManifestCandidate + { + private ManifestCandidate( + string path, + string role, + LoadedGeneration? generation, + Exception? failure) + { + Path = path; + Role = role; + Generation = generation; + Failure = failure; + } + + public string Path { get; } + + public string Role { get; } + + public LoadedGeneration? Generation { get; } + + public Exception? Failure { get; } + + public static ManifestCandidate Missing(string path, string role) + { + return new ManifestCandidate(path, role, generation: null, failure: null); + } + + public static ManifestCandidate Valid( + string path, + string role, + LoadedGeneration generation) + { + return new ManifestCandidate(path, role, generation, failure: null); + } + + public static ManifestCandidate Invalid( + string path, + string role, + Exception failure) + { + return new ManifestCandidate(path, role, generation: null, failure); + } + + public string Describe() + { + if (Generation is { } generation) + { + return $"{Role} '{Path}' is valid ({generation.Stamp})"; + } + if (Failure is { } failure) + { + return $"{Role} '{Path}' is invalid ({failure.Message})"; + } + return $"{Role} '{Path}' is absent"; + } + } + + private readonly struct ManifestStamp : IEquatable + { + public ManifestStamp(bool exists, long generation, string digestHex) + { + Exists = exists; + Generation = generation; + DigestHex = digestHex; + } + + public static ManifestStamp Absent => new( + exists: false, + generation: 0, + digestHex: string.Empty); + + public bool Exists { get; } + + public long Generation { get; } + + public string DigestHex { get; } + + public bool Equals(ManifestStamp other) + { + return Exists == other.Exists && + Generation == other.Generation && + string.Equals(DigestHex, other.DigestHex, StringComparison.Ordinal); + } + + public override bool Equals(object? obj) + { + return obj is ManifestStamp stamp && Equals(stamp); + } + + public override int GetHashCode() + { + unchecked + { + int hash = Exists ? 1 : 0; + hash = (hash * 397) ^ Generation.GetHashCode(); + hash = (hash * 397) ^ StringComparer.Ordinal.GetHashCode(DigestHex); + return hash; + } + } + + public override string ToString() + { + return Exists + ? $"generation {Generation}, manifest SHA-256 {DigestHex}" + : "an absent primary manifest"; + } + } + + private const string ManifestFile = "manifest.json"; + private const string LockFile = ".wot-registry.lock"; + private const string RegistryXid = "/"; + private const string RegistryNodeIdPath = "WoTRegistry"; + private const int CurrentSchemaVersion = 2; + private const int Sha256HexLength = 64; + private const int OpenReadOnly = 0; + private const uint GenericWrite = 0x40000000; + private const uint FileShareRead = 0x00000001; + private const uint FileShareWrite = 0x00000002; + private const uint FileShareDelete = 0x00000004; + private const uint OpenExisting = 3; + private const uint FileFlagBackupSemantics = 0x02000000; + private static readonly TimeSpan s_lockRetryDelay = TimeSpan.FromMilliseconds(25); + private static readonly StringComparer s_fileSystemPathComparer = + RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + ? StringComparer.OrdinalIgnoreCase + : StringComparer.Ordinal; + + private readonly string m_root; + private readonly string m_blobsFolder; + private readonly IXRegistryResourceStore? m_resourceStore; + private readonly string m_lockPath; + private readonly Action? m_directorySyncFailureInjector; + private readonly Action? m_manifestReplace; + private string[]? m_rootDurabilityPath; + private ManifestStamp? m_expectedManifest; + private long? m_expectedGeneration; + + /// + /// Serializes the manifest version 2 root document for the file-backed WoT registry store. + /// + internal sealed class ManifestDto + { + /// + /// Gets or sets the manifest schema version used to validate compatibility. + /// + public int SchemaVersion { get; set; } + + /// + /// Gets or sets the committed registry generation number. + /// + public long Generation { get; set; } + + /// + /// Gets or sets registry-level labels persisted with the manifest. + /// + public Dictionary? RegistryLabels { get; set; } + + /// + /// Gets or sets the resource groups contained in the generation. + /// + public GroupDto[]? Groups { get; set; } + } + + /// + /// Serializes one xRegistry group inside a manifest version 2 document. + /// + internal sealed class GroupDto + { + /// + /// Gets or sets the xRegistry group identifier. + /// + public string GroupId { get; set; } = string.Empty; + + /// + /// Gets or sets the serialized group kind. + /// + public int Kind { get; set; } + + /// + /// Gets or sets the display name stored for the group. + /// + public string Name { get; set; } = string.Empty; + + /// + /// Gets or sets the description stored for the group. + /// + public string Description { get; set; } = string.Empty; + + /// + /// Gets or sets the group epoch used for optimistic consistency. + /// + public long Epoch { get; set; } + + /// + /// Gets or sets group labels stored in the manifest. + /// + public Dictionary? Labels { get; set; } + + /// + /// Gets or sets the resources that belong to the group. + /// + public ResourceDto[]? Resources { get; set; } + } + + /// + /// Serializes one resource version entry inside a manifest version 2 resource. + /// + internal sealed class VersionDto + { + /// + /// Gets or sets the resource version identifier. + /// + public string VersionId { get; set; } = string.Empty; + + /// + /// Gets or sets the media type recorded for the version blob. + /// + public string? ContentType { get; set; } + + /// + /// Gets or sets the format label recorded for the version. + /// + public string? Format { get; set; } + + /// + /// Gets or sets the version creation timestamp text. + /// + public string? CreatedAt { get; set; } + + /// + /// Gets or sets the version modification timestamp text. + /// + public string? ModifiedAt { get; set; } + + /// + /// Gets or sets the SHA-256 digest of the version blob as hexadecimal text. + /// + public string? DigestHex { get; set; } + } + + /// + /// Serializes validation metadata for one manifest version 2 resource. + /// + internal sealed class ValidationDto + { + /// + /// Gets or sets whether the resource format has been validated. + /// + public bool FormatValidated { get; set; } + + /// + /// Gets or sets the serialized format validation outcome. + /// + public int FormatOutcome { get; set; } + + /// + /// Gets or sets the reason associated with the format validation outcome. + /// + public string? FormatReason { get; set; } + + /// + /// Gets or sets whether compatibility validation has run. + /// + public bool CompatibilityValidated { get; set; } + + /// + /// Gets or sets the serialized compatibility validation outcome. + /// + public int CompatibilityOutcome { get; set; } + + /// + /// Gets or sets the reason associated with the compatibility validation outcome. + /// + public string? CompatibilityReason { get; set; } + + /// + /// Gets or sets the compatibility policy used for validation. + /// + public string? CompatibilityPolicy { get; set; } + + /// + /// Gets or sets the timestamp text for the validation result. + /// + public string? ValidatedAt { get; set; } + + /// + /// Gets or sets the WoT vocabulary version used during validation. + /// + public string? VocabularyVersion { get; set; } + } + + /// + /// Serializes one xRegistry resource and its materialization state in manifest version 2. + /// + internal sealed class ResourceDto + { + /// + /// Gets or sets the identifier of the group that owns the resource. + /// + public string GroupId { get; set; } = string.Empty; + + /// + /// Gets or sets the xRegistry resource identifier. + /// + public string ResourceId { get; set; } = string.Empty; + + /// + /// Gets or sets the serialized resource kind. + /// + public int Kind { get; set; } + + /// + /// Gets or sets the display name stored for the resource. + /// + public string Name { get; set; } = string.Empty; + + /// + /// Gets or sets the description stored for the resource. + /// + public string Description { get; set; } = string.Empty; + + /// + /// Gets or sets the default version identifier for clients that do not request one. + /// + public string? DefaultVersionId { get; set; } + + /// + /// Gets or sets the desired version identifier selected by management operations. + /// + public string? DesiredVersionId { get; set; } + + /// + /// Gets or sets the active version identifier currently materialized. + /// + public string? ActiveVersionId { get; set; } + + /// + /// Gets or sets whether the resource participates in materialization. + /// + public bool Enabled { get; set; } + + /// + /// Gets or sets the serialized resource load state. + /// + public int LoadState { get; set; } + + /// + /// Gets or sets the resource epoch used for optimistic consistency. + /// + public long Epoch { get; set; } + + /// + /// Gets or sets the projection refresh generation that produced the materialized state. + /// + public uint RefreshGeneration { get; set; } + + /// + /// Gets or sets the timestamp text for the last projection refresh. + /// + public string? LastRefreshTime { get; set; } + + /// + /// Gets or sets the number of OPC UA nodes materialized for the resource. + /// + public int MaterializedNodeCount { get; set; } + + /// + /// Gets or sets the root OPC UA NodeId assigned to the materialized resource. + /// + public string? RootNodeId { get; set; } + + /// + /// Gets or sets the Thing Description identifier discovered in the active version. + /// + public string? ThingId { get; set; } + + /// + /// Gets or sets the Thing Description title discovered in the active version. + /// + public string? Title { get; set; } + + /// + /// Gets or sets diagnostic messages captured while loading or materializing the resource. + /// + public string[]? Diagnostics { get; set; } + + /// + /// Gets or sets validation metadata for the resource. + /// + public ValidationDto? Validation { get; set; } + + /// + /// Gets or sets the versions stored for the resource. + /// + public VersionDto[]? Versions { get; set; } + + /// + /// Gets or sets resource-level labels persisted with the manifest. + /// + public Dictionary? Labels { get; set; } + } + } + + /// + /// Source-generated JSON metadata serialization for the file-backed store, + /// keeping the store trimming/AOT-safe (no reflection-based serialization). + /// + [JsonSourceGenerationOptions( + WriteIndented = true, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] + [JsonSerializable(typeof(FileWotRegistryStore.ManifestDto))] + [JsonSerializable(typeof(FileWotRegistryStore.GroupDto))] + [JsonSerializable(typeof(FileWotRegistryStore.ResourceDto))] + [JsonSerializable(typeof(FileWotRegistryStore.VersionDto))] + [JsonSerializable(typeof(FileWotRegistryStore.ValidationDto))] + internal sealed partial class WotRegistryStoreJson : JsonSerializerContext; +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/IWotRegistryService.cs b/src/Opc.Ua.WotCon.Server/Registry/IWotRegistryService.cs new file mode 100644 index 0000000000..fb844c9707 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/IWotRegistryService.cs @@ -0,0 +1,480 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// A request to create or update a document resource (upload a TD/TM + /// version). The registry validates and stores the version and, when + /// is set, points the resource default/desired + /// version at the new version. + /// + public sealed class WotUpsertResourceRequest + { + /// + /// Gets or sets the target group id (defaults per ). + /// + public string? GroupId { get; set; } + + /// + /// Gets or sets the resource id; derived from the document when omitted. + /// + public string? ResourceId { get; set; } + + /// + /// Gets or sets the document kind. + /// + public WoTDocumentKindEnum Kind { get; set; } = WoTDocumentKindEnum.ThingDescription; + + /// + /// Gets or sets the raw document source bytes. + /// + public ReadOnlyMemory Content { get; set; } + + /// + /// Gets or sets the document media type. + /// + public string ContentType { get; set; } = "application/td+json"; + + /// + /// Gets or sets the document format tag. + /// + public string Format { get; set; } = "WoT-TD/1.1"; + + /// + /// Gets or sets an optional resource display name. + /// + public string? Name { get; set; } + + /// + /// Gets or sets an optional resource description. + /// + public string? Description { get; set; } + + /// + /// Gets or sets whether the new version becomes the resource's default + /// and desired version. Defaults to true. + /// + public bool SetAsDefault { get; set; } = true; + } + + /// + /// The result of a registry mutation. + /// + public sealed class WotRegistryMutationResult + { + internal WotRegistryMutationResult( + WoTOutcomeEnum outcome, + WotResource? resource, + long generation, + ImmutableArray diagnostics, + string? message = null) + { + Outcome = outcome; + Resource = resource; + Generation = generation; + Diagnostics = diagnostics.IsDefault ? [] : diagnostics; + Message = message ?? string.Empty; + } + + /// + /// Gets the outcome of the mutation. + /// + public WoTOutcomeEnum Outcome { get; } + + /// + /// Gets the affected resource snapshot, if any. + /// + public WotResource? Resource { get; } + + /// + /// Gets the registry generation after the mutation. + /// + public long Generation { get; } + + /// + /// Gets diagnostics produced by the mutation. + /// + public ImmutableArray Diagnostics { get; } + + /// + /// Gets a human-readable message. + /// + public string Message { get; } + + /// + /// Gets whether the mutation changed the registry contents. + /// + public bool Changed => Outcome is WoTOutcomeEnum.Success or WoTOutcomeEnum.Warning; + } + + /// + /// Describes a change to the registry snapshot. Content mutations + /// ( is false) drive re-materialization; + /// projection callbacks ( is true) only + /// refresh browseable projection state and must not re-trigger the + /// materialization coordinator. + /// + public sealed class WotRegistryChangedEventArgs : EventArgs + { + internal WotRegistryChangedEventArgs( + WotRegistrySnapshot previous, + WotRegistrySnapshot current, + IReadOnlyList changedResourceXids, + bool projectionOnly) + { + Previous = previous; + Current = current; + ChangedResourceXids = changedResourceXids; + ProjectionOnly = projectionOnly; + } + + /// + /// Gets the snapshot before the change. + /// + public WotRegistrySnapshot Previous { get; } + + /// + /// Gets the snapshot after the change. + /// + public WotRegistrySnapshot Current { get; } + + /// + /// Gets the xids of the resources that changed. + /// + public IReadOnlyList ChangedResourceXids { get; } + + /// + /// Gets whether the change only recorded projection state (and must not + /// re-trigger materialization). + /// + public bool ProjectionOnly { get; } + } + + /// + /// The projection state recorded back into the registry snapshot by the + /// materialization coordinator after a refresh. + /// + public sealed class WotResourceProjection + { + /// + /// Initializes a new projection record. + /// + public WotResourceProjection( + string groupId, + string resourceId, + WoTLoadStateEnum loadState, + string? activeVersionId, + uint refreshGeneration, + int materializedNodeCount, + NodeId rootNodeId, + WoTValidationOutcomeDataType? validation, + ImmutableArray diagnostics, + DateTime lastRefreshTime) + { + GroupId = groupId; + ResourceId = resourceId; + LoadState = loadState; + ActiveVersionId = activeVersionId; + RefreshGeneration = refreshGeneration; + MaterializedNodeCount = materializedNodeCount; + RootNodeId = rootNodeId; + Validation = validation; + Diagnostics = diagnostics.IsDefault ? [] : diagnostics; + LastRefreshTime = lastRefreshTime; + } + + /// + /// Gets the group id. + /// + public string GroupId { get; } + + /// + /// Gets the resource id. + /// + public string ResourceId { get; } + + /// + /// Gets the resulting load state. + /// + public WoTLoadStateEnum LoadState { get; } + + /// + /// Gets the active version id, if any. + /// + public string? ActiveVersionId { get; } + + /// + /// Gets the refresh generation. + /// + public uint RefreshGeneration { get; } + + /// + /// Gets the materialized node count. + /// + public int MaterializedNodeCount { get; } + + /// + /// Gets the root node of the projection, if any. + /// + public NodeId RootNodeId { get; } + + /// + /// Gets the validation outcome, if any. + /// + public WoTValidationOutcomeDataType? Validation { get; } + + /// + /// Gets the diagnostics. + /// + public ImmutableArray Diagnostics { get; } + + /// + /// Gets the UTC last-refresh time. + /// + public DateTime LastRefreshTime { get; } + + /// + /// Gets whether the projection failed to keep a previous active generation. + /// + public bool RetainPreviousActiveVersion { get; init; } + } + + /// + /// The stable, injectable registry service. It owns the current immutable + /// registry snapshot, serialises mutations, enforces resource bounds, + /// persists through an , and raises change + /// notifications the materialization coordinator and NodeManager react to. + /// + public interface IWotRegistryService + { + /// + /// Gets the current immutable snapshot. + /// + WotRegistrySnapshot Current { get; } + + /// + /// Gets the configured resource bounds. + /// + WotRegistryPersistenceBounds Bounds { get; } + + /// + /// Raised after a content mutation (upsert/delete/set-default/set-enabled) + /// or a projection callback. Consumers filter on + /// . + /// + event EventHandler? Changed; + + /// + /// Loads persisted state from the backing store. + /// + ValueTask InitializeAsync(CancellationToken cancellationToken = default); + + /// + /// Gets, or creates, a group. + /// + ValueTask GetOrCreateGroupAsync( + string groupId, + WoTDocumentKindEnum kind, + string? name = null, + CancellationToken cancellationToken = default); + + /// + /// Creates a group, failing (returning null) when a group with the + /// same id already exists. Use for the + /// idempotent create-or-get form. + /// + ValueTask TryCreateGroupAsync( + string groupId, + WoTDocumentKindEnum kind, + string? name = null, + CancellationToken cancellationToken = default); + + /// + /// Deletes a group and every resource it contains. + /// + ValueTask DeleteGroupAsync( + string groupId, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Gets, or creates, a content-less placeholder resource. The resource is + /// projected only once a version has been uploaded (through the inherited + /// FileType write path or ). + /// + ValueTask<(WotResource Resource, bool Created)> GetOrCreateResourceAsync( + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + CancellationToken cancellationToken = default); + + /// + /// Creates a content-less placeholder resource, failing (returning + /// null) when the resource already exists. Use + /// for the idempotent form. + /// + ValueTask TryCreateResourceAsync( + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + CancellationToken cancellationToken = default); + + /// + /// Validates the default version of a resource (format, and best-effort + /// compatibility), records the outcome as projection state, and returns it + /// without changing the resource's active projection. + /// + ValueTask ValidateResourceAsync( + string groupId, + string resourceId, + CancellationToken cancellationToken = default); + + /// + /// Creates or updates a document resource (uploads a version). + /// + ValueTask UpsertResourceAsync( + WotUpsertResourceRequest request, + CancellationToken cancellationToken = default); + + /// + /// Deletes a resource and all of its versions. + /// + ValueTask DeleteResourceAsync( + string groupId, + string resourceId, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Sets the default (and desired) version of a resource. + /// + ValueTask SetDefaultVersionAsync( + string groupId, + string resourceId, + string versionId, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Enables or disables a resource for projection. + /// + ValueTask SetEnabledAsync( + string groupId, + string resourceId, + bool enabled, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Adds or updates a registry-level xRegistry label (attribute). The + /// registry has no separate per-entity epoch, so + /// is compared against the current + /// snapshot . Throws a + /// for an invalid/reserved key, + /// an over-long value, or when the entity already holds the + /// configured maximum number of labels. + /// + ValueTask AddRegistryLabelAsync( + string key, + string value, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Removes a registry-level xRegistry label (attribute). + /// + ValueTask RemoveRegistryLabelAsync( + string key, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Adds or updates a group-level xRegistry label (attribute). See + /// for the validation and + /// concurrency semantics (here compared against the group's own + /// ). + /// + ValueTask AddGroupLabelAsync( + string groupId, + string key, + string value, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Removes a group-level xRegistry label (attribute). + /// + ValueTask RemoveGroupLabelAsync( + string groupId, + string key, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Adds or updates a resource-level xRegistry label (attribute). See + /// for the validation and + /// concurrency semantics (here compared against the resource's own + /// ). + /// + ValueTask AddResourceLabelAsync( + string groupId, + string resourceId, + string key, + string value, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Removes a resource-level xRegistry label (attribute). + /// + ValueTask RemoveResourceLabelAsync( + string groupId, + string resourceId, + string key, + long? expectedEpoch = null, + CancellationToken cancellationToken = default); + + /// + /// Records projection state produced by the materialization coordinator + /// back into the snapshot so the NodeManager can browse load state, + /// active version, generation and validation outcome. Raises a + /// projection-only change and never re-triggers materialization. + /// + ValueTask ApplyProjectionResultsAsync( + IReadOnlyList projections, + CancellationToken cancellationToken = default); + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/IWotRegistryStore.cs b/src/Opc.Ua.WotCon.Server/Registry/IWotRegistryStore.cs new file mode 100644 index 0000000000..547063ce79 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/IWotRegistryStore.cs @@ -0,0 +1,259 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// Persists the immutable registry snapshot behind a transactional + /// commit contract. A store owns exactly one committed generation and + /// exposes it through ; a mutation is made durable by + /// committing a complete replacement generation through + /// . + /// + /// + /// + /// stages the entire + /// durably before atomically switching the committed generation. Persistence + /// failures whose outcome can be established are reported as + /// or + /// . An + /// means the store cannot + /// establish which generation is active. + /// + /// + /// The publishes a validated committed snapshot + /// even when its final durability is uncertain, leaves the previous snapshot + /// published for a confirmed not-committed outcome, and blocks mutation after + /// an indeterminate result until a successful reload. + /// + /// + public interface IWotRegistryStore + { + /// + /// Loads the last committed registry generation into an immutable + /// snapshot. Returns when no + /// generation has ever been committed. Never observes a partially + /// written (staged, not-yet-committed) generation. + /// + ValueTask LoadAsync(CancellationToken cancellationToken = default); + + /// + /// Durably and atomically commits as the new + /// committed generation, replacing the previous one in full. Stages all + /// backing state first and only then switches the committed generation. + /// See , + /// , and + /// for explicit + /// persistence outcomes. + /// + /// The complete registry generation to commit. + /// A cancellation token. + ValueTask CommitAsync( + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken = default); + } + + /// + /// Indicates that the requested generation is the validated committed generation, + /// but a persistence operation still reported a failure. Callers should reload + /// before retrying because the mutation may already be durable. + /// + [SuppressMessage( + "Design", + "CA1032:Implement standard exception constructors", + Justification = "This outcome is meaningful only with its committed snapshot.")] + public sealed class WotRegistryCommitDurabilityUncertainException : IOException + { + /// + /// Initializes a committed, durability-uncertain outcome that external + /// implementations can report. + /// + /// The snapshot that became the active primary generation. + /// The failure reported after the commit became active. + /// + /// or is null. + /// + public WotRegistryCommitDurabilityUncertainException( + WotRegistrySnapshot committedSnapshot, + Exception persistenceFailure) + : base( + $"WoT registry generation " + + $"{(committedSnapshot ?? throw new ArgumentNullException( + nameof(committedSnapshot))).Generation} was committed, " + + "but its final durability is uncertain.", + persistenceFailure ?? throw new ArgumentNullException(nameof(persistenceFailure))) + { + CommittedSnapshot = committedSnapshot; + PersistenceFailure = persistenceFailure; + } + + /// + /// Gets the validated snapshot that is now the primary generation. + /// + public WotRegistrySnapshot CommittedSnapshot { get; } + + /// + /// Gets the committed registry generation. + /// + public long CommittedGeneration => CommittedSnapshot.Generation; + + /// + /// Gets the persistence failure reported after the generation became active. + /// + public Exception PersistenceFailure { get; } + } + + /// + /// Indicates that the requested generation was conclusively not committed. The + /// previous generation remains active and the mutation may be retried without + /// first reconciling an active partial commit. + /// + [SuppressMessage( + "Design", + "CA1032:Implement standard exception constructors", + Justification = "This outcome requires its intended snapshot and persistence failure.")] + public sealed class WotRegistryCommitNotCommittedException : IOException + { + /// + /// Initializes a confirmed not-committed outcome that external + /// implementations can report. + /// + /// The snapshot that failed before becoming active. + /// The failure that prevented the commit. + /// Optional path to a preserved artifact for operator recovery. + /// + /// or is null. + /// + public WotRegistryCommitNotCommittedException( + WotRegistrySnapshot intendedSnapshot, + Exception persistenceFailure, + string? recoveryArtifactPath = null) + : base( + $"WoT registry generation " + + $"{(intendedSnapshot ?? throw new ArgumentNullException( + nameof(intendedSnapshot))).Generation} was not committed; " + + "the previous generation remains active.", + persistenceFailure ?? throw new ArgumentNullException(nameof(persistenceFailure))) + { + IntendedSnapshot = intendedSnapshot; + PersistenceFailure = persistenceFailure; + RecoveryArtifactPath = recoveryArtifactPath; + } + + /// + /// Gets the snapshot that the failed operation intended to commit. + /// + public WotRegistrySnapshot IntendedSnapshot { get; } + + /// + /// Gets the intended registry generation. + /// + public long IntendedGeneration => IntendedSnapshot.Generation; + + /// + /// Gets the persistence failure that prevented the commit. + /// + public Exception PersistenceFailure { get; } + + /// + /// Gets an optional preserved recovery artifact containing the intended + /// manifest. + /// + public string? RecoveryArtifactPath { get; } + } + + /// + /// Indicates that a manifest switch may have occurred, but the resulting primary + /// generation could not be validated. Callers must not blindly retry; reload or + /// operator recovery is required to determine which generation is active. + /// + [SuppressMessage( + "Design", + "CA1032:Implement standard exception constructors", + Justification = "This outcome is meaningful only with its intended snapshot and failures.")] + public sealed class WotRegistryCommitIndeterminateException : IOException + { + /// + /// Initializes an indeterminate outcome that external + /// implementations can report. + /// + /// The snapshot whose commit outcome could not be established. + /// The failure reported by the persistence operation. + /// The failure encountered while validating the resulting primary. + /// + /// , , or + /// is null. + /// + public WotRegistryCommitIndeterminateException( + WotRegistrySnapshot intendedSnapshot, + Exception persistenceFailure, + Exception validationFailure) + : base( + $"The WoT registry commit outcome for generation " + + $"{(intendedSnapshot ?? throw new ArgumentNullException( + nameof(intendedSnapshot))).Generation} is indeterminate; reload or " + + "operator recovery is required.", + new AggregateException( + persistenceFailure ?? + throw new ArgumentNullException(nameof(persistenceFailure)), + validationFailure ?? + throw new ArgumentNullException(nameof(validationFailure)))) + { + IntendedSnapshot = intendedSnapshot; + PersistenceFailure = persistenceFailure; + ValidationFailure = validationFailure; + } + + /// + /// Gets the snapshot that the failed operation intended to commit. + /// + public WotRegistrySnapshot IntendedSnapshot { get; } + + /// + /// Gets the intended registry generation. + /// + public long IntendedGeneration => IntendedSnapshot.Generation; + + /// + /// Gets the persistence failure whose outcome could not be established. + /// + public Exception PersistenceFailure { get; } + + /// + /// Gets the failure encountered while validating the actual primary. + /// + public Exception ValidationFailure { get; } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/InMemoryWotRegistryStore.cs b/src/Opc.Ua.WotCon.Server/Registry/InMemoryWotRegistryStore.cs new file mode 100644 index 0000000000..61ff4527b4 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/InMemoryWotRegistryStore.cs @@ -0,0 +1,67 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// A process-local registry store that keeps its committed generation in + /// memory only. It implements the same transactional commit semantics as the + /// durable — a commit atomically switches + /// the single committed snapshot reference, so a failed commit leaves the + /// previously committed generation intact — but it persists nothing to disk, + /// so a fresh store instance (a process restart) starts from an empty + /// registry. Useful for tests and for servers whose documents are + /// re-populated programmatically at start-up. + /// + public sealed class InMemoryWotRegistryStore : IWotRegistryStore + { + /// + public ValueTask LoadAsync( + CancellationToken cancellationToken = default) + { + return new ValueTask(Volatile.Read(ref m_committed)); + } + + /// + public ValueTask CommitAsync( + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken = default) + { + // The immutable snapshot is committed by a single atomic reference + // switch, so a reader (LoadAsync) never observes a partial generation. + Volatile.Write(ref m_committed, snapshot ?? WotRegistrySnapshot.Empty); + return default; + } + + private WotRegistrySnapshot m_committed = WotRegistrySnapshot.Empty; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/WotBlobResourceStore.cs b/src/Opc.Ua.WotCon.Server/Registry/WotBlobResourceStore.cs new file mode 100644 index 0000000000..dfe84a5cd7 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/WotBlobResourceStore.cs @@ -0,0 +1,355 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.XRegistry.Server; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// An that keeps each document in one file named after + /// its store key, which for the WoT registry is the SHA-256 content digest. + /// + /// The layout is deliberately the one has always written — + /// {root}/{digest}.bin — so moving the byte layer behind the injectable xRegistry + /// interface needs no on-disk migration and existing registry folders keep working. Because the + /// key is a content digest the files are immutable: writing a document that is already present + /// is a no-op, and two resource versions with identical bytes share one file. + /// + /// + /// + /// Substituting a different is what lets a WoT registry + /// run in a high-availability or distributed deployment, because the documents then live in a + /// store every node can reach rather than in the server process. + /// + public sealed class WotBlobResourceStore : IXRegistryResourceStore, IDisposable + { + /// + /// Initializes the store over a directory of a file system. + /// + /// The directory that holds the document files. + /// The file system to use; defaults to the local one. + /// is null or empty. + public WotBlobResourceStore(string rootPath, IFileSystem? fileSystem = null) + { + if (string.IsNullOrEmpty(rootPath)) + { + throw new ArgumentException("A root path is required.", nameof(rootPath)); + } + + m_rootPath = rootPath; + m_fileSystem = fileSystem ?? LocalFileSystem.Instance; + } + + /// + public async ValueTask ReadAsync( + string resourceKey, + long offset, + int count, + CancellationToken ct = default) + { + string path = PathFor(resourceKey); + if (offset < 0) + { + throw new ArgumentOutOfRangeException(nameof(offset)); + } + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + await m_gate.WaitAsync(ct).ConfigureAwait(false); + try + { + if (!m_fileSystem.Exists(path)) + { + return default; + } + + using Stream stream = m_fileSystem.OpenRead(path); + if (offset >= stream.Length || count == 0) + { + return ByteString.From([]); + } + + int take = (int)Math.Min(count, stream.Length - offset); + stream.Seek(offset, SeekOrigin.Begin); + var chunk = new byte[take]; + int read = 0; + while (read < take) + { + int n = await ReadBlockAsync(stream, chunk, read, take - read, ct) + .ConfigureAwait(false); + if (n == 0) + { + break; + } + read += n; + } + return ByteString.From(read == take ? chunk : chunk.AsSpan(0, read).ToArray()); + } + finally + { + m_gate.Release(); + } + } + + /// + public async ValueTask WriteAsync( + string resourceKey, + long offset, + ByteString data, + CancellationToken ct = default) + { + string path = PathFor(resourceKey); + if (offset < 0) + { + throw new ArgumentOutOfRangeException(nameof(offset)); + } + + await m_gate.WaitAsync(ct).ConfigureAwait(false); + try + { + byte[] existing = m_fileSystem.Exists(path) + ? await ReadAllAsync(path, ct).ConfigureAwait(false) + : []; + ReadOnlySpan chunk = data.IsNull ? default : data.Span; + long mergedLength = Math.Max(existing.Length, offset + chunk.Length); + if (mergedLength > int.MaxValue) + { + throw new IOException("The blob is too large to stage in memory."); + } + var merged = new byte[(int)mergedLength]; + existing.CopyTo(merged.AsSpan()); + chunk.CopyTo(merged.AsSpan((int)offset)); + + await DurableWriteAsync(path, merged, ct).ConfigureAwait(false); + } + finally + { + m_gate.Release(); + } + } + + /// + public async ValueTask GetLengthAsync( + string resourceKey, + CancellationToken ct = default) + { + string path = PathFor(resourceKey); + await m_gate.WaitAsync(ct).ConfigureAwait(false); + try + { + if (!m_fileSystem.Exists(path)) + { + return -1; + } + return m_fileSystem.GetLength(path); + } + finally + { + m_gate.Release(); + } + } + + /// + public async ValueTask DeleteAsync( + string resourceKey, + CancellationToken ct = default) + { + string path = PathFor(resourceKey); + await m_gate.WaitAsync(ct).ConfigureAwait(false); + try + { + if (!m_fileSystem.Exists(path)) + { + return false; + } + m_fileSystem.Delete(path); + return true; + } + finally + { + m_gate.Release(); + } + } + + /// + /// Releases the semaphore that serializes access to the backing files. + /// + public void Dispose() + { + m_gate.Dispose(); + } + + private static async ValueTask ReadBlockAsync( + Stream stream, + byte[] buffer, + int offset, + int count, + CancellationToken ct) + { +#if NETFRAMEWORK || NETSTANDARD2_0 + return await stream.ReadAsync(buffer, offset, count, ct).ConfigureAwait(false); +#else + return await stream.ReadAsync(buffer.AsMemory(offset, count), ct).ConfigureAwait(false); +#endif + } + + private static async ValueTask WriteBlockAsync( + Stream stream, + byte[] buffer, + CancellationToken ct) + { +#if NETFRAMEWORK || NETSTANDARD2_0 + await stream.WriteAsync(buffer, 0, buffer.Length, ct).ConfigureAwait(false); +#else + await stream.WriteAsync(buffer.AsMemory(), ct).ConfigureAwait(false); +#endif + } + + private async ValueTask ReadAllAsync(string path, CancellationToken ct) + { + using Stream stream = m_fileSystem.OpenRead(path); + var buffer = new byte[stream.Length]; + int read = 0; + while (read < buffer.Length) + { + int n = await ReadBlockAsync(stream, buffer, read, buffer.Length - read, ct) + .ConfigureAwait(false); + if (n == 0) + { + break; + } + read += n; + } + return read == buffer.Length ? buffer : buffer.AsSpan(0, read).ToArray(); + } + + private async ValueTask DurableWriteAsync(string path, byte[] bytes, CancellationToken ct) + { + string directory = Path.GetDirectoryName(path)!; + string tempPath = Path.Combine( + directory, + Path.GetFileName(path) + ".tmp-" + Guid.NewGuid().ToString("N")); + try + { + using (Stream output = m_fileSystem.OpenWrite(tempPath)) + { + await WriteBlockAsync(output, bytes, ct).ConfigureAwait(false); + await output.FlushAsync(ct).ConfigureAwait(false); + } + + if (m_fileSystem is not IAtomicFileReplace atomic) + { + throw new IOException( + "Durable WoT blob storage requires a file system that supports atomic file replacement."); + } + + atomic.Replace(tempPath, path); + } + finally + { + try + { + if (m_fileSystem.Exists(tempPath)) + { + m_fileSystem.Delete(tempPath); + } + } + catch (IOException) + { + } + catch (UnauthorizedAccessException) + { + } + } + } + + /// + /// Maps a store key onto a file name. A content digest — the only key the WoT registry + /// uses — is already a safe file name and is kept verbatim so the layout matches what the + /// registry has always written. Any other key is hex-encoded and prefixed, which keeps the + /// store usable for arbitrary keys without letting an encoded key collide with a verbatim + /// one or escape the root directory. + /// + private string PathFor(string resourceKey) + { + if (string.IsNullOrEmpty(resourceKey)) + { + throw new ArgumentException("A resource key is required.", nameof(resourceKey)); + } + + return Path.Combine(m_rootPath, FileNameFor(resourceKey) + ".bin"); + } + + private static string FileNameFor(string resourceKey) + { + if (IsVerbatimSafe(resourceKey)) + { + return resourceKey; + } + + var name = new StringBuilder((resourceKey.Length * 2) + 1); + name.Append('_'); + foreach (byte b in Encoding.UTF8.GetBytes(resourceKey)) + { + name.Append(b.ToString("x2", CultureInfo.InvariantCulture)); + } + return name.ToString(); + } + + private static bool IsVerbatimSafe(string resourceKey) + { + foreach (char c in resourceKey) + { + // char.IsAsciiLetterOrDigit is .NET 7+; this also targets net48 and + // netstandard2.0, and char.IsLetterOrDigit would accept non-ASCII letters that are + // not safe in a file name. + bool ascii = (c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + (c >= 'A' && c <= 'Z'); + if (!ascii && c != '-') + { + return false; + } + } + return true; + } + + private readonly SemaphoreSlim m_gate = new(1, 1); + private readonly string m_rootPath; + private readonly IFileSystem m_fileSystem; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/WotLabelValidator.cs b/src/Opc.Ua.WotCon.Server/Registry/WotLabelValidator.cs new file mode 100644 index 0000000000..7c82d78312 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/WotLabelValidator.cs @@ -0,0 +1,113 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Opc.Ua.WotCon.Server.Assets; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// Validates xRegistry label (attribute) keys and values before they flow + /// into a materialized Labels (AttributesType) container: the key + /// becomes the child BrowseName and a + /// deterministic path segment. Reuses + /// for the shared control/BIDI/path + /// character checks and additionally rejects keys that would collide with + /// the container's own fixed AddAttribute/RemoveAttribute + /// Method BrowseNames. + /// + internal static class WotLabelValidator + { + /// + /// Validates a label key against the configured bounds, reserved + /// AttributesType member names and character-safety rules. + /// + public static ServiceResult ValidateKey(string? key, WotRegistryPersistenceBounds bounds) + { + if (string.IsNullOrEmpty(key)) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, "The Key argument is required."); + } + if (key!.Length > bounds.MaxLabelKeyLength) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The label key exceeds the maximum length of {0} characters.", + bounds.MaxLabelKeyLength); + } + if (string.Equals(key, XRegistry.BrowseNames.AddAttribute, StringComparison.Ordinal) || + string.Equals(key, XRegistry.BrowseNames.RemoveAttribute, StringComparison.Ordinal)) + { + return ServiceResult.Create( + StatusCodes.BadBrowseNameDuplicated, + "The label key '{0}' collides with a fixed Labels container member.", + key); + } + return WotChildNameValidator.Validate(key); + } + + /// + /// Validates a label value against the configured maximum length. + /// Any string content is otherwise accepted: the value is a + /// read-only Property value, not a BrowseName/NodeId path segment. + /// + public static ServiceResult ValidateValue(string? value, WotRegistryPersistenceBounds bounds) + { + if (value is not null && value.Length > bounds.MaxLabelValueLength) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, + "The label value exceeds the maximum length of {0} characters.", + bounds.MaxLabelValueLength); + } + return ServiceResult.Good; + } + + /// + /// Validates a key/value pair and throws a + /// with a precise StatusCode on + /// the first failing check. + /// + /// + public static void Validate(string? key, string? value, WotRegistryPersistenceBounds bounds) + { + ServiceResult keyResult = ValidateKey(key, bounds); + if (ServiceResult.IsBad(keyResult)) + { + throw new ServiceResultException(keyResult); + } + ServiceResult valueResult = ValidateValue(value, bounds); + if (ServiceResult.IsBad(valueResult)) + { + throw new ServiceResultException(valueResult); + } + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/WotRegistryModel.cs b/src/Opc.Ua.WotCon.Server/Registry/WotRegistryModel.cs new file mode 100644 index 0000000000..6c0df8fe18 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/WotRegistryModel.cs @@ -0,0 +1,678 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.Linq; +using System.Security.Cryptography; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// Computes the content digest used to detect unchanged registry documents. + /// + /// + /// The digest is a SHA-256 over the raw source bytes. It backs the + /// ContentDigest surfaced on the generated WoTDocumentType + /// and the idempotency check that lets an unchanged refresh return the + /// outcome without re-projecting. + /// + public static class WotContentDigest + { + /// + /// Computes the SHA-256 digest of the supplied document bytes. + /// + public static byte[] Compute(ReadOnlyMemory content) + { + using var sha = SHA256.Create(); + // TODO: SHA256.HashData is only available on .NET 5+; this project also + // targets net472/net48/netstandard2.1, where the instance ComputeHash API + // is the portable equivalent. Revisit if the minimum TFM floor is ever + // raised to drop those targets. +#pragma warning disable CA1850 + if (System.Runtime.InteropServices.MemoryMarshal.TryGetArray( + content, out ArraySegment segment) && + segment.Array is not null) + { + return sha.ComputeHash(segment.Array, segment.Offset, segment.Count); + } + return sha.ComputeHash(content.ToArray()); +#pragma warning restore CA1850 + } + + /// + /// Formats a digest as a lowercase hexadecimal string, or the empty + /// string when is null or empty. + /// + public static string ToHex(byte[]? digest) + { + if (digest is null || digest.Length == 0) + { + return string.Empty; + } + char[] chars = new char[digest.Length * 2]; + for (int i = 0; i < digest.Length; i++) + { + byte b = digest[i]; + chars[i * 2] = GetHexChar(b >> 4); + chars[(i * 2) + 1] = GetHexChar(b & 0xF); + } + return new string(chars); + } + + private static char GetHexChar(int nibble) + { + return (char)(nibble < 10 ? '0' + nibble : 'a' + (nibble - 10)); + } + + /// + /// Determines whether two digests are byte-for-byte equal. + /// + public static bool Equal(byte[]? left, byte[]? right) + { + if (ReferenceEquals(left, right)) + { + return true; + } + if (left is null || right is null) + { + return false; + } + return left.AsSpan().SequenceEqual(right); + } + } + + /// + /// An immutable snapshot of a single stored document version (an xRegistry + /// Version under a Resource). The raw bytes are the + /// authoritative source and are never mutated. + /// + public sealed class WotResourceVersion + { + /// + /// Initializes a new immutable version snapshot. + /// + public WotResourceVersion( + string versionId, + ReadOnlyMemory content, + string contentType, + string format, + DateTime createdAt, + DateTime modifiedAt, + byte[]? digest = null) + { + VersionId = versionId ?? throw new ArgumentNullException(nameof(versionId)); + Content = content; + ContentType = contentType ?? string.Empty; + Format = format ?? string.Empty; + CreatedAt = createdAt; + ModifiedAt = modifiedAt; + Digest = digest ?? WotContentDigest.Compute(content); + } + + /// + /// Gets the xRegistry versionid. + /// + public string VersionId { get; } + + /// + /// Gets the raw, authoritative document source bytes. + /// + public ReadOnlyMemory Content { get; } + + /// + /// Gets the media type of the document (for example application/td+json). + /// + public string ContentType { get; } + + /// + /// Gets the document format tag (for example WoT-TD/1.1). + /// + public string Format { get; } + + /// + /// Gets the UTC creation time. + /// + public DateTime CreatedAt { get; } + + /// + /// Gets the UTC modification time. + /// + public DateTime ModifiedAt { get; } + + /// + /// Gets the SHA-256 content digest of . + /// + public byte[] Digest { get; } + + /// + /// Gets the content digest as a lowercase hexadecimal string. + /// + public string DigestHex => WotContentDigest.ToHex(Digest); + } + + /// + /// Helpers for the xRegistry label/attribute dictionaries carried by + /// , and + /// . Ordinal key ordering keeps + /// enumeration (and therefore NodeManager materialization order) + /// deterministic regardless of insertion order. + /// + public static class WotLabels + { + /// + /// Gets the empty, ordinally-ordered label dictionary. + /// + public static ImmutableSortedDictionary Empty { get; } = + ImmutableSortedDictionary.Create(StringComparer.Ordinal); + } + + /// + /// An immutable snapshot of a single registered document resource, carrying + /// its versions, desired/active version pointers, and load/validation state. + /// + public sealed class WotResource + { + /// + /// Initializes a new immutable resource snapshot. + /// + public WotResource( + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + ImmutableArray versions, + string? defaultVersionId = null, + string? desiredVersionId = null, + string? activeVersionId = null, + bool enabled = true, + WoTLoadStateEnum loadState = WoTLoadStateEnum.Unloaded, + WoTValidationOutcomeDataType? validation = null, + ImmutableArray diagnostics = default, + long epoch = 0, + uint refreshGeneration = 0, + DateTime lastRefreshTime = default, + int materializedNodeCount = 0, + NodeId rootNodeId = default, + string? name = null, + string? description = null, + string? thingId = null, + string? title = null, + ImmutableSortedDictionary? labels = null) + { + GroupId = groupId ?? throw new ArgumentNullException(nameof(groupId)); + ResourceId = resourceId ?? throw new ArgumentNullException(nameof(resourceId)); + Kind = kind; + Versions = versions.IsDefault ? [] : versions; + DefaultVersionId = defaultVersionId; + DesiredVersionId = desiredVersionId ?? defaultVersionId; + ActiveVersionId = activeVersionId; + Enabled = enabled; + LoadState = loadState; + Validation = validation; + Diagnostics = diagnostics.IsDefault ? [] : diagnostics; + Epoch = epoch; + RefreshGeneration = refreshGeneration; + LastRefreshTime = lastRefreshTime; + MaterializedNodeCount = materializedNodeCount; + RootNodeId = rootNodeId; + Name = name ?? resourceId; + Description = description ?? string.Empty; + ThingId = thingId; + Title = title; + Labels = labels ?? WotLabels.Empty; + } + + /// + /// Gets the owning group id. + /// + public string GroupId { get; } + + /// + /// Gets the xRegistry resourceid. + /// + public string ResourceId { get; } + + /// + /// Gets the xRegistry xid (/groups/{group}/resources/{resource}). + /// + public string Xid => $"/groups/{GroupId}/resources/{ResourceId}"; + + /// + /// Gets whether the document is a Thing Description or Thing Model. + /// + public WoTDocumentKindEnum Kind { get; } + + /// + /// Gets the immutable set of versions, oldest first. + /// + public ImmutableArray Versions { get; } + + /// + /// Gets the versionid marked as default (the projected version). + /// + public string? DefaultVersionId { get; } + + /// + /// Gets the versionid the operator wants active. + /// + public string? DesiredVersionId { get; } + + /// + /// Gets the versionid currently projected into the AddressSpace. + /// + public string? ActiveVersionId { get; } + + /// + /// Gets whether the resource is enabled for projection. + /// + public bool Enabled { get; } + + /// + /// Gets the current load/projection state. + /// + public WoTLoadStateEnum LoadState { get; } + + /// + /// Gets the last validation outcome, if any. + /// + public WoTValidationOutcomeDataType? Validation { get; } + + /// + /// Gets the human-readable diagnostics for the last operation. + /// + public ImmutableArray Diagnostics { get; } + + /// + /// Gets the resource epoch (bumped on every mutation). + /// + public long Epoch { get; } + + /// + /// Gets the refresh generation of the active projection. + /// + public uint RefreshGeneration { get; } + + /// + /// Gets the UTC time of the last refresh. + /// + public DateTime LastRefreshTime { get; } + + /// + /// Gets the number of AddressSpace nodes materialized for the active projection. + /// + public int MaterializedNodeCount { get; } + + /// + /// Gets the root node of the active projection, if any. + /// + public NodeId RootNodeId { get; } + + /// + /// Gets the resource display name. + /// + public string Name { get; } + + /// + /// Gets the resource description. + /// + public string Description { get; } + + /// + /// Gets the WoT Thing id parsed from the default document (TD only). + /// + public string? ThingId { get; } + + /// + /// Gets the WoT title parsed from the default document. + /// + public string? Title { get; } + + /// + /// Gets the resource's extensible xRegistry labels/attributes, + /// ordinally ordered by key. Materialized as the resource's + /// browseable Labels (AttributesType) container. + /// + public ImmutableSortedDictionary Labels { get; } + + /// + /// Gets the default (or desired) version snapshot, if present. + /// + public WotResourceVersion? DefaultVersion + => FindVersion(DesiredVersionId ?? DefaultVersionId); + + /// + /// Gets the active version snapshot, if present. + /// + public WotResourceVersion? ActiveVersion => FindVersion(ActiveVersionId); + + /// + /// Finds a version by id. + /// + public WotResourceVersion? FindVersion(string? versionId) + { + if (string.IsNullOrEmpty(versionId)) + { + return null; + } + foreach (WotResourceVersion version in Versions) + { + if (string.Equals(version.VersionId, versionId, StringComparison.Ordinal)) + { + return version; + } + } + return null; + } + + /// + /// Creates a copy of this resource with selected fields replaced. + /// + public WotResource With( + ImmutableArray? versions = null, + string? defaultVersionId = null, + string? desiredVersionId = null, + string? activeVersionId = null, + bool? enabled = null, + WoTLoadStateEnum? loadState = null, + WoTValidationOutcomeDataType? validation = null, + ImmutableArray? diagnostics = null, + long? epoch = null, + uint? refreshGeneration = null, + DateTime? lastRefreshTime = null, + int? materializedNodeCount = null, + NodeId rootNodeId = default, + string? name = null, + string? description = null, + string? thingId = null, + string? title = null, + ImmutableSortedDictionary? labels = null, + bool clearActiveVersion = false, + bool clearValidation = false, + bool clearRootNodeId = false) + { + return new WotResource( + GroupId, + ResourceId, + Kind, + versions ?? Versions, + defaultVersionId ?? DefaultVersionId, + desiredVersionId ?? DesiredVersionId, + clearActiveVersion ? null : (activeVersionId ?? ActiveVersionId), + enabled ?? Enabled, + loadState ?? LoadState, + clearValidation ? null : (validation ?? Validation), + diagnostics ?? Diagnostics, + epoch ?? Epoch, + refreshGeneration ?? RefreshGeneration, + lastRefreshTime ?? LastRefreshTime, + materializedNodeCount ?? MaterializedNodeCount, + clearRootNodeId ? NodeId.Null : (rootNodeId.IsNull ? RootNodeId : rootNodeId), + name ?? Name, + description ?? Description, + thingId ?? ThingId, + title ?? Title, + labels ?? Labels); + } + } + + /// + /// An immutable snapshot of a document group (an xRegistry Group). A group + /// is homogeneous in : the well-known + /// ThingDescriptions and ThingModels groups map to + /// and + /// . + /// + public sealed class WotResourceGroup + { + /// + /// Initializes a new immutable group snapshot. + /// + public WotResourceGroup( + string groupId, + WoTDocumentKindEnum kind, + ImmutableDictionary? resources = null, + string? name = null, + string? description = null, + long epoch = 0, + ImmutableSortedDictionary? labels = null) + { + GroupId = groupId ?? throw new ArgumentNullException(nameof(groupId)); + Kind = kind; + Resources = resources ?? []; + Name = name ?? groupId; + Description = description ?? string.Empty; + Epoch = epoch; + Labels = labels ?? WotLabels.Empty; + } + + /// + /// Gets the xRegistry groupid. + /// + public string GroupId { get; } + + /// + /// Gets the xRegistry xid (/groups/{group}). + /// + public string Xid => $"/groups/{GroupId}"; + + /// + /// Gets the document kind shared by all resources in this group. + /// + public WoTDocumentKindEnum Kind { get; } + + /// + /// Gets the resources keyed by resourceid. + /// + public ImmutableDictionary Resources { get; } + + /// + /// Gets the group display name. + /// + public string Name { get; } + + /// + /// Gets the group description. + /// + public string Description { get; } + + /// + /// Gets the group epoch. + /// + public long Epoch { get; } + + /// + /// Gets the group's extensible xRegistry labels/attributes, ordinally + /// ordered by key. Materialized as the group's browseable + /// Labels (AttributesType) container. + /// + public ImmutableSortedDictionary Labels { get; } + + /// + /// Returns a copy of this group with the resource set replaced. + /// + public WotResourceGroup WithResources( + ImmutableDictionary resources, + long epoch) + { + return new WotResourceGroup(GroupId, Kind, resources, Name, Description, epoch, Labels); + } + + /// + /// Returns a copy of this group with the label set replaced. + /// + public WotResourceGroup WithLabels( + ImmutableSortedDictionary labels, + long epoch) + { + return new WotResourceGroup(GroupId, Kind, Resources, Name, Description, epoch, labels); + } + } + + /// + /// An immutable, point-in-time snapshot of the entire WoT registry. Each + /// mutation of the registry produces a new snapshot with a strictly greater + /// ; readers hold a snapshot reference and never see + /// a partially-applied change. + /// + public sealed class WotRegistrySnapshot + { + /// + /// Gets the empty snapshot (generation 0, no groups). + /// + public static WotRegistrySnapshot Empty { get; } = + new WotRegistrySnapshot(0, []); + + /// + /// Initializes a new immutable registry snapshot. + /// + public WotRegistrySnapshot( + long generation, + ImmutableDictionary groups, + ImmutableSortedDictionary? labels = null) + { + Generation = generation; + Groups = groups ?? []; + Labels = labels ?? WotLabels.Empty; + } + + /// + /// Gets the monotonically increasing snapshot generation (registry epoch). + /// + public long Generation { get; } + + /// + /// Gets the groups keyed by groupid. + /// + public ImmutableDictionary Groups { get; } + + /// + /// Gets the registry-level extensible xRegistry labels/attributes, + /// ordinally ordered by key. Materialized as the well-known + /// WoTRegistry object's browseable Labels + /// (AttributesType) container. Optimistic-concurrency checks against + /// these labels compare against , since the + /// singleton registry object has no separate per-entity epoch. + /// + public ImmutableSortedDictionary Labels { get; } + + /// + /// Enumerates every resource across all groups. + /// + public IEnumerable AllResources() + { + foreach (WotResourceGroup group in Groups.Values) + { + foreach (WotResource resource in group.Resources.Values) + { + yield return resource; + } + } + } + + /// + /// Enumerates every resource of the requested kind. + /// + public IEnumerable ResourcesOfKind(WoTDocumentKindEnum kind) + { + return AllResources().Where(r => r.Kind == kind); + } + + /// + /// Finds a group by id, or null. + /// + public WotResourceGroup? FindGroup(string groupId) + { + return Groups.TryGetValue(groupId, out WotResourceGroup? group) ? group : null; + } + + /// + /// Finds a resource by group and resource id, or null. + /// + public WotResource? FindResource(string groupId, string resourceId) + { + if (Groups.TryGetValue(groupId, out WotResourceGroup? group) && + group.Resources.TryGetValue(resourceId, out WotResource? resource)) + { + return resource; + } + return null; + } + + /// + /// Finds a resource by its xRegistry xid, or null. + /// + public WotResource? FindResourceByXid(string xid) + { + return AllResources().FirstOrDefault( + r => string.Equals(r.Xid, xid, StringComparison.Ordinal)); + } + + /// + /// Produces a new snapshot with upserted and the + /// generation advanced to . + /// + /// + public WotRegistrySnapshot WithGroup(WotResourceGroup group, long generation) + { + if (group is null) + { + throw new ArgumentNullException(nameof(group)); + } + return new WotRegistrySnapshot(generation, Groups.SetItem(group.GroupId, group), Labels); + } + + /// + /// Produces a new snapshot with a group removed. + /// + public WotRegistrySnapshot WithoutGroup(string groupId, long generation) + { + return new WotRegistrySnapshot(generation, Groups.Remove(groupId), Labels); + } + + /// + /// Produces a new snapshot with the registry-level label set replaced. + /// + public WotRegistrySnapshot WithLabels( + ImmutableSortedDictionary labels, long generation) + { + return new WotRegistrySnapshot(generation, Groups, labels); + } + + /// + /// Formats a monotonic version id from the sequence number, using the + /// zero-padded, lexicographically sortable form used by the file store. + /// + public static string FormatVersionId(long sequence) + { + return sequence.ToString("D19", CultureInfo.InvariantCulture); + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/WotRegistryPersistenceBounds.cs b/src/Opc.Ua.WotCon.Server/Registry/WotRegistryPersistenceBounds.cs new file mode 100644 index 0000000000..b24ffbb8f8 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/WotRegistryPersistenceBounds.cs @@ -0,0 +1,132 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// Bounds enforced by the registry service before a document is accepted or + /// persisted. They cap the resource cost of a hostile or misbehaving client + /// and mirror the bounded-resolution limits used by the + /// . + /// + public sealed class WotRegistryPersistenceBounds + { + /// + /// Gets or sets the maximum accepted size of a single document. + /// + public int MaxDocumentBytes { get; set; } = 4 * 1024 * 1024; + + /// + /// Gets or sets the maximum number of retained versions per resource. + /// + public int MaxVersionsPerResource { get; set; } = 32; + + /// + /// Gets or sets the maximum number of resources per group. + /// + public int MaxResourcesPerGroup { get; set; } = 1024; + + /// + /// Gets or sets the maximum number of groups. + /// + public int MaxGroups { get; set; } = 64; + + /// + /// Gets or sets the maximum number of concurrently open FileType handles + /// per document resource. + /// + public int MaxOpenFileHandles { get; set; } = 8; + + /// + /// Gets or sets the maximum JSON nesting depth accepted when the + /// service parses a document for metadata extraction. + /// + public int MaxJsonDepth { get; set; } = 64; + + /// + /// Gets or sets the maximum number of xRegistry labels/attributes + /// retained on a single entity (registry, group or resource). + /// + public int MaxLabelsPerEntity { get; set; } = 64; + + /// + /// Gets or sets the maximum length of a label key. Also bounds the + /// BrowseName/NodeId path segment materialized for the label. + /// + public int MaxLabelKeyLength { get; set; } = 128; + + /// + /// Gets or sets the maximum length of a label value. + /// + public int MaxLabelValueLength { get; set; } = 4096; + + /// + /// Validates the bounds and throws when any limit is not strictly positive. + /// + public void Validate() + { + EnsurePositive(MaxDocumentBytes, nameof(MaxDocumentBytes)); + EnsurePositive(MaxVersionsPerResource, nameof(MaxVersionsPerResource)); + EnsurePositive(MaxResourcesPerGroup, nameof(MaxResourcesPerGroup)); + EnsurePositive(MaxGroups, nameof(MaxGroups)); + EnsurePositive(MaxJsonDepth, nameof(MaxJsonDepth)); + EnsurePositive(MaxLabelsPerEntity, nameof(MaxLabelsPerEntity)); + EnsurePositive(MaxLabelKeyLength, nameof(MaxLabelKeyLength)); + EnsurePositive(MaxLabelValueLength, nameof(MaxLabelValueLength)); + } + + private static void EnsurePositive(int value, string name) + { + if (value <= 0) + { + throw new ArgumentOutOfRangeException( + name, value, "The configured limit must be a positive value."); + } + } + } + + /// + /// The well-known group identifiers a WoT registry always exposes: the two + /// reserved Thing Description and Thing Model groups. + /// + public static class WotRegistryGroups + { + /// + /// The reserved Thing Description group id. + /// + public const string ThingDescriptions = "thingdescriptions"; + + /// + /// The reserved Thing Model group id. + /// + public const string ThingModels = "thingmodels"; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/WotRegistryService.cs b/src/Opc.Ua.WotCon.Server/Registry/WotRegistryService.cs new file mode 100644 index 0000000000..f2379852d2 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/WotRegistryService.cs @@ -0,0 +1,1180 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Wot; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// The default . Owns the current + /// immutable , serialises every mutation on + /// a single lock, enforces the configured , + /// and persists through the injected . Every + /// mutation is persisted by before + /// the new snapshot is published. A pre-switch failure leaves + /// unchanged. If the store validates that the manifest + /// switched but final durability is uncertain, the service publishes the + /// committed snapshot and then surfaces the dedicated exception. A confirmed + /// not-committed outcome leaves the previous snapshot published and remains + /// retryable. An indeterminate commit blocks mutation until + /// reloads a known generation. + /// + public sealed class WotRegistryService : IWotRegistryService, IDisposable + { + /// + /// Initializes a new registry service over the supplied store. + /// + public WotRegistryService( + IWotRegistryStore? store = null, + WotRegistryPersistenceBounds? bounds = null) + { + m_store = store ?? new InMemoryWotRegistryStore(); + Bounds = bounds ?? new WotRegistryPersistenceBounds(); + Bounds.Validate(); + m_snapshot = WotRegistrySnapshot.Empty; + } + + /// + public WotRegistrySnapshot Current => Volatile.Read(ref m_snapshot); + + /// + public WotRegistryPersistenceBounds Bounds { get; } + + /// + public event EventHandler? Changed; + + /// + public async ValueTask InitializeAsync(CancellationToken cancellationToken = default) + { + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + m_reloadRequired = true; + WotRegistrySnapshot loaded = await m_store + .LoadAsync(cancellationToken).ConfigureAwait(false); + Volatile.Write(ref m_snapshot, loaded); + m_reloadRequired = false; + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask GetOrCreateGroupAsync( + string groupId, + WoTDocumentKindEnum kind, + string? name = null, + CancellationToken cancellationToken = default) + { + groupId = NormalizeSegment(groupId, nameof(groupId)); + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + WotResourceGroup? existing = snapshot.FindGroup(groupId); + if (existing is not null) + { + return existing; + } + if (snapshot.Groups.Count >= Bounds.MaxGroups) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + $"The registry already holds the maximum of {Bounds.MaxGroups} groups."); + } + long generation = snapshot.Generation + 1; + var group = new WotResourceGroup( + groupId, kind, name: name, epoch: generation); + WotRegistrySnapshot next = snapshot.WithGroup(group, generation); + await CommitAndPublishAsync( + snapshot, next, [group.Xid], projectionOnly: false, cancellationToken) + .ConfigureAwait(false); + return group; + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask TryCreateGroupAsync( + string groupId, + WoTDocumentKindEnum kind, + string? name = null, + CancellationToken cancellationToken = default) + { + groupId = NormalizeSegment(groupId, nameof(groupId)); + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + if (snapshot.FindGroup(groupId) is not null) + { + return null; + } + if (snapshot.Groups.Count >= Bounds.MaxGroups) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + $"The registry already holds the maximum of {Bounds.MaxGroups} groups."); + } + long generation = snapshot.Generation + 1; + var group = new WotResourceGroup(groupId, kind, name: name, epoch: generation); + WotRegistrySnapshot next = snapshot.WithGroup(group, generation); + await CommitAndPublishAsync( + snapshot, next, [group.Xid], projectionOnly: false, cancellationToken) + .ConfigureAwait(false); + return group; + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask DeleteGroupAsync( + string groupId, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + WotResourceGroup? group = snapshot.FindGroup(groupId); + if (group is null) + { + return Failed(snapshot.Generation, "Group not found."); + } + if (expectedEpoch is { } epoch && epoch != group.Epoch) + { + return Rejected(snapshot.Generation, "Epoch mismatch."); + } + long generation = snapshot.Generation + 1; + WotRegistrySnapshot next = snapshot.WithoutGroup(groupId, generation); + var changed = new List { group.Xid }; + foreach (WotResource resource in group.Resources.Values) + { + changed.Add(resource.Xid); + } + await CommitAndPublishAsync( + snapshot, next, changed, projectionOnly: false, cancellationToken) + .ConfigureAwait(false); + return new WotRegistryMutationResult( + WoTOutcomeEnum.Success, null, generation, []); + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask<(WotResource Resource, bool Created)> GetOrCreateResourceAsync( + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + CancellationToken cancellationToken = default) + { + groupId = NormalizeSegment(groupId, nameof(groupId)); + resourceId = NormalizeSegment(resourceId, nameof(resourceId)); + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotResource? existing = m_snapshot.FindResource(groupId, resourceId); + if (existing is not null) + { + return (existing, false); + } + WotResource created = await CreatePlaceholderLockedAsync( + groupId, resourceId, kind, cancellationToken).ConfigureAwait(false); + return (created, true); + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask TryCreateResourceAsync( + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + CancellationToken cancellationToken = default) + { + groupId = NormalizeSegment(groupId, nameof(groupId)); + resourceId = NormalizeSegment(resourceId, nameof(resourceId)); + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + if (m_snapshot.FindResource(groupId, resourceId) is not null) + { + return null; + } + return await CreatePlaceholderLockedAsync( + groupId, resourceId, kind, cancellationToken).ConfigureAwait(false); + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask ValidateResourceAsync( + string groupId, + string resourceId, + CancellationToken cancellationToken = default) + { + WotResource? resource = m_snapshot.FindResource(groupId, resourceId) ?? + throw new ServiceResultException( + StatusCodes.BadNodeIdUnknown, "Resource not found."); + WotResourceVersion? version = resource.DefaultVersion ?? + throw new ServiceResultException( + StatusCodes.BadInvalidState, "The resource has no default version to validate."); + WoTValidationOutcomeDataType outcome = ValidateContent(version.Content); + + await MutateResourceAsync( + groupId, + resourceId, + expectedEpoch: null, + (current, generation) => ( + current.With(validation: outcome, epoch: current.Epoch), + null), + cancellationToken).ConfigureAwait(false); + return outcome; + } + + private async ValueTask CreatePlaceholderLockedAsync( + string groupId, + string resourceId, + WoTDocumentKindEnum kind, + CancellationToken cancellationToken) + { + WotRegistrySnapshot snapshot = m_snapshot; + WotResourceGroup? group = snapshot.FindGroup(groupId); + if (group is null) + { + // Implicit group creation must enforce MaxGroups identically to the + // explicit GetOrCreateGroupAsync / TryCreateGroupAsync paths. + if (snapshot.Groups.Count >= Bounds.MaxGroups) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + $"The registry already holds the maximum of {Bounds.MaxGroups} groups."); + } + group = new WotResourceGroup(groupId, kind, epoch: snapshot.Generation + 1); + } + if (group.Resources.Count >= Bounds.MaxResourcesPerGroup) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + $"Group '{groupId}' already holds the maximum of " + + $"{Bounds.MaxResourcesPerGroup} resources."); + } + long generation = snapshot.Generation + 1; + var resource = new WotResource( + groupId, + resourceId, + kind, + [], + enabled: true, + loadState: WoTLoadStateEnum.Unloaded, + epoch: generation, + name: resourceId); + WotRegistrySnapshot next = ReplaceResource(snapshot, group, resource, generation); + await CommitAndPublishAsync( + snapshot, next, [resource.Xid], projectionOnly: false, cancellationToken) + .ConfigureAwait(false); + return resource; + } + + private static WoTValidationOutcomeDataType ValidateContent(ReadOnlyMemory content) + { + try + { + using var document = WotDocument.Parse(content); + _ = document.Id; + return new WoTValidationOutcomeDataType + { + FormatValidated = true, + FormatOutcome = WoTOutcomeEnum.Success, + CompatibilityValidated = false, + CompatibilityOutcome = WoTOutcomeEnum.Skipped, + ValidatedAt = DateTime.UtcNow, + VocabularyVersion = WotNodeSetConverter.VocabularyNamespace + }; + } + catch (Exception ex) when (ex is JsonException or FormatException) + { + return FailedValidation(ex.Message); + } + } + + /// + public async ValueTask UpsertResourceAsync( + WotUpsertResourceRequest request, + CancellationToken cancellationToken = default) + { + if (request is null) + { + throw new ArgumentNullException(nameof(request)); + } + if (request.Content.Length == 0) + { + return Failed(m_snapshot.Generation, "The document is empty."); + } + if (request.Content.Length > Bounds.MaxDocumentBytes) + { + return new WotRegistryMutationResult( + WoTOutcomeEnum.Rejected, + null, + m_snapshot.Generation, + [$"The document exceeds the maximum size of {Bounds.MaxDocumentBytes} bytes."], + "Document too large."); + } + + string groupId = string.IsNullOrWhiteSpace(request.GroupId) + ? DefaultGroupFor(request.Kind) + : NormalizeSegment(request.GroupId!, nameof(request.GroupId)); + + // Copy the caller's buffer: the immutable snapshot owns the bytes. + byte[] content = request.Content.ToArray(); + + // Light parse to derive the kind/id/title and to record a format + // failure state for a document that cannot even be parsed. Full WoT + // validation and projection are performed by the coordinator. + string? thingId = null; + string? title = null; + WoTValidationOutcomeDataType? validation = null; + ImmutableArray.Builder diagnostics = ImmutableArray.CreateBuilder(); + bool parseFailed = false; + try + { + var options = new WotNodeSetConverterOptions + { + MaxJsonDocumentSize = Bounds.MaxDocumentBytes, + MaxJsonDepth = Bounds.MaxJsonDepth + }; + using var document = WotDocument.Parse(content, options); + thingId = document.Id; + title = document.Title; + } + catch (Exception ex) when (ex is JsonException or FormatException) + { + parseFailed = true; + diagnostics.Add($"Document parse failed: {ex.Message}"); + validation = FailedValidation(ex.Message); + } + + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + WotResourceGroup? group = snapshot.FindGroup(groupId); + if (group is null) + { + // Implicit group creation on upsert must enforce MaxGroups the + // same way this method already enforces MaxResourcesPerGroup: + // reject the request rather than silently exceeding the bound. + if (snapshot.Groups.Count >= Bounds.MaxGroups) + { + return new WotRegistryMutationResult( + WoTOutcomeEnum.Rejected, + null, + snapshot.Generation, + [$"The registry already holds the maximum of {Bounds.MaxGroups} groups."], + "Too many groups."); + } + group = new WotResourceGroup(groupId, request.Kind, epoch: snapshot.Generation + 1); + } + + string resourceId = DeriveResourceId(request, thingId, title); + WotResource? existing = group.Resources.TryGetValue( + resourceId, out WotResource? found) ? found : null; + + if (existing is null && + group.Resources.Count >= Bounds.MaxResourcesPerGroup) + { + return new WotRegistryMutationResult( + WoTOutcomeEnum.Rejected, + null, + snapshot.Generation, + [$"Group '{groupId}' already holds the maximum of " + + $"{Bounds.MaxResourcesPerGroup} resources."], + "Too many resources."); + } + + byte[] digest = WotContentDigest.Compute(content); + + // Idempotency: an unchanged default document returns Unchanged + // and produces no new version and no model change. + if (existing?.DefaultVersion is { } current && + WotContentDigest.Equal(current.Digest, digest) && + !parseFailed) + { + return new WotRegistryMutationResult( + WoTOutcomeEnum.Unchanged, + existing, + snapshot.Generation, + [], + "Content digest unchanged."); + } + + long generation = snapshot.Generation + 1; + DateTime now = DateTime.UtcNow; + string versionId = NextVersionId(existing); + var version = new WotResourceVersion( + versionId, + content, + request.ContentType, + request.Format, + createdAt: now, + modifiedAt: now, + digest: digest); + + ImmutableArray versions = existing is null + ? [version] + : Trim(existing.Versions.Add(version), Bounds.MaxVersionsPerResource); + + string? defaultVersionId = request.SetAsDefault + ? versionId + : existing?.DefaultVersionId ?? versionId; + + WoTLoadStateEnum loadState = parseFailed + ? WoTLoadStateEnum.Failed + : WoTLoadStateEnum.Unloaded; + + WotResource resource = existing is null + ? new WotResource( + groupId, + resourceId, + request.Kind, + versions, + defaultVersionId: defaultVersionId, + desiredVersionId: request.SetAsDefault ? versionId : null, + enabled: true, + loadState: loadState, + validation: validation, + diagnostics: diagnostics.ToImmutable(), + epoch: generation, + name: request.Name ?? title ?? resourceId, + description: request.Description, + thingId: thingId, + title: title) + : existing.With( + versions: versions, + defaultVersionId: defaultVersionId, + desiredVersionId: request.SetAsDefault ? versionId : existing.DesiredVersionId, + loadState: loadState, + validation: validation, + diagnostics: diagnostics.ToImmutable(), + epoch: generation, + name: request.Name ?? existing.Name, + description: request.Description ?? existing.Description, + thingId: thingId ?? existing.ThingId, + title: title ?? existing.Title, + clearValidation: validation is null); + + WotRegistrySnapshot next = ReplaceResource(snapshot, group, resource, generation); + await CommitAndPublishAsync( + snapshot, next, [resource.Xid], projectionOnly: false, cancellationToken) + .ConfigureAwait(false); + + WoTOutcomeEnum outcome = parseFailed + ? WoTOutcomeEnum.Warning + : WoTOutcomeEnum.Success; + return new WotRegistryMutationResult( + outcome, resource, generation, diagnostics.ToImmutable()); + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask DeleteResourceAsync( + string groupId, + string resourceId, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + WotResource? resource = snapshot.FindResource(groupId, resourceId); + if (resource is null) + { + return Failed(snapshot.Generation, "Resource not found."); + } + if (expectedEpoch is { } epoch && epoch != resource.Epoch) + { + return Rejected(snapshot.Generation, "Epoch mismatch."); + } + + long generation = snapshot.Generation + 1; + WotResourceGroup group = snapshot.FindGroup(groupId)!; + WotResourceGroup nextGroup = group.WithResources( + group.Resources.Remove(resourceId), generation); + WotRegistrySnapshot next = snapshot.WithGroup(nextGroup, generation); + await CommitAndPublishAsync( + snapshot, next, [resource.Xid], projectionOnly: false, cancellationToken) + .ConfigureAwait(false); + return new WotRegistryMutationResult( + WoTOutcomeEnum.Success, resource, generation, []); + } + finally + { + m_mutex.Release(); + } + } + + /// + public ValueTask SetDefaultVersionAsync( + string groupId, + string resourceId, + string versionId, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + return MutateResourceAsync( + groupId, + resourceId, + expectedEpoch, + (resource, generation) => + { + if (resource.FindVersion(versionId) is null) + { + return (null, Rejected(generation - 1, $"Version '{versionId}' not found.")); + } + WotResource updated = resource.With( + defaultVersionId: versionId, + desiredVersionId: versionId, + epoch: generation); + return (updated, null); + }, + cancellationToken); + } + + /// + public ValueTask SetEnabledAsync( + string groupId, + string resourceId, + bool enabled, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + return MutateResourceAsync( + groupId, + resourceId, + expectedEpoch, + (resource, generation) => + { + if (resource.Enabled == enabled) + { + return (resource.With(epoch: generation), null); + } + WotResource updated = resource.With(enabled: enabled, epoch: generation); + return (updated, null); + }, + cancellationToken); + } + + /// + public async ValueTask AddRegistryLabelAsync( + string key, + string value, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + WotLabelValidator.Validate(key, value, Bounds); + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + if (expectedEpoch is { } epoch && epoch != snapshot.Generation) + { + return Rejected(snapshot.Generation, "Epoch mismatch."); + } + if (!snapshot.Labels.ContainsKey(key) && + snapshot.Labels.Count >= Bounds.MaxLabelsPerEntity) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + "The registry already holds the maximum of " + + $"{Bounds.MaxLabelsPerEntity} labels."); + } + long generation = snapshot.Generation + 1; + WotRegistrySnapshot next = snapshot.WithLabels( + snapshot.Labels.SetItem(key, value), generation); + await CommitAndPublishAsync( + snapshot, next, [], projectionOnly: true, cancellationToken) + .ConfigureAwait(false); + return new WotRegistryMutationResult( + WoTOutcomeEnum.Success, null, generation, []); + } + finally + { + m_mutex.Release(); + } + } + + /// + public async ValueTask RemoveRegistryLabelAsync( + string key, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + if (string.IsNullOrEmpty(key)) + { + throw new ServiceResultException( + StatusCodes.BadInvalidArgument, "The Key argument is required."); + } + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + if (expectedEpoch is { } epoch && epoch != snapshot.Generation) + { + return Rejected(snapshot.Generation, "Epoch mismatch."); + } + if (!snapshot.Labels.ContainsKey(key)) + { + return Failed(snapshot.Generation, $"Label '{key}' not found."); + } + long generation = snapshot.Generation + 1; + WotRegistrySnapshot next = snapshot.WithLabels( + snapshot.Labels.Remove(key), generation); + await CommitAndPublishAsync( + snapshot, next, [], projectionOnly: true, cancellationToken) + .ConfigureAwait(false); + return new WotRegistryMutationResult( + WoTOutcomeEnum.Success, null, generation, []); + } + finally + { + m_mutex.Release(); + } + } + + /// + public ValueTask AddGroupLabelAsync( + string groupId, + string key, + string value, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + WotLabelValidator.Validate(key, value, Bounds); + return MutateGroupAsync( + groupId, + expectedEpoch, + (group, generation) => + { + if (!group.Labels.ContainsKey(key) && + group.Labels.Count >= Bounds.MaxLabelsPerEntity) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + $"Group '{groupId}' already holds the maximum of " + + $"{Bounds.MaxLabelsPerEntity} labels."); + } + WotResourceGroup updated = group.WithLabels( + group.Labels.SetItem(key, value), generation); + return (updated, null); + }, + cancellationToken, + projectionOnly: true); + } + + /// + public ValueTask RemoveGroupLabelAsync( + string groupId, + string key, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + if (string.IsNullOrEmpty(key)) + { + throw new ServiceResultException( + StatusCodes.BadInvalidArgument, "The Key argument is required."); + } + return MutateGroupAsync( + groupId, + expectedEpoch, + (group, generation) => + { + if (!group.Labels.ContainsKey(key)) + { + return (null, Failed(generation - 1, $"Label '{key}' not found.")); + } + WotResourceGroup updated = group.WithLabels( + group.Labels.Remove(key), generation); + return (updated, null); + }, + cancellationToken, + projectionOnly: true); + } + + /// + public ValueTask AddResourceLabelAsync( + string groupId, + string resourceId, + string key, + string value, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + WotLabelValidator.Validate(key, value, Bounds); + return MutateResourceAsync( + groupId, + resourceId, + expectedEpoch, + (resource, generation) => + { + if (!resource.Labels.ContainsKey(key) && + resource.Labels.Count >= Bounds.MaxLabelsPerEntity) + { + throw new ServiceResultException( + StatusCodes.BadTooManyOperations, + $"Resource '{resourceId}' already holds the maximum of " + + $"{Bounds.MaxLabelsPerEntity} labels."); + } + WotResource updated = resource.With( +epoch: generation, labels: resource.Labels.SetItem(key, value)); + return (updated, null); + }, + cancellationToken, + projectionOnly: true); + } + + /// + public ValueTask RemoveResourceLabelAsync( + string groupId, + string resourceId, + string key, + long? expectedEpoch = null, + CancellationToken cancellationToken = default) + { + if (string.IsNullOrEmpty(key)) + { + throw new ServiceResultException( + StatusCodes.BadInvalidArgument, "The Key argument is required."); + } + return MutateResourceAsync( + groupId, + resourceId, + expectedEpoch, + (resource, generation) => + { + if (!resource.Labels.ContainsKey(key)) + { + return (null, Failed(generation - 1, $"Label '{key}' not found.")); + } + WotResource updated = resource.With( +epoch: generation, labels: resource.Labels.Remove(key)); + return (updated, null); + }, + cancellationToken, + projectionOnly: true); + } + + /// + public async ValueTask ApplyProjectionResultsAsync( + IReadOnlyList projections, + CancellationToken cancellationToken = default) + { + if (projections is null || projections.Count == 0) + { + return; + } + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + long generation = snapshot.Generation + 1; + var changed = new List(); + WotRegistrySnapshot next = snapshot; + foreach (WotResourceProjection projection in projections) + { + WotResource? resource = next.FindResource( + projection.GroupId, projection.ResourceId); + if (resource is null) + { + continue; + } + string? activeVersionId = projection.RetainPreviousActiveVersion + ? resource.ActiveVersionId + : projection.ActiveVersionId; + WotResource updated = resource.With( + activeVersionId: activeVersionId, + loadState: projection.LoadState, + validation: projection.Validation, + diagnostics: projection.Diagnostics, + epoch: resource.Epoch, + refreshGeneration: projection.RefreshGeneration, + lastRefreshTime: projection.LastRefreshTime, + materializedNodeCount: projection.MaterializedNodeCount, + rootNodeId: projection.RootNodeId, + clearActiveVersion: activeVersionId is null, + clearValidation: projection.Validation is null, + clearRootNodeId: projection.RootNodeId.IsNull); + WotResourceGroup group = next.FindGroup(projection.GroupId)!; + next = ReplaceResource(next, group, updated, generation); + changed.Add(updated.Xid); + } + if (changed.Count == 0) + { + return; + } + await CommitAndPublishAsync( + snapshot, next, changed, projectionOnly: true, cancellationToken) + .ConfigureAwait(false); + } + finally + { + m_mutex.Release(); + } + } + + /// + public void Dispose() + { + m_mutex.Dispose(); + } + + private async ValueTask MutateResourceAsync( + string groupId, + string resourceId, + long? expectedEpoch, + Func mutate, + CancellationToken cancellationToken, + bool projectionOnly = false) + { + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + WotResource? resource = snapshot.FindResource(groupId, resourceId); + if (resource is null) + { + return Failed(snapshot.Generation, "Resource not found."); + } + if (expectedEpoch is { } epoch && epoch != resource.Epoch) + { + return Rejected(snapshot.Generation, "Epoch mismatch."); + } + long generation = snapshot.Generation + 1; + (WotResource? updated, WotRegistryMutationResult? rejection) = mutate(resource, generation); + if (rejection is not null) + { + return rejection; + } + if (updated is null) + { + return Failed(snapshot.Generation, "Mutation produced no result."); + } + WotResourceGroup group = snapshot.FindGroup(groupId)!; + WotRegistrySnapshot next = ReplaceResource(snapshot, group, updated, generation); + await CommitAndPublishAsync( + snapshot, next, [updated.Xid], projectionOnly, cancellationToken) + .ConfigureAwait(false); + return new WotRegistryMutationResult( + WoTOutcomeEnum.Success, updated, generation, []); + } + finally + { + m_mutex.Release(); + } + } + + private async ValueTask MutateGroupAsync( + string groupId, + long? expectedEpoch, + Func mutate, + CancellationToken cancellationToken, + bool projectionOnly = false) + { + await m_mutex.WaitAsync(cancellationToken).ConfigureAwait(false); + try + { + EnsureMutationAllowed(); + WotRegistrySnapshot snapshot = m_snapshot; + WotResourceGroup? group = snapshot.FindGroup(groupId); + if (group is null) + { + return Failed(snapshot.Generation, "Group not found."); + } + if (expectedEpoch is { } epoch && epoch != group.Epoch) + { + return Rejected(snapshot.Generation, "Epoch mismatch."); + } + long generation = snapshot.Generation + 1; + (WotResourceGroup? updated, WotRegistryMutationResult? rejection) = mutate(group, generation); + if (rejection is not null) + { + return rejection; + } + if (updated is null) + { + return Failed(snapshot.Generation, "Mutation produced no result."); + } + WotRegistrySnapshot next = snapshot.WithGroup(updated, generation); + await CommitAndPublishAsync( + snapshot, next, [updated.Xid], projectionOnly, cancellationToken) + .ConfigureAwait(false); + return new WotRegistryMutationResult( + WoTOutcomeEnum.Success, null, generation, []); + } + finally + { + m_mutex.Release(); + } + } + + private static WotRegistrySnapshot ReplaceResource( + WotRegistrySnapshot snapshot, + WotResourceGroup group, + WotResource resource, + long generation) + { + WotResourceGroup nextGroup = group.WithResources( + group.Resources.SetItem(resource.ResourceId, resource), generation); + return snapshot.WithGroup(nextGroup, generation); + } + + private async ValueTask CommitAndPublishAsync( + WotRegistrySnapshot previous, + WotRegistrySnapshot intended, + IReadOnlyList changed, + bool projectionOnly, + CancellationToken cancellationToken) + { + try + { + await m_store.CommitAsync(intended, cancellationToken).ConfigureAwait(false); + } + catch (WotRegistryCommitDurabilityUncertainException exception) + { + Volatile.Write(ref m_snapshot, exception.CommittedSnapshot); + RaiseChanged( + previous, + exception.CommittedSnapshot, + changed, + projectionOnly); + throw; + } + catch (WotRegistryCommitNotCommittedException) + { + // The store established that the previous generation remains active. + throw; + } + catch (WotRegistryCommitIndeterminateException) + { + m_reloadRequired = true; + throw; + } + + Volatile.Write(ref m_snapshot, intended); + RaiseChanged(previous, intended, changed, projectionOnly); + } + + private void EnsureMutationAllowed() + { + if (m_reloadRequired) + { + throw new InvalidOperationException( + "The WoT registry requires a successful InitializeAsync reload " + + "before further mutation."); + } + } + + private void RaiseChanged( + WotRegistrySnapshot previous, + WotRegistrySnapshot current, + IReadOnlyList changed, + bool projectionOnly) + { + Changed?.Invoke( + this, + new WotRegistryChangedEventArgs(previous, current, changed, projectionOnly)); + } + + private static ImmutableArray Trim( + ImmutableArray versions, + int max) + { + if (versions.Length <= max) + { + return versions; + } + // Drop the oldest versions beyond the retention bound. + return versions.RemoveRange(0, versions.Length - max); + } + + private static string NextVersionId(WotResource? existing) + { + long next = 1; + if (existing is not null) + { + foreach (WotResourceVersion version in existing.Versions) + { + if (long.TryParse( + version.VersionId, + NumberStyles.Integer, + CultureInfo.InvariantCulture, + out long value) && + value >= next) + { + next = value + 1; + } + } + } + return WotRegistrySnapshot.FormatVersionId(next); + } + + private static string DeriveResourceId( + WotUpsertResourceRequest request, + string? thingId, + string? title) + { + if (!string.IsNullOrWhiteSpace(request.ResourceId)) + { + return NormalizeSegment(request.ResourceId!, nameof(request.ResourceId)); + } + string candidate = thingId ?? request.Name ?? title ?? Guid.NewGuid().ToString("N"); + return Slugify(candidate); + } + + private static string DefaultGroupFor(WoTDocumentKindEnum kind) + { + return kind == WoTDocumentKindEnum.ThingModel + ? WotRegistryGroups.ThingModels + : WotRegistryGroups.ThingDescriptions; + } + + internal static string NormalizeSegment(string value, string paramName) + { + if (string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException("A non-empty identifier is required.", paramName); + } + string slug = Slugify(value); + if (slug.Length == 0) + { + throw new ArgumentException( + $"'{value}' does not contain any identifier-safe characters.", paramName); + } + return slug; + } + + private static string Slugify(string value) + { + var builder = new StringBuilder(value.Length); + foreach (char c in value.Trim()) + { + if (c is (>= 'a' and <= 'z') or + (>= '0' and <= '9') or + '-' or '_' or '.') + { + builder.Append(c); + } + else if (c is >= 'A' and <= 'Z') + { + builder.Append(char.ToLowerInvariant(c)); + } + else if (c is ' ' or ':' or '/' or '#') + { + builder.Append('-'); + } + } + string slug = builder.ToString().Trim('-', '.'); + return slug.Length == 0 ? Guid.NewGuid().ToString("N") : slug; + } + + private static WoTValidationOutcomeDataType FailedValidation(string reason) + { + return new WoTValidationOutcomeDataType + { + FormatValidated = true, + FormatOutcome = WoTOutcomeEnum.Failed, + FormatReason = reason, + CompatibilityValidated = false, + CompatibilityOutcome = WoTOutcomeEnum.Skipped, + ValidatedAt = DateTime.UtcNow, + VocabularyVersion = WotNodeSetConverter.VocabularyNamespace + }; + } + + private static WotRegistryMutationResult Failed(long generation, string message) + { + return new WotRegistryMutationResult( + WoTOutcomeEnum.Failed, null, generation, + [message], message); + } + + private static WotRegistryMutationResult Rejected(long generation, string message) + { + return new WotRegistryMutationResult( + WoTOutcomeEnum.Rejected, null, generation, + [message], message); + } + + private readonly IWotRegistryStore m_store; + private readonly SemaphoreSlim m_mutex = new(1, 1); + private WotRegistrySnapshot m_snapshot; + private bool m_reloadRequired; + } +} diff --git a/src/Opc.Ua.WotCon.Server/Registry/WotResourceFileManager.cs b/src/Opc.Ua.WotCon.Server/Registry/WotResourceFileManager.cs new file mode 100644 index 0000000000..76ddd35eb1 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/Registry/WotResourceFileManager.cs @@ -0,0 +1,476 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Server.Registry +{ + /// + /// Manages the inherited OPC UA FileType primitives + /// (Open/Read/Write/Close/GetPosition/ + /// SetPosition) exposed by a single xRegistry ResourceType + /// document node in the WoT Connectivity 1.1 registry. + /// + /// + /// Generalizes the legacy WotAssetFileManager for the xRegistry + /// document surface: per-session handles, a bounded write buffer, a single + /// exclusive writer, and commit-on-close semantics. Read handles serve an + /// immutable snapshot of the resource's active/default version bytes; a write + /// handle buffers the upload and, when it is closed, commits the buffer as a + /// new version through the injected callback (which stores a validated or an + /// invalid version - the bytes are never lost). + /// + /// Per the xRegistry document model the only supported OpenFileMode + /// values are Read (1) and Write | EraseExisting (6); other + /// modes are rejected with . + /// + /// + internal sealed class WotResourceFileManager : IDisposable + { + public const byte ReadMode = 1; + public const byte WriteEraseMode = 6; + + public WotResourceFileManager( + FileState file, + int maxOpenHandles, + int maxDocumentSize, + Func authorizeWrite, + Func> onCommit) + { + m_file = file ?? throw new ArgumentNullException(nameof(file)); + m_maxHandles = maxOpenHandles; + m_maxSize = maxDocumentSize; + m_authorizeWrite = authorizeWrite ?? throw new ArgumentNullException(nameof(authorizeWrite)); + m_onCommit = onCommit ?? throw new ArgumentNullException(nameof(onCommit)); + + if (m_file.Writable is not null) + { + m_file.Writable.Value = true; + } + if (m_file.UserWritable is not null) + { + m_file.UserWritable.Value = true; + } + if (m_file.OpenCount is not null) + { + m_file.OpenCount.Value = 0; + } + if (m_file.MaxByteStringLength is not null) + { + m_file.MaxByteStringLength.Value = (uint)maxDocumentSize; + } + + if (m_file.Open is not null) + { + m_file.Open.OnCall = new OpenMethodStateMethodCallHandler(OnOpen); + } + if (m_file.Close is not null) + { + m_file.Close.OnCallAsync = new CloseMethodStateMethodAsyncCallHandler(OnCloseAsync); + } + if (m_file.Read is not null) + { + m_file.Read.OnCall = new ReadMethodStateMethodCallHandler(OnRead); + } + if (m_file.Write is not null) + { + m_file.Write.OnCall = new WriteMethodStateMethodCallHandler(OnWrite); + } + if (m_file.GetPosition is not null) + { + m_file.GetPosition.OnCall = new GetPositionMethodStateMethodCallHandler(OnGetPosition); + } + if (m_file.SetPosition is not null) + { + m_file.SetPosition.OnCall = new SetPositionMethodStateMethodCallHandler(OnSetPosition); + } + } + + /// The current version bytes served to readers. + public byte[] CurrentContent { get; private set; } = Array.Empty(); + + /// + /// Replaces the served content (called when the registry snapshot changes). + /// + public void UpdatePersistedContent(byte[] content, string? mimeType) + { + CurrentContent = content ?? throw new ArgumentNullException(nameof(content)); + if (m_file.Size is not null) + { + m_file.Size.Value = (ulong)content.Length; + } + if (m_file.LastModifiedTime is not null) + { + m_file.LastModifiedTime.Value = DateTime.UtcNow; + } + if (mimeType is not null && m_file.MimeType is not null) + { + m_file.MimeType.Value = mimeType; + } + } + + /// + /// Opens an exclusive write handle for the supplied session without a + /// method call, returning the handle to a client that requested a file + /// upload as part of a create operation. + /// + public ServiceResult TryOpenWriteHandle(NodeId sessionId, out uint fileHandle) + { + fileHandle = 0; + lock (m_handles) + { + if (m_handles.Count >= m_maxHandles) + { + return StatusCodes.BadTooManyOperations; + } + if (m_writingHandle != 0) + { + return ServiceResult.Create( + StatusCodes.BadInvalidState, "Another writer is already open on this file."); + } + fileHandle = ++m_nextHandle; + m_handles.Add(fileHandle, Handle.OpenWrite(sessionId)); + m_writingHandle = fileHandle; + if (m_file.OpenCount is not null) + { + m_file.OpenCount.Value = (ushort)m_handles.Count; + } + } + return ServiceResult.Good; + } + + public void Dispose() + { + lock (m_handles) + { + foreach (Handle handle in m_handles.Values) + { + handle.Dispose(); + } + m_handles.Clear(); + } + } + + private static NodeId SessionIdOf(ISystemContext context) + => context is ISessionSystemContext sessionContext + ? sessionContext.SessionId.GetValueOrDefault() + : NodeId.Null; + + private ServiceResult OnOpen( + ISystemContext context, MethodState method, NodeId objectId, byte mode, ref uint fileHandle) + { + if (mode is not ReadMode and not WriteEraseMode) + { + return ServiceResult.Create(StatusCodes.BadNotSupported, + "A WoT document file only supports modes Read (1) and Write+EraseExisting (6)."); + } + if (mode == WriteEraseMode) + { + ServiceResult access = m_authorizeWrite(context, "OpenWrite"); + if (ServiceResult.IsBad(access)) + { + return access; + } + } + NodeId sessionId = SessionIdOf(context); + lock (m_handles) + { + if (m_handles.Count >= m_maxHandles) + { + return StatusCodes.BadTooManyOperations; + } + if (mode == WriteEraseMode && m_writingHandle != 0) + { + return ServiceResult.Create(StatusCodes.BadInvalidState, + "Another writer is already open on this file."); + } + Handle handle = mode == WriteEraseMode + ? Handle.OpenWrite(sessionId) + : Handle.OpenRead(sessionId, CurrentContent); + fileHandle = ++m_nextHandle; + m_handles.Add(fileHandle, handle); + if (mode == WriteEraseMode) + { + m_writingHandle = fileHandle; + } + if (m_file.OpenCount is not null) + { + m_file.OpenCount.Value = (ushort)m_handles.Count; + } + } + return ServiceResult.Good; + } + + private async ValueTask OnCloseAsync( + ISystemContext context, + MethodState method, + NodeId objectId, + uint fileHandle, + CancellationToken cancellationToken) + { + Handle handle; + bool commit; + lock (m_handles) + { + if (!TryGetHandleLocked(context, fileHandle, out handle, out ServiceResult err)) + { + return new CloseMethodStateResult { ServiceResult = err }; + } + commit = m_writingHandle == fileHandle; + if (commit) + { + ServiceResult access = m_authorizeWrite(context, "CloseWrite"); + if (ServiceResult.IsBad(access)) + { + m_handles.Remove(fileHandle); + m_writingHandle = 0; + if (m_file.OpenCount is not null) + { + m_file.OpenCount.Value = (ushort)m_handles.Count; + } + handle.Dispose(); + return new CloseMethodStateResult { ServiceResult = access }; + } + m_writingHandle = 0; + } + m_handles.Remove(fileHandle); + if (m_file.OpenCount is not null) + { + m_file.OpenCount.Value = (ushort)m_handles.Count; + } + } + + try + { + if (!commit) + { + return new CloseMethodStateResult { ServiceResult = ServiceResult.Good }; + } + byte[] content = ((MemoryStream)handle.Stream).ToArray(); + if (content.Length == 0) + { + // Nothing was written: closing a fresh writer is a no-op. + return new CloseMethodStateResult { ServiceResult = ServiceResult.Good }; + } + ServiceResult result = await m_onCommit(content, SessionIdOf(context), cancellationToken) + .ConfigureAwait(false); + return new CloseMethodStateResult { ServiceResult = result }; + } + finally + { + handle.Dispose(); + } + } + + private ServiceResult OnRead( + ISystemContext context, MethodState method, NodeId objectId, + uint fileHandle, int length, ref ByteString data) + { + lock (m_handles) + { + if (!TryGetHandleLocked(context, fileHandle, out Handle handle, out ServiceResult err)) + { + data = default; + return err; + } + if (handle.Writing) + { + data = default; + return ServiceResult.Create( + StatusCodes.BadInvalidState, "File handle is opened for writing."); + } + if (length <= 0) + { + data = ByteString.Empty; + return ServiceResult.Good; + } + int available = checked((int)(handle.Stream.Length - handle.Stream.Position)); + int toRead = Math.Min(available, length); + if (toRead <= 0) + { + data = ByteString.Empty; + return ServiceResult.Good; + } + byte[] buffer = new byte[toRead]; + int totalRead = 0; + while (totalRead < buffer.Length) + { + int n = handle.Stream.Read(buffer, totalRead, buffer.Length - totalRead); + if (n <= 0) + { + break; + } + totalRead += n; + } + if (totalRead != buffer.Length) + { + Array.Resize(ref buffer, totalRead); + } + data = ByteString.From(buffer); + } + return ServiceResult.Good; + } + + private ServiceResult OnWrite( + ISystemContext context, MethodState method, NodeId objectId, + uint fileHandle, ByteString data) + { + lock (m_handles) + { + if (!TryGetHandleLocked(context, fileHandle, out Handle handle, out ServiceResult err)) + { + return err; + } + if (!handle.Writing) + { + return ServiceResult.Create( + StatusCodes.BadInvalidState, "File handle is opened for reading."); + } + ServiceResult access = m_authorizeWrite(context, "Write"); + if (ServiceResult.IsBad(access)) + { + return access; + } + if (data.IsNull || data.Span.Length == 0) + { + return ServiceResult.Good; + } + ReadOnlySpan bytes = data.Span; + if (handle.Stream.Length + bytes.Length > m_maxSize) + { + return ServiceResult.Create(StatusCodes.BadOutOfMemory, + "The document exceeds the configured maximum size."); + } + byte[] copy = bytes.ToArray(); + handle.Stream.Write(copy, 0, copy.Length); + } + return ServiceResult.Good; + } + + private ServiceResult OnGetPosition( + ISystemContext context, MethodState method, NodeId objectId, + uint fileHandle, ref ulong position) + { + lock (m_handles) + { + if (!TryGetHandleLocked(context, fileHandle, out Handle handle, out ServiceResult err)) + { + return err; + } + position = (ulong)handle.Stream.Position; + } + return ServiceResult.Good; + } + + private ServiceResult OnSetPosition( + ISystemContext context, MethodState method, NodeId objectId, + uint fileHandle, ulong position) + { + lock (m_handles) + { + if (!TryGetHandleLocked(context, fileHandle, out Handle handle, out ServiceResult err)) + { + return err; + } + if (handle.Writing) + { + ServiceResult access = m_authorizeWrite(context, "SetWritePosition"); + if (ServiceResult.IsBad(access)) + { + return access; + } + } + if (position > (ulong)handle.Stream.Length) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, "Requested position exceeds file length."); + } + handle.Stream.Position = (long)position; + } + return ServiceResult.Good; + } + + private bool TryGetHandleLocked( + ISystemContext context, uint fileHandle, out Handle handle, out ServiceResult error) + { + if (!m_handles.TryGetValue(fileHandle, out Handle? located)) + { + handle = null!; + error = ServiceResult.Create(StatusCodes.BadInvalidArgument, "Unknown file handle."); + return false; + } + NodeId expected = SessionIdOf(context); + if (!expected.IsNull && !located.SessionId.IsNull && located.SessionId != expected) + { + handle = null!; + error = ServiceResult.Create( + StatusCodes.BadUserAccessDenied, "File handle is owned by another session."); + return false; + } + handle = located; + error = ServiceResult.Good; + return true; + } + + private sealed class Handle : IDisposable + { + private Handle(NodeId sessionId, Stream stream, bool writing) + { + SessionId = sessionId; + Stream = stream; + Writing = writing; + } + + public NodeId SessionId { get; } + public Stream Stream { get; } + public bool Writing { get; } + + public static Handle OpenRead(NodeId sessionId, byte[] snapshot) + => new(sessionId, new MemoryStream(snapshot, writable: false), writing: false); + + public static Handle OpenWrite(NodeId sessionId) + => new(sessionId, new MemoryStream(), writing: true); + + public void Dispose() => Stream.Dispose(); + } + + private readonly FileState m_file; + private readonly int m_maxHandles; + private readonly int m_maxSize; + private readonly Func m_authorizeWrite; + private readonly Func> m_onCommit; + private readonly Dictionary m_handles = new(); + private uint m_nextHandle; + private uint m_writingHandle; + } +} diff --git a/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotActionMapper.cs b/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotActionMapper.cs index 320d99f3e8..f2019609dd 100644 --- a/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotActionMapper.cs +++ b/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotActionMapper.cs @@ -63,7 +63,7 @@ public static IReadOnlyList BuildArguments(WotActionSchema? schema) new Argument { Name = schema.Title ?? "value", - DataType = DataTypeIds.BaseDataType, + DataType = Ua.DataTypeIds.BaseDataType, ValueRank = ValueRanks.Scalar, Description = BuildSchemaDescription(schema) } @@ -90,7 +90,7 @@ private static Argument BuildMemberArgument(string name, WotActionMember member) if (!WotPropertyMapper.TryMapPrimitive(jsonType, out NodeId dataType)) { - dataType = DataTypeIds.BaseDataType; + dataType = Ua.DataTypeIds.BaseDataType; } return new Argument diff --git a/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotPropertyMapper.cs b/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotPropertyMapper.cs index 4644895277..01f8f40c54 100644 --- a/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotPropertyMapper.cs +++ b/src/Opc.Ua.WotCon.Server/ThingDescriptions/WotPropertyMapper.cs @@ -71,7 +71,7 @@ public static bool TryMap( valueRank = ValueRanks.OneDimension; if (property.Items?.Type == null) { - dataType = DataTypeIds.BaseDataType; + dataType = Ua.DataTypeIds.BaseDataType; return true; } return TryMapPrimitive(property.Items.Type, out dataType); @@ -90,16 +90,16 @@ public static bool TryMapPrimitive(string? jsonType, out NodeId dataType) switch (jsonType?.ToLowerInvariant()) { case "boolean": - dataType = DataTypeIds.Boolean; + dataType = Ua.DataTypeIds.Boolean; return true; case "number": - dataType = DataTypeIds.Double; + dataType = Ua.DataTypeIds.Double; return true; case "integer": - dataType = DataTypeIds.Int64; + dataType = Ua.DataTypeIds.Int64; return true; case "string": - dataType = DataTypeIds.String; + dataType = Ua.DataTypeIds.String; return true; case null: case "": @@ -108,7 +108,7 @@ public static bool TryMapPrimitive(string? jsonType, out NodeId dataType) dataType = NodeId.Null; return false; default: - dataType = DataTypeIds.BaseDataType; + dataType = Ua.DataTypeIds.BaseDataType; return true; } } diff --git a/src/Opc.Ua.WotCon.Server/WotConModelPartition.cs b/src/Opc.Ua.WotCon.Server/WotConModelPartition.cs new file mode 100644 index 0000000000..f6f8c03de9 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/WotConModelPartition.cs @@ -0,0 +1,127 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using Opc.Ua.XRegistry; + +namespace Opc.Ua.WotCon.Server +{ + /// + /// Splits the single combined WoT Connectivity 1.1 model + /// (http://opcfoundation.org/UA/WoT-Con/) into the two disjoint + /// static-node slices its NodeManagers own, so the deprecated 1.02 surface + /// and the additive registry surface are never claimed twice when both the + /// and the + /// operate on the same server. + /// + /// + /// The combined NodeSet incorporates the published OPC 10100-1 v1.02 model + /// at its original NodeIds (1..172, marked deprecated) plus the + /// additive registry nodes in the provisional 64000+ block. + /// Ownership is therefore decided by NodeId: the legacy asset manager owns + /// the incorporated 1.02 nodes and the registry manager owns the registry + /// nodes (together with the xRegistry base nodes it also loads). + /// + internal static class WotConModelPartition + { + /// + /// First NodeId of the additive registry block. NodeIds below this + /// value belong to the incorporated OPC 10100-1 v1.02 surface. + /// + public const uint FirstRegistryNodeId = 64000; + + /// + /// Ensures the xRegistry namespace is present so the combined model's + /// registry nodes (which reference xRegistry base types while being + /// created) can be instantiated before the registry slice is removed. + /// The legacy manager does not own the xRegistry namespace; it merely + /// needs the URI registered so resolves during predefined-node creation. + /// + public static void EnsureXRegistryNamespace(ISystemContext context) + { + context.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + } + + /// + /// Removes the additive registry nodes, retaining only the incorporated + /// OPC 10100-1 v1.02 surface for the legacy asset manager to own. + /// + public static NodeStateCollection RetainLegacyNodes( + NodeStateCollection nodes, ISystemContext context) + { + ushort modelNs = ModelNamespaceIndex(context); + for (int i = nodes.Count - 1; i >= 0; i--) + { + if (IsRegistryNode(nodes[i], modelNs)) + { + nodes.RemoveAt(i); + } + } + return nodes; + } + + /// + /// Removes the incorporated OPC 10100-1 v1.02 nodes, retaining only the + /// additive registry nodes (and any xRegistry base nodes already in the + /// collection) for the registry manager to own. + /// + public static NodeStateCollection RetainRegistryNodes( + NodeStateCollection nodes, ISystemContext context) + { + ushort modelNs = ModelNamespaceIndex(context); + for (int i = nodes.Count - 1; i >= 0; i--) + { + if (IsLegacyNode(nodes[i], modelNs)) + { + nodes.RemoveAt(i); + } + } + return nodes; + } + + private static ushort ModelNamespaceIndex(ISystemContext context) + { + return (ushort)context.NamespaceUris.GetIndex(Namespaces.WotCon); + } + + private static bool IsRegistryNode(NodeState node, ushort modelNs) + { + return node.NodeId.NamespaceIndex == modelNs && + node.NodeId.TryGetValue(out uint id) && + id >= FirstRegistryNodeId; + } + + private static bool IsLegacyNode(NodeState node, ushort modelNs) + { + return node.NodeId.NamespaceIndex == modelNs && + node.NodeId.TryGetValue(out uint id) && + id < FirstRegistryNodeId; + } + } +} diff --git a/src/Opc.Ua.WotCon.Server/WotConnectivityNodeManager.cs b/src/Opc.Ua.WotCon.Server/WotConnectivityNodeManager.cs index ccf88e736e..8558951d4a 100644 --- a/src/Opc.Ua.WotCon.Server/WotConnectivityNodeManager.cs +++ b/src/Opc.Ua.WotCon.Server/WotConnectivityNodeManager.cs @@ -45,9 +45,12 @@ namespace Opc.Ua.WotCon.Server /// /// The static model nodes — WoTAssetConnectionManagement, all /// type definitions, and the HasWoTComponent reference type — - /// are loaded from the generated AddOpcUaWotCon table. Dynamic - /// nodes (assets, property variables, action methods) are created - /// per asset by in a dedicated namespace + /// are loaded from the generated AddOpcUaWotCon table, restricted to + /// the incorporated OPC 10100-1 v1.02 surface (NodeIds below the additive + /// registry block). The additive registry nodes in the same combined model + /// are owned by . Dynamic nodes (assets, + /// property variables, action methods) are created per asset by + /// in a dedicated namespace /// (). /// public sealed class WotConnectivityNodeManager : AsyncCustomNodeManager, INodeIdFactory @@ -170,7 +173,15 @@ protected override ValueTask LoadPredefinedNodesAsync( ISystemContext context, CancellationToken cancellationToken = default) { - return new ValueTask(new NodeStateCollection().AddOpcUaWotCon(context)); + // The combined WoT-Con model incorporates both the deprecated 1.02 + // surface and the additive registry nodes (which reference xRegistry + // base types). Register the xRegistry namespace so the combined table + // can be created, then keep only the 1.02 slice: the registry nodes + // are owned by WotRegistryNodeManager. + WotConModelPartition.EnsureXRegistryNamespace(context); + NodeStateCollection nodes = new NodeStateCollection().AddOpcUaWotCon(context); + WotConModelPartition.RetainLegacyNodes(nodes, context); + return new ValueTask(nodes); } /// @@ -435,8 +446,9 @@ private void ApplyConfiguration(ISystemContext context, WoTAssetConnectionManage child.ValueRank = ValueRanks.Scalar; child.AccessLevel = kv.Value.Writable ? AccessLevels.CurrentReadOrWrite : AccessLevels.CurrentRead; child.UserAccessLevel = child.AccessLevel; - child.Value = kv.Value.InitialValue - ?? TypeInfo.GetDefaultVariantValue(kv.Value.DataType, ValueRanks.Scalar); + child.Value = kv.Value.InitialValue.IsNull + ? TypeInfo.GetDefaultVariantValue(kv.Value.DataType, ValueRanks.Scalar) + : kv.Value.InitialValue; if (!string.IsNullOrEmpty(kv.Value.Description)) { child.Description = new LocalizedText(kv.Value.Description); @@ -617,12 +629,28 @@ private void AssignChildNodeIds(NodeState node, string parentPath) private long m_nextDynamicId = 1_000_000; } + /// + /// Holds the source-generated log messages for . + /// internal static partial class WotConnectivityNodeManagerLog { + /// + /// Logs a warning when restoring a persisted WoT asset fails with the reported service result. + /// + /// The logger that writes the message. + /// The name of the asset that could not be restored. + /// The service result returned while restoring the asset. [LoggerMessage(EventId = WotConServerEventIds.WotConnectivityNodeManager + 0, Level = LogLevel.Warning, Message = "Restoring asset {AssetName} failed: {Status}")] public static partial void RestoringAssetFailed(this ILogger logger, string assetName, ServiceResult status); + /// + /// Logs a warning when subscribing to an observable WoT asset property fails. + /// + /// The logger that writes the message. + /// The exception thrown while subscribing. + /// The name of the asset containing the property. + /// The name of the property that could not be subscribed to. [LoggerMessage(EventId = WotConServerEventIds.WotConnectivityNodeManager + 1, Level = LogLevel.Warning, Message = "Subscribe failed for asset {AssetName} property {Property}")] public static partial void SubscribeFailed( @@ -631,6 +659,13 @@ public static partial void SubscribeFailed( string assetName, string property); + /// + /// Logs a warning when unsubscribing from a WoT asset property fails. + /// + /// The logger that writes the message. + /// The exception thrown while unsubscribing. + /// The name of the asset containing the property. + /// The name of the property that could not be unsubscribed from. [LoggerMessage(EventId = WotConServerEventIds.WotConnectivityNodeManager + 2, Level = LogLevel.Warning, Message = "Unsubscribe failed for asset {AssetName} property {Property}")] public static partial void UnsubscribeFailed( @@ -639,6 +674,13 @@ public static partial void UnsubscribeFailed( string assetName, string property); + /// + /// Logs a warning when a WoT management call is denied because the secure-channel security mode is insufficient. + /// + /// The logger that writes the message. + /// The WoT management operation that was denied. + /// The security mode used by the caller's secure channel. + /// The required minimum security mode for WoT management calls. [LoggerMessage(EventId = WotConServerEventIds.WotConnectivityNodeManager + 3, Level = LogLevel.Warning, Message = "WoT management call {Operation} denied: channel security mode {Actual} below " + "required {Required}.")] @@ -648,6 +690,12 @@ public static partial void ManagementCallDeniedSecurityMode( MessageSecurityMode actual, MessageSecurityMode required); + /// + /// Logs a warning when a WoT management call is denied because anonymous identity is not permitted. + /// + /// The logger that writes the message. + /// The WoT management operation that was denied. + /// The caller token type that failed the anonymous-identity precondition. [LoggerMessage(EventId = WotConServerEventIds.WotConnectivityNodeManager + 4, Level = LogLevel.Warning, Message = "WoT management call {Operation} denied: anonymous identity not permitted " + "(token type {TokenType}).")] @@ -656,6 +704,14 @@ public static partial void ManagementCallDeniedAnonymousIdentity( string operation, UserTokenType tokenType); + /// + /// Logs a warning when a WoT management call is denied because the caller lacks the required role. + /// + /// The logger that writes the message. + /// The WoT management operation that was denied. + /// The caller token type that failed the role precondition. + /// The role required to invoke the operation. + /// The roles granted to the caller. [LoggerMessage(EventId = WotConServerEventIds.WotConnectivityNodeManager + 5, Level = LogLevel.Warning, Message = "WoT management call {Operation} denied: identity {TokenType} lacks required " + "role {RequiredRole} (granted: {GrantedRoles}).")] diff --git a/src/Opc.Ua.WotCon.Server/WotConnectivityServerOptions.cs b/src/Opc.Ua.WotCon.Server/WotConnectivityServerOptions.cs index 582fbeb0a0..b2bf418eb7 100644 --- a/src/Opc.Ua.WotCon.Server/WotConnectivityServerOptions.cs +++ b/src/Opc.Ua.WotCon.Server/WotConnectivityServerOptions.cs @@ -152,6 +152,24 @@ public sealed class WotConnectivityServerOptions /// public WotManagementAccessPolicy ManagementAccess { get; set; } = new WotManagementAccessPolicy(); + + /// + /// Optional bridge into the WoT Connectivity 1.1 registry. When set, a + /// legacy 1.02 asset's Thing Description is mirrored as a Thing + /// Description resource in whenever + /// the asset is (re)built, and removed when the asset is deleted, so + /// legacy assets participate in registry materialization without making the + /// flat V1 asset list canonical. Defaults to null (no bridge). + /// + public Registry.IWotRegistryService? RegistryBridge { get; set; } + + /// + /// The registry group id legacy assets are mirrored into when + /// is set. Defaults to the reserved + /// Thing Description group. + /// + public string RegistryBridgeGroupId { get; set; } + = Registry.WotRegistryGroups.ThingDescriptions; } /// @@ -160,11 +178,15 @@ public sealed class WotConnectivityServerOptions /// public sealed class WotConfigurationParameter { - /// The OPC UA DataType for the parameter. - public NodeId DataType { get; init; } = DataTypeIds.String; + /// + /// The OPC UA DataType for the parameter. + /// + public NodeId DataType { get; init; } = Ua.DataTypeIds.String; - /// The initial value (must be assignable to a Variant). - public Variant? InitialValue { get; init; } + /// + /// The initial value (must be assignable to a Variant). + /// + public Variant InitialValue { get; init; } /// /// Optional description. diff --git a/src/Opc.Ua.WotCon.Server/WotManagementAccessPolicy.cs b/src/Opc.Ua.WotCon.Server/WotManagementAccessPolicy.cs index ae2a865da5..1ca223e1d7 100644 --- a/src/Opc.Ua.WotCon.Server/WotManagementAccessPolicy.cs +++ b/src/Opc.Ua.WotCon.Server/WotManagementAccessPolicy.cs @@ -66,7 +66,8 @@ public sealed class WotManagementAccessPolicy /// The minimum acceptable channel security mode. Defaults to /// ; channels /// using or - /// are rejected. + /// are rejected. A conformant + /// registry mutation surface shall not configure a weaker mode. /// public MessageSecurityMode MinimumSecurityMode { get; init; } = MessageSecurityMode.SignAndEncrypt; diff --git a/src/Opc.Ua.WotCon.Server/WotRegistryNodeManager.cs b/src/Opc.Ua.WotCon.Server/WotRegistryNodeManager.cs new file mode 100644 index 0000000000..a959314583 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/WotRegistryNodeManager.cs @@ -0,0 +1,587 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Opc.Ua.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry; + +namespace Opc.Ua.WotCon.Server +{ + /// + /// The stable NodeManager that exposes the WoT Connectivity 1.1 registry + /// (WoTRegistry) and its xRegistry-derived group structure. It hosts + /// the injected and + /// : content mutations trigger a + /// coordinator refresh that projects TD/TM closures as separate runtime + /// NodeManagers, so this manager stays stable while projections come and go. + /// The generated Refresh Method is wired to the coordinator; the + /// coordinator's events are re-emitted as the generated registry event types. + /// + public sealed class WotRegistryNodeManager : AsyncCustomNodeManager + { + /// + /// Initializes a new registry NodeManager. + /// + public WotRegistryNodeManager( + IServerInternal server, + ApplicationConfiguration configuration, + WotRegistryServerOptions options, + IWotRegistryService registry, + WotMaterializationCoordinator coordinator) + : base( + server, + configuration, + server.Telemetry.CreateLogger(), + Namespaces.WotCon, + XRegistryWellKnown.XRegistryNamespaceUri) + { + m_options = options ?? throw new ArgumentNullException(nameof(options)); + Registry = registry ?? throw new ArgumentNullException(nameof(registry)); + Coordinator = coordinator ?? throw new ArgumentNullException(nameof(coordinator)); + Coordinator.StrictBindings = options.StrictBindings; + Coordinator.RetirementPolicy = options.RetirementPolicy; + Coordinator.ServerNamespaceUris = server.NamespaceUris; + m_projection = new WotRegistryProjection(this, Registry, m_options); + } + + /// + /// Gets the hosted registry service. + /// + public IWotRegistryService Registry { get; } + + /// + /// Gets the hosted materialization coordinator. + /// + public WotMaterializationCoordinator Coordinator { get; } + + /// + protected override ValueTask LoadPredefinedNodesAsync( + ISystemContext context, + CancellationToken cancellationToken = default) + { + // Load the xRegistry base plus the combined WoT-Con model, then keep + // only the additive registry slice. The incorporated (deprecated) + // OPC 10100-1 v1.02 nodes are owned by WotConnectivityNodeManager, so + // the two managers never claim the same static model node twice. + NodeStateCollection nodes = new NodeStateCollection() + .AddOpcUaXRegistry(context) + .AddOpcUaWotCon(context); + WotConModelPartition.RetainRegistryNodes(nodes, context); + return new ValueTask(nodes); + } + + /// + protected override ValueTask AddBehaviourToPredefinedNodeAsync( + ISystemContext context, + NodeState predefinedNode, + CancellationToken cancellationToken = default) + { + var registryNodeId = ExpandedNodeId.ToNodeId( + ObjectIds.WoTRegistry, Server.NamespaceUris); + if (predefinedNode is BaseObjectState registry && + registry.NodeId == registryNodeId) + { + m_registryNode = registry; + registry.EventNotifier = EventNotifiers.SubscribeToEvents; + EnsureRegistryManagementMethods(context, registry); + WireRefreshMethod(registry); + ApplyRegistrySettings(context, registry); + } + return new ValueTask(predefinedNode); + } + + private void EnsureRegistryManagementMethods( + ISystemContext context, BaseObjectState registry) + { + if (registry is not RegistryState typed) + { + return; + } + // Instantiate the optional xRegistry CreateGroup/GetOrCreateGroup + // Methods on the well-known singleton. The generated Add helpers mint + // fresh per-instance NodeIds (through the NodeManager's NodeIdFactory) + // and rebase the argument references so the Methods never collide with + // the RegistryType Method declarations. + typed.AddCreateGroup(context) + .AddGetOrCreateGroup(context); + WotRegistryProjection.LinkMethodArguments(typed.CreateGroup, context); + WotRegistryProjection.LinkMethodArguments(typed.GetOrCreateGroup, context); + + // Instantiate the optional Labels (AttributesType) container and its + // AddAttribute/RemoveAttribute Methods here, before this predefined + // node's subtree is registered by the base class's + // CreateAddressSpaceAsync: only children present at that point are + // swept into the NodeManager's node table. WotRegistryProjection + // wires the actual Method handlers later (see AttachAsync). + typed.AddLabels(context); + if (typed.Labels is not null) + { + typed.Labels.AddAddAttribute(context); + typed.Labels.AddRemoveAttribute(context); + WotRegistryProjection.LinkMethodArguments(typed.Labels, context); + } + } + + /// + public override async ValueTask CreateAddressSpaceAsync( + IDictionary> externalReferences, + CancellationToken cancellationToken = default) + { + await base.CreateAddressSpaceAsync(externalReferences, cancellationToken) + .ConfigureAwait(false); + + // Chain WoTRegistry into the Server's notifier tree so its events + // reach subscribing clients. The generated WoTRegistry Object already + // declares the inverse HasNotifier to the Server object, so only the + // forward reference on the Server side is added here. + if (m_registryNode is not null) + { + if (externalReferences.TryGetValue( + Ua.ObjectIds.Server, out IList? serverRefs) || + (serverRefs = EnsureList(externalReferences, Ua.ObjectIds.Server)) != null) + { + serverRefs.Add(new NodeStateReference( + Ua.ReferenceTypeIds.HasNotifier, false, m_registryNode.NodeId)); + } + } + + await Registry.InitializeAsync(cancellationToken).ConfigureAwait(false); + Registry.Changed += OnRegistryChanged; + Coordinator.Event += OnCoordinatorEvent; + + // Materialize the browseable group/resource projection, then project + // whatever is already persisted into the AddressSpace. + if (m_registryNode is not null) + { + await m_projection.AttachAsync(m_registryNode, cancellationToken) + .ConfigureAwait(false); + } + await SafeRefreshAsync("startup").ConfigureAwait(false); + await m_projection.ReconcileAsync(cancellationToken).ConfigureAwait(false); + } + + /// + public override async ValueTask DeleteAddressSpaceAsync( + CancellationToken cancellationToken = default) + { + Registry.Changed -= OnRegistryChanged; + Coordinator.Event -= OnCoordinatorEvent; + await Coordinator.RemoveAllAsync(cancellationToken).ConfigureAwait(false); + m_projection.Dispose(); + await base.DeleteAddressSpaceAsync(cancellationToken).ConfigureAwait(false); + } + + /// + protected override void Dispose(bool disposing) + { + if (disposing) + { + m_projection.Dispose(); + m_refreshGate.Dispose(); + } + base.Dispose(disposing); + } + + private void WireRefreshMethod(BaseObjectState registry) + { + ushort ns = (ushort)Server.NamespaceUris.GetIndex(Namespaces.WotCon); + if (registry.FindChild(SystemContext, new QualifiedName(BrowseNames.Refresh, ns)) + is MethodState refresh) + { + refresh.OnCallMethod2Async = OnRefreshAsync; + } + } + + private void ApplyRegistrySettings(ISystemContext context, BaseObjectState registry) + { + SetChildValue(registry, "AutoRefresh", new Variant(m_options.AutoRefresh)); + SetChildValue(registry, "RefreshMode", + new Variant((int)WoTRefreshModeEnum.EventDriven)); + SetChildValue(registry, "VocabularyVersion", + new Variant(Wot.WotNodeSetConverter.VocabularyNamespace)); + ApplyBindingCapabilities(registry); + } + + private void ApplyBindingCapabilities(BaseObjectState registry) + { + IReadOnlyList caps = Coordinator.BindingCapabilities; + if (caps.Count == 0) + { + return; + } + var encoded = new ExtensionObject[caps.Count]; + for (int i = 0; i < caps.Count; i++) + { + encoded[i] = new ExtensionObject(caps[i]); + } + SetChildValue(registry, "SelectedBindings", + new Variant(new ArrayOf(encoded))); + } + + private async ValueTask OnRefreshAsync( + ISystemContext context, + MethodState method, + NodeId objectId, + ArrayOf inputArguments, + List outputArguments, + CancellationToken cancellationToken) + { + ServiceResult access = CheckManagementAccess(context, "Refresh"); + if (ServiceResult.IsBad(access)) + { + return access; + } + + ServiceResult decoded = WotRefreshArguments.TryDecode( + inputArguments, Server.MessageContext, out WotRefreshRequest request); + if (ServiceResult.IsBad(decoded)) + { + return decoded; + } + + if (!await m_refreshGate + .WaitAsync(0, cancellationToken) + .ConfigureAwait(false)) + { + return StatusCodes.BadServerTooBusy; + } + try + { + WotRefreshResult result = await Coordinator + .RefreshAsync(request, cancellationToken).ConfigureAwait(false); + + outputArguments.Clear(); + outputArguments.Add(Variant.FromStructure(result.Summary)); + outputArguments.Add(Variant.FromStructure(result.Results.ToArrayOf())); + outputArguments.Add(new Variant(result.NewGeneration)); + return ServiceResult.Good; + } + finally + { + m_refreshGate.Release(); + } + } + + private void OnRegistryChanged(object? sender, WotRegistryChangedEventArgs e) + { + // Keep the browseable projection synchronized on every change, + // including projection-only callbacks (which must never re-trigger + // materialization). + _ = SafeReconcileAsync(); + if (e.ProjectionOnly || !m_options.AutoRefresh) + { + return; + } + // Content mutation: re-project asynchronously without blocking the caller. + _ = SafeRefreshAsync("auto"); + } + + private void OnCoordinatorEvent(object? sender, WotMaterializationEventArgs e) + { + if (m_registryNode is null) + { + return; + } + try + { + NodeState source = EventSourceFor(e); + BaseEventState? evt = BuildEvent(e, source); + if (evt is not null) + { + source.ReportEvent(SystemContext, evt); + } + } + catch (Exception ex) + { + m_logger.FailedToReportMaterializationEvent(ex); + } + } + + private NodeState EventSourceFor(WotMaterializationEventArgs e) + { + // Resource lifecycle failures are sourced at the specific resource + // node; the registry object remains the summary source for the + // refresh-completed event. + if (e.Kind == WotMaterializationEventKind.RefreshCompleted) + { + return m_registryNode!; + } + return m_projection.EventSourceFor(e.Xid); + } + + private BaseEventState? BuildEvent(WotMaterializationEventArgs e, NodeState source) + { + switch (e.Kind) + { + case WotMaterializationEventKind.RefreshCompleted: + { + var evt = new WoTRefreshCompletedEventState(m_registryNode); + InitializeEvent(evt, source, "RefreshCompleted"); + // Summary/RequestId/NewGeneration come from the coordinator's + // refresh summary, which is produced from the registry snapshot. + if (e.Summary is not null) + { + SetEventStruct(evt, BrowseNames.Summary, e.Summary); + } + SetEventValue(evt, BrowseNames.RequestId, new Variant(e.RequestId)); + SetEventValue(evt, BrowseNames.Generation, new Variant(e.Generation)); + return evt; + } + case WotMaterializationEventKind.ValidationFailure: + { + var evt = new WoTValidationFailureEventState(source); + InitializeEvent(evt, source, "ValidationFailure: " + e.Reason); + PopulateResourceEventFields(evt, e); + if (e.Validation is not null) + { + SetEventStruct(evt, BrowseNames.ValidationOutcome, e.Validation); + } + return evt; + } + case WotMaterializationEventKind.LoadFailure: + { + var evt = new WoTLoadFailureEventState(source); + InitializeEvent(evt, source, "LoadFailure: " + e.Reason); + PopulateResourceEventFields(evt, e); + SetEventEnum(evt, BrowseNames.LoadState, e.LoadState); + SetEventValue( + evt, BrowseNames.FailedNodeId, new Variant(e.FailedNodeId)); + SetEventValue(evt, BrowseNames.Reason, new Variant(e.Reason)); + return evt; + } + case WotMaterializationEventKind.BindingFailure: + { + var evt = new WoTBindingFailureEventState(source); + InitializeEvent(evt, source, "BindingFailure: " + e.Reason); + PopulateResourceEventFields(evt, e); + SetEventValue(evt, BrowseNames.BindingUri, new Variant(e.BindingUri)); + SetEventValue(evt, BrowseNames.Reason, new Variant(e.Reason)); + return evt; + } + default: + { + var evt = new WoTResourceEventState(source); + InitializeEvent(evt, source, "Resource: " + e.ResourceId); + PopulateResourceEventFields(evt, e); + return evt; + } + } + } + + private void InitializeEvent(BaseEventState evt, NodeState source, string message) + { + evt.Initialize( + SystemContext, + source: source, + EventSeverity.Medium, + new LocalizedText(message)); + evt.SetChildValue( + SystemContext, Ua.BrowseNames.SourceName, + source.DisplayName.Text ?? "WoTRegistry", false); + } + + /// + /// Populates the identity/lifecycle fields shared by every + /// WoTResourceEventType (and its concrete subtypes) from the + /// coordinator's event arguments. + /// + private void PopulateResourceEventFields( + BaseEventState evt, WotMaterializationEventArgs e) + { + SetEventValue(evt, BrowseNames.Xid, new Variant(e.Xid)); + SetEventValue(evt, BrowseNames.ResourceId, new Variant(e.ResourceId)); + SetEventValue(evt, BrowseNames.VersionId, new Variant(e.VersionId)); + SetEventEnum(evt, BrowseNames.DocumentKind, e.DocumentKind); + SetEventValue(evt, BrowseNames.Generation, new Variant(e.Generation)); + SetEventEnum(evt, BrowseNames.Phase, e.Phase); + SetEventEnum(evt, BrowseNames.Outcome, e.Outcome); + } + + private void SetEventValue(BaseEventState evt, string browseName, Variant value) + { + evt.SetChildValue(SystemContext, WoTQualifiedName(browseName), value, false); + } + + private void SetEventEnum(BaseEventState evt, string browseName, TEnum value) + where TEnum : struct, Enum + { + evt.SetChildValue(SystemContext, WoTQualifiedName(browseName), value); + } + + private void SetEventStruct(BaseEventState evt, string browseName, TStruct value) + where TStruct : IEncodeable + { + evt.SetChildValue(SystemContext, WoTQualifiedName(browseName), value, false); + } + + private QualifiedName WoTQualifiedName(string browseName) + { + return new(browseName, (ushort)Server.NamespaceUris.GetIndex(Namespaces.WotCon)); + } + + private async Task SafeReconcileAsync() + { + try + { + await m_projection.ReconcileAsync(CancellationToken.None).ConfigureAwait(false); + } + catch (Exception ex) + { + m_logger.RegistryProjectionReconcileFailed(ex); + } + } + + private async Task SafeRefreshAsync(string reason) + { + try + { + await Coordinator.RefreshAsync(new WotRefreshRequest { RequestId = reason }) + .ConfigureAwait(false); + } + catch (Exception ex) + { + m_logger.RegistryRefreshFailed(ex, reason); + } + } + + internal ServiceResult CheckManagementAccess(ISystemContext context, string operation) + { + if (context is not SessionSystemContext { OperationContext: OperationContext operationContext }) + { + // Local / programmatic call: allowed. + return ServiceResult.Good; + } + WotManagementAccessPolicy policy = m_options.ManagementAccess; + MessageSecurityMode securityMode = operationContext.ChannelContext? + .EndpointDescription?.SecurityMode ?? + MessageSecurityMode.None; + if (securityMode != policy.MinimumSecurityMode) + { + m_logger.ManagementCallDeniedSecurityMode(operation, securityMode); + return StatusCodes.BadUserAccessDenied; + } + IUserIdentity? identity = operationContext.UserIdentity; + if (identity is null || + (!policy.AllowAnonymous && identity.TokenType == UserTokenType.Anonymous)) + { + m_logger.ManagementCallDeniedAnonymousIdentity(operation); + return StatusCodes.BadUserAccessDenied; + } + if (!identity.GrantedRoleIds.Contains(policy.RequiredRoleId)) + { + m_logger.ManagementCallDeniedMissingRole(operation); + return StatusCodes.BadUserAccessDenied; + } + return ServiceResult.Good; + } + + private static IList EnsureList( + IDictionary> externalReferences, NodeId nodeId) + { + if (!externalReferences.TryGetValue(nodeId, out IList? list)) + { + list = []; + externalReferences[nodeId] = list; + } + return list; + } + + private void SetChildValue(BaseObjectState parent, string browseName, Variant value) + { + ushort ns = (ushort)Server.NamespaceUris.GetIndex(Namespaces.WotCon); + if (parent.FindChild(SystemContext, new QualifiedName(browseName, ns)) + is BaseVariableState variable) + { + variable.Value = value; + } + } + + private readonly WotRegistryServerOptions m_options; + private readonly WotRegistryProjection m_projection; + private readonly SemaphoreSlim m_refreshGate = new(1, 1); + private BaseObjectState? m_registryNode; + } + + /// + /// Holds source-generated log messages emitted by the WoT registry NodeManager component. + /// + internal static partial class WotRegistryNodeManagerLog + { + /// + /// Logs that raising a WoT materialization event failed. + /// + [LoggerMessage(EventId = WotConServerEventIds.WotRegistryNodeManager + 0, Level = LogLevel.Warning, + Message = "Failed to report WoT materialization event.")] + public static partial void FailedToReportMaterializationEvent(this ILogger logger, Exception ex); + + /// + /// Logs that reconciling the registry projection failed. + /// + [LoggerMessage(EventId = WotConServerEventIds.WotRegistryNodeManager + 1, Level = LogLevel.Warning, + Message = "WoT registry projection reconcile failed.")] + public static partial void RegistryProjectionReconcileFailed(this ILogger logger, Exception ex); + + /// + /// Logs that a registry refresh failed for the supplied reason. + /// + [LoggerMessage(EventId = WotConServerEventIds.WotRegistryNodeManager + 2, Level = LogLevel.Warning, + Message = "WoT registry refresh ({Reason}) failed.")] + public static partial void RegistryRefreshFailed(this ILogger logger, Exception ex, string reason); + + /// + /// Logs that a registry management call was denied because channel security was too weak. + /// + [LoggerMessage(EventId = WotConServerEventIds.WotRegistryNodeManager + 3, Level = LogLevel.Warning, + Message = "Denied WoT registry '{Operation}': channel security mode {Mode} is too low.")] + public static partial void ManagementCallDeniedSecurityMode( + this ILogger logger, + string operation, + MessageSecurityMode mode); + + /// + /// Logs that a registry management call was denied because the caller was anonymous. + /// + [LoggerMessage(EventId = WotConServerEventIds.WotRegistryNodeManager + 4, Level = LogLevel.Warning, + Message = "Denied WoT registry '{Operation}': anonymous or missing identity.")] + public static partial void ManagementCallDeniedAnonymousIdentity(this ILogger logger, string operation); + + /// + /// Logs that a registry management call was denied because the caller lacks the required role. + /// + [LoggerMessage(EventId = WotConServerEventIds.WotRegistryNodeManager + 5, Level = LogLevel.Warning, + Message = "Denied WoT registry '{Operation}': caller lacks required role.")] + public static partial void ManagementCallDeniedMissingRole(this ILogger logger, string operation); + } +} diff --git a/src/Opc.Ua.WotCon.Server/WotRegistryNodeManagerFactory.cs b/src/Opc.Ua.WotCon.Server/WotRegistryNodeManagerFactory.cs new file mode 100644 index 0000000000..8ea2865875 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/WotRegistryNodeManagerFactory.cs @@ -0,0 +1,90 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry; + +namespace Opc.Ua.WotCon.Server +{ + /// + /// that produces the stable + /// configured with the shared registry + /// service and materialization coordinator. + /// + public sealed class WotRegistryNodeManagerFactory : IAsyncNodeManagerFactory + { + /// + /// Creates a new factory. + /// + public WotRegistryNodeManagerFactory( + WotRegistryServerOptions options, + IWotRegistryService registry, + WotMaterializationCoordinator coordinator) + { + m_options = options ?? throw new ArgumentNullException(nameof(options)); + m_registry = registry ?? throw new ArgumentNullException(nameof(registry)); + m_coordinator = coordinator ?? throw new ArgumentNullException(nameof(coordinator)); + } + + /// + public ArrayOf NamespacesUris => new string[] + { + Namespaces.WotCon, + XRegistryWellKnown.XRegistryNamespaceUri + }; + + /// + public ValueTask CreateAsync( + IServerInternal server, + ApplicationConfiguration configuration, + CancellationToken cancellationToken = default) + { + // CA2000 cannot model ownership transfer through ValueTask. + // TODO: Remove this suppression when CA2000 recognizes factory ownership transfer. +#pragma warning disable CA2000 + IAsyncNodeManager nodeManager = new WotRegistryNodeManager( + server, + configuration, + m_options, + m_registry, + m_coordinator); +#pragma warning restore CA2000 + return new ValueTask(nodeManager); + } + + private readonly WotRegistryServerOptions m_options; + private readonly IWotRegistryService m_registry; + private readonly WotMaterializationCoordinator m_coordinator; + } +} diff --git a/src/Opc.Ua.WotCon.Server/WotRegistryProjection.cs b/src/Opc.Ua.WotCon.Server/WotRegistryProjection.cs new file mode 100644 index 0000000000..7c6d0081a0 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/WotRegistryProjection.cs @@ -0,0 +1,1160 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry; + +namespace Opc.Ua.WotCon.Server +{ + /// + /// Materializes the WoT Connectivity 1.1 registry snapshot as browseable + /// xRegistry Objects beneath the stable WoTRegistry node: + /// ThingDescriptionGroupType/ThingModelGroupType group Objects + /// and their ThingDescriptionFileType/ThingModelFileType + /// document resources. Every group and resource is (re)created, updated and + /// removed to mirror the immutable snapshot, with deterministic NodeIds + /// derived from the registry Xid, notifier references up the + /// registry → group → resource chain, and the xRegistry CRUD / + /// FileType / document Methods wired to the injected registry service. + /// + internal sealed class WotRegistryProjection : IDisposable + { + public WotRegistryProjection( + WotRegistryNodeManager manager, + IWotRegistryService registry, + WotRegistryServerOptions options) + { + m_manager = manager ?? throw new ArgumentNullException(nameof(manager)); + m_registry = registry ?? throw new ArgumentNullException(nameof(registry)); + m_options = options ?? throw new ArgumentNullException(nameof(options)); + m_modelNs = (ushort)manager.Server.NamespaceUris.GetIndex(Namespaces.WotCon); + } + + /// + /// Binds the projection to the well-known registry Object, wires the + /// registry-level CreateGroup/GetOrCreateGroup Methods, materializes + /// and wires its Labels (AttributesType) container, and performs the + /// first reconcile. + /// + /// + public async ValueTask AttachAsync(BaseObjectState registryNode, CancellationToken ct) + { + m_registryNode = registryNode ?? throw new ArgumentNullException(nameof(registryNode)); + registryNode.EventNotifier = EventNotifiers.SubscribeToEvents; + WireMethod(registryNode, XRegistry.BrowseNames.CreateGroup, OnCreateGroupAsync); + WireMethod(registryNode, XRegistry.BrowseNames.GetOrCreateGroup, OnGetOrCreateGroupAsync); + if (registryNode is RegistryState registryTyped) + { + registryTyped.AddLabels(m_manager.SystemContext); + WireLabelsContainer( + registryTyped.Labels, OnAddRegistryLabelAsync, OnRemoveRegistryLabelAsync); + LinkMethodArguments(registryTyped.Labels, m_manager.SystemContext); + } + await ReconcileAsync(ct).ConfigureAwait(false); + } + + /// + /// Finds the browseable resource node used as an event source, or the + /// registry node when the resource is unknown. + /// + public NodeState EventSourceFor(string? xid) + { + if (!string.IsNullOrEmpty(xid) && + m_resourcesByXid.TryGetValue(xid!, out WoTDocumentState? node)) + { + return node; + } + return m_registryNode!; + } + + /// + /// Reconciles the browseable projection with the current registry + /// snapshot: creates, updates and removes group and resource nodes. + /// Never re-triggers materialization. + /// + public async ValueTask ReconcileAsync(CancellationToken ct) + { + if (m_registryNode is null) + { + return; + } + await m_gate.WaitAsync(ct).ConfigureAwait(false); + try + { + WotRegistrySnapshot snapshot = m_registry.Current; + + if (m_registryNode is RegistryState registryTyped && registryTyped.Labels is not null) + { + await SyncLabelPropertiesAsync( + registryTyped.Labels, RegistryNodeIdPath, snapshot.Labels, ct) + .ConfigureAwait(false); + } + + var seenGroups = new HashSet(StringComparer.Ordinal); + foreach (WotResourceGroup group in snapshot.Groups.Values) + { + seenGroups.Add(group.GroupId); + if (!m_groups.TryGetValue(group.GroupId, out GroupEntry? entry)) + { + entry = await CreateGroupNodeAsync(group, ct).ConfigureAwait(false); + m_groups[group.GroupId] = entry; + } + else + { + ApplyGroupProperties(entry.Node, group); + if (entry.Node.Labels is not null) + { + await SyncLabelPropertiesAsync( + entry.Node.Labels, GroupNodeIdPath(group.GroupId), group.Labels, ct) + .ConfigureAwait(false); + } + entry.Node.ClearChangeMasks(m_manager.SystemContext, includeChildren: true); + } + + var seenResources = new HashSet(StringComparer.Ordinal); + foreach (WotResource resource in group.Resources.Values) + { + seenResources.Add(resource.ResourceId); + if (!entry.Resources.TryGetValue(resource.ResourceId, out ResourceEntry? res)) + { + res = await CreateResourceNodeAsync(entry, resource, ct) + .ConfigureAwait(false); + entry.Resources[resource.ResourceId] = res; + } + else + { + ApplyResourceProperties(res, resource); + if (res.Node.Labels is not null) + { + await SyncLabelPropertiesAsync( + res.Node.Labels, + ResourceNodeIdPath(resource.GroupId, resource.ResourceId), + resource.Labels, + ct).ConfigureAwait(false); + } + res.Node.ClearChangeMasks(m_manager.SystemContext, includeChildren: true); + } + } + + foreach (string resourceId in entry.Resources.Keys + .Where(id => !seenResources.Contains(id)).ToList()) + { + await RemoveResourceNodeAsync(entry, resourceId, ct).ConfigureAwait(false); + } + } + + foreach (string groupId in m_groups.Keys + .Where(id => !seenGroups.Contains(id)).ToList()) + { + await RemoveGroupNodeAsync(groupId, ct).ConfigureAwait(false); + } + } + finally + { + m_gate.Release(); + } + } + + public void Dispose() + { + if (m_disposed) + { + return; + } + m_disposed = true; + foreach (GroupEntry group in m_groups.Values) + { + foreach (ResourceEntry resource in group.Resources.Values) + { + resource.File?.Dispose(); + } + } + m_groups.Clear(); + m_resourcesByXid.Clear(); + m_gate.Dispose(); + } + + private async ValueTask CreateGroupNodeAsync( + WotResourceGroup group, CancellationToken ct) + { + bool tm = group.Kind == WoTDocumentKindEnum.ThingModel; + GroupState node = tm + ? new ThingModelGroupState(m_registryNode) + : new ThingDescriptionGroupState(m_registryNode); + NodeId nodeId = GroupNodeId(group.GroupId); + node.ReferenceTypeId = Ua.ReferenceTypeIds.Organizes; + node.TypeDefinitionId = ExpandedNodeId.ToNodeId( + tm ? ObjectTypeIds.ThingModelGroupType : ObjectTypeIds.ThingDescriptionGroupType, + m_manager.Server.NamespaceUris); + node.Create( + m_manager.SystemContext, nodeId, + new QualifiedName(group.GroupId, m_modelNs), new LocalizedText(group.Name), + assignNodeIds: false); + + node.AddCreateResource(m_manager.SystemContext) + .AddGetOrCreateResource(m_manager.SystemContext) + .AddDelete(m_manager.SystemContext) + .AddXid(m_manager.SystemContext) + .AddEpoch(m_manager.SystemContext) + .AddName(m_manager.SystemContext) + .AddDescription(m_manager.SystemContext) + .AddCreatedAt(m_manager.SystemContext) + .AddModifiedAt(m_manager.SystemContext) + .AddLabels(m_manager.SystemContext); + node.EventNotifier = EventNotifiers.SubscribeToEvents; + + string groupId = group.GroupId; + WoTDocumentKindEnum kind = group.Kind; + node.CreateResource?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnCreateResourceAsync(groupId, kind, c, i, ot, t); + node.GetOrCreateResource?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnGetOrCreateResourceAsync(groupId, kind, c, i, ot, t); + node.Delete?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnDeleteGroupAsync(groupId, c, i, t); + WireLabelsContainer( + node.Labels, + (c, i, t) => OnAddGroupLabelAsync(groupId, c, i, t), + (c, i, t) => OnRemoveGroupLabelAsync(groupId, c, i, t)); + + ApplyGroupProperties(node, group); + DateTime createdAt = DateTime.UtcNow; + SetValue(node.CreatedAt, (DateTimeUtc)createdAt); + SetValue(node.ModifiedAt, (DateTimeUtc)createdAt); + m_manager.SystemContext.AssignInstanceChildNodeIds(node); + LinkMethodArguments(node, m_manager.SystemContext); + + m_registryNode!.AddChild(node); + m_registryNode.AddReference(Ua.ReferenceTypeIds.HasNotifier, false, nodeId); + node.AddReference(Ua.ReferenceTypeIds.HasNotifier, true, m_registryNode.NodeId); + + await m_manager.AddPredefinedNodeAsync(node, ct).ConfigureAwait(false); + var entry = new GroupEntry(node, group.Kind); + await SyncLabelPropertiesAsync( + node.Labels!, GroupNodeIdPath(group.GroupId), group.Labels, ct).ConfigureAwait(false); + return entry; + } + + private void ApplyGroupProperties(GroupState node, WotResourceGroup group) + { + SetValue(node.GroupId, group.GroupId); + SetValue(node.Xid, group.Xid); + SetValue(node.Epoch, (uint)group.Epoch); + SetValue(node.Name, group.Name); + SetValue(node.Description, group.Description); + } + + private async ValueTask RemoveGroupNodeAsync(string groupId, CancellationToken ct) + { + if (!m_groups.TryGetValue(groupId, out GroupEntry? entry)) + { + return; + } + foreach (string resourceId in entry.Resources.Keys.ToList()) + { + await RemoveResourceNodeAsync(entry, resourceId, ct).ConfigureAwait(false); + } + m_registryNode!.RemoveReference(Ua.ReferenceTypeIds.HasNotifier, false, entry.Node.NodeId); + m_registryNode.RemoveChild(entry.Node); + await m_manager.DeleteNodeAsync(m_manager.SystemContext, entry.Node.NodeId, ct) + .ConfigureAwait(false); + m_groups.Remove(groupId); + } + + private async ValueTask CreateResourceNodeAsync( + GroupEntry group, WotResource resource, CancellationToken ct) + { + bool tm = resource.Kind == WoTDocumentKindEnum.ThingModel; + WoTDocumentState node = tm + ? new ThingModelFileState(group.Node) + : new ThingDescriptionFileState(group.Node); + NodeId nodeId = ResourceNodeId(resource.GroupId, resource.ResourceId); + node.ReferenceTypeId = Ua.ReferenceTypeIds.Organizes; + node.TypeDefinitionId = ExpandedNodeId.ToNodeId( + tm ? ObjectTypeIds.ThingModelFileType : ObjectTypeIds.ThingDescriptionFileType, + m_manager.Server.NamespaceUris); + node.Create( + m_manager.SystemContext, nodeId, + new QualifiedName(resource.ResourceId, m_modelNs), + new LocalizedText(resource.Name), assignNodeIds: false); + + // Optional xRegistry registry metadata children. + node.AddVersionId(m_manager.SystemContext) + .AddFormat(m_manager.SystemContext) + .AddContentType(m_manager.SystemContext) + .AddXid(m_manager.SystemContext) + .AddEpoch(m_manager.SystemContext) + .AddName(m_manager.SystemContext) + .AddDescription(m_manager.SystemContext) + .AddCreatedAt(m_manager.SystemContext) + .AddModifiedAt(m_manager.SystemContext); + node.AddDesiredVersionId(m_manager.SystemContext) + .AddActiveVersionId(m_manager.SystemContext) + .AddIsDefault(m_manager.SystemContext) + .AddContentDigest(m_manager.SystemContext) + .AddValidationOutcome(m_manager.SystemContext) + .AddMaterializedNodeCount(m_manager.SystemContext) + .AddRootNodeId(m_manager.SystemContext) + .AddRefreshGeneration(m_manager.SystemContext) + .AddLastRefreshTime(m_manager.SystemContext); + node.AddDelete(m_manager.SystemContext); + node.AddValidate(m_manager.SystemContext); + node.AddSetEnabled(m_manager.SystemContext); + node.AddSetDefaultVersion(m_manager.SystemContext); + node.AddLabels(m_manager.SystemContext); + node.EventNotifier = EventNotifiers.SubscribeToEvents; + + if (node is ThingDescriptionFileState td) + { + td.AddThingId(m_manager.SystemContext) + .AddThingTitle(m_manager.SystemContext) + .AddBaseUri(m_manager.SystemContext); + } + else if (node is ThingModelFileState tmNode) + { + tmNode.AddModelTitle(m_manager.SystemContext) + .AddModelVersion(m_manager.SystemContext) + .AddDerivedTypeNodeId(m_manager.SystemContext); + } + + string groupId = resource.GroupId; + string resourceId = resource.ResourceId; + WoTDocumentKindEnum kind = resource.Kind; + node.Delete?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnDeleteResourceAsync(groupId, resourceId, c, i, t); + node.Validate?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnValidateAsync(groupId, resourceId, c, ot, t); + node.SetEnabled?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnSetEnabledAsync(groupId, resourceId, c, i, t); + node.SetDefaultVersion?.OnCallMethod2Async = + (c, m, o, i, ot, t) => OnSetDefaultVersionAsync(groupId, resourceId, c, i, t); + WireLabelsContainer( + node.Labels, + (c, i, t) => OnAddResourceLabelAsync(groupId, resourceId, c, i, t), + (c, i, t) => OnRemoveResourceLabelAsync(groupId, resourceId, c, i, t)); + + // FileType transfer for the document body (commit-on-close). + var file = new WotResourceFileManager( + node, + m_options.Bounds.MaxOpenFileHandles, + m_options.Bounds.MaxDocumentBytes, + m_manager.CheckManagementAccess, + (bytes, session, token) => CommitDocumentAsync(groupId, resourceId, kind, bytes, token)); + + ApplyResourceProperties(new ResourceEntry(node, file, groupId, resourceId, kind), resource); + m_manager.SystemContext.AssignInstanceChildNodeIds(node); + LinkMethodArguments(node, m_manager.SystemContext); + + group.Node.AddChild(node); + group.Node.AddReference(Ua.ReferenceTypeIds.HasNotifier, false, nodeId); + node.AddReference(Ua.ReferenceTypeIds.HasNotifier, true, group.Node.NodeId); + + await m_manager.AddPredefinedNodeAsync(node, ct).ConfigureAwait(false); + m_resourcesByXid[BuildXid(resource.GroupId, resource.ResourceId)] = node; + var entry = new ResourceEntry(node, file, groupId, resourceId, kind); + await SyncLabelPropertiesAsync( + node.Labels!, ResourceNodeIdPath(groupId, resourceId), resource.Labels, ct) + .ConfigureAwait(false); + return entry; + } + + private void ApplyResourceProperties(ResourceEntry entry, WotResource resource) + { + WoTDocumentState node = entry.Node; + WotResourceVersion? version = resource.DefaultVersion; + WotResourceVersion? active = resource.ActiveVersion ?? version; + + SetValue(node.ResourceId, resource.ResourceId); + SetValue(node.VersionId, version?.VersionId ?? string.Empty); + SetValue(node.Format, version?.Format ?? string.Empty); + SetValue(node.ContentType, version?.ContentType ?? "application/td+json"); + SetValue(node.Xid, resource.Xid); + SetValue(node.Epoch, (uint)resource.Epoch); + SetValue(node.Name, resource.Name); + SetValue(node.Description, resource.Description); + if (version is not null) + { + SetValue(node.CreatedAt, (DateTimeUtc)version.CreatedAt); + } + SetValue(node.ModifiedAt, (DateTimeUtc)(version?.ModifiedAt ?? DateTime.UtcNow)); + + SetValue(node.DocumentKind, resource.Kind); + SetValue(node.Enabled, resource.Enabled); + SetValue(node.LoadState, resource.LoadState); + SetValue(node.DesiredVersionId, resource.DesiredVersionId ?? string.Empty); + SetValue(node.ActiveVersionId, resource.ActiveVersionId ?? string.Empty); + SetValue(node.IsDefault, version is not null && + string.Equals(version.VersionId, resource.DefaultVersionId, StringComparison.Ordinal)); + SetValue(node.ContentDigest, (ByteString)(version?.Digest ?? [])); + if (resource.Validation is not null) + { + SetValue(node.ValidationOutcome, resource.Validation); + } + SetValue(node.MaterializedNodeCount, (uint)resource.MaterializedNodeCount); + SetValue(node.RootNodeId, resource.RootNodeId); + SetValue(node.RefreshGeneration, resource.RefreshGeneration); + SetValue(node.LastRefreshTime, (DateTimeUtc)resource.LastRefreshTime); + + if (node is ThingDescriptionFileState td) + { + SetValue(td.ThingId, resource.ThingId ?? string.Empty); + SetValue(td.ThingTitle, resource.Title ?? string.Empty); + } + else if (node is ThingModelFileState tmNode) + { + SetValue(tmNode.ModelTitle, resource.Title ?? string.Empty); + SetValue(tmNode.DerivedTypeNodeId, resource.RootNodeId); + } + + byte[] content = active?.Content.ToArray() ?? []; + entry.File?.UpdatePersistedContent(content, version?.ContentType); + } + + private async ValueTask RemoveResourceNodeAsync( + GroupEntry group, string resourceId, CancellationToken ct) + { + if (!group.Resources.TryGetValue(resourceId, out ResourceEntry? entry)) + { + return; + } + entry.File?.Dispose(); + m_resourcesByXid.TryRemove(BuildXid(entry.GroupId, entry.ResourceId), out _); + group.Node.RemoveReference(Ua.ReferenceTypeIds.HasNotifier, false, entry.Node.NodeId); + group.Node.RemoveChild(entry.Node); + await m_manager.DeleteNodeAsync(m_manager.SystemContext, entry.Node.NodeId, ct) + .ConfigureAwait(false); + group.Resources.Remove(resourceId); + } + + private async ValueTask OnCreateGroupAsync( + ISystemContext context, MethodState method, NodeId objectId, + ArrayOf input, List output, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "CreateGroup"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? groupId = GetString(input, 0); + if (string.IsNullOrWhiteSpace(groupId)) + { + return StatusCodes.BadInvalidArgument; + } + WotResourceGroup? group = await m_registry + .TryCreateGroupAsync(groupId!, KindForGroup(groupId!), cancellationToken: ct) + .ConfigureAwait(false); + if (group is null) + { + return ServiceResult.Create( + StatusCodes.BadNodeIdExists, $"Group '{groupId}' already exists."); + } + await ReconcileAsync(ct).ConfigureAwait(false); + output.Clear(); + output.Add(new Variant(GroupNodeId(group.GroupId))); + return ServiceResult.Good; + } + + private async ValueTask OnGetOrCreateGroupAsync( + ISystemContext context, MethodState method, NodeId objectId, + ArrayOf input, List output, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "GetOrCreateGroup"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? groupId = GetString(input, 0); + if (string.IsNullOrWhiteSpace(groupId)) + { + return StatusCodes.BadInvalidArgument; + } + bool existed = m_registry.Current.FindGroup(NormalizeId(groupId!)) is not null; + WotResourceGroup group = await m_registry + .GetOrCreateGroupAsync(groupId!, KindForGroup(groupId!), cancellationToken: ct) + .ConfigureAwait(false); + await ReconcileAsync(ct).ConfigureAwait(false); + output.Clear(); + output.Add(new Variant(GroupNodeId(group.GroupId))); + output.Add(new Variant(!existed)); + return ServiceResult.Good; + } + + private async ValueTask OnCreateResourceAsync( + string groupId, WoTDocumentKindEnum kind, ISystemContext context, + ArrayOf input, List output, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "CreateResource"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? resourceId = GetString(input, 0); + bool requestOpen = GetBool(input, 2, false); + if (string.IsNullOrWhiteSpace(resourceId)) + { + return StatusCodes.BadInvalidArgument; + } + WotResource? resource = await m_registry + .TryCreateResourceAsync(groupId, resourceId!, kind, ct).ConfigureAwait(false); + if (resource is null) + { + return ServiceResult.Create( + StatusCodes.BadNodeIdExists, + $"Resource '{resourceId}' already exists in group '{groupId}'."); + } + await ReconcileAsync(ct).ConfigureAwait(false); + return await CompleteResourceOutputAsync( + resource.GroupId, resource.ResourceId, requestOpen, context, output, created: null, ct) + .ConfigureAwait(false); + } + + private async ValueTask OnGetOrCreateResourceAsync( + string groupId, WoTDocumentKindEnum kind, ISystemContext context, + ArrayOf input, List output, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "GetOrCreateResource"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? resourceId = GetString(input, 0); + bool requestOpen = GetBool(input, 2, false); + if (string.IsNullOrWhiteSpace(resourceId)) + { + return StatusCodes.BadInvalidArgument; + } + (WotResource resource, bool created) = await m_registry + .GetOrCreateResourceAsync(groupId, resourceId!, kind, ct).ConfigureAwait(false); + await ReconcileAsync(ct).ConfigureAwait(false); + return await CompleteResourceOutputAsync( + resource.GroupId, resource.ResourceId, requestOpen, context, output, created, ct) + .ConfigureAwait(false); + } + + private async ValueTask CompleteResourceOutputAsync( + string groupId, string resourceId, bool requestOpen, + ISystemContext context, List output, bool? created, CancellationToken ct) + { + NodeId nodeId = ResourceNodeId(groupId, resourceId); + uint fileHandle = 0; + await m_gate.WaitAsync(ct).ConfigureAwait(false); + try + { + if (requestOpen && + m_groups.TryGetValue(groupId, out GroupEntry? group) && + group.Resources.TryGetValue(resourceId, out ResourceEntry? entry) && + entry.File is not null) + { + ServiceResult open = entry.File.TryOpenWriteHandle( + context is ISessionSystemContext sessionContext + ? sessionContext.SessionId.GetValueOrDefault() + : NodeId.Null, + out fileHandle); + if (ServiceResult.IsBad(open)) + { + return open; + } + } + } + finally + { + m_gate.Release(); + } + + WotResource? resource = m_registry.Current.FindResource(groupId, resourceId); + output.Clear(); + output.Add(new Variant(nodeId)); + output.Add(new Variant(resource?.DefaultVersionId ?? string.Empty)); + output.Add(new Variant(fileHandle)); + if (created is { } wasCreated) + { + output.Add(new Variant(wasCreated)); + } + return ServiceResult.Good; + } + + private async ValueTask OnDeleteGroupAsync( + string groupId, ISystemContext context, ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "DeleteGroup"); + if (ServiceResult.IsBad(access)) + { + return access; + } + long? epoch = OptionalEpoch(input, 0); + WotRegistryMutationResult result = await m_registry + .DeleteGroupAsync(groupId, epoch, ct).ConfigureAwait(false); + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnDeleteResourceAsync( + string groupId, string resourceId, ISystemContext context, + ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "DeleteResource"); + if (ServiceResult.IsBad(access)) + { + return access; + } + long? epoch = OptionalEpoch(input, 0); + WotRegistryMutationResult result = await m_registry + .DeleteResourceAsync(groupId, resourceId, epoch, ct).ConfigureAwait(false); + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnValidateAsync( + string groupId, string resourceId, ISystemContext context, + List output, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "Validate"); + if (ServiceResult.IsBad(access)) + { + return access; + } + WoTValidationOutcomeDataType outcome; + try + { + outcome = await m_registry.ValidateResourceAsync(groupId, resourceId, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + output.Clear(); +#pragma warning disable CS0618 // Validate generated proxy expects a direct structure Variant. + output.Add(new Variant(outcome)); +#pragma warning restore CS0618 + return ServiceResult.Good; + } + + private async ValueTask OnSetEnabledAsync( + string groupId, string resourceId, ISystemContext context, + ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "SetEnabled"); + if (ServiceResult.IsBad(access)) + { + return access; + } + if (GetBoolOrNull(input, 0) is not { } enabled) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, "The Enabled argument is required."); + } + long? epoch = OptionalEpoch(input, 1); + WotRegistryMutationResult result = await m_registry + .SetEnabledAsync(groupId, resourceId, enabled, epoch, ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnSetDefaultVersionAsync( + string groupId, string resourceId, ISystemContext context, + ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "SetDefaultVersion"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? versionId = GetString(input, 0); + if (string.IsNullOrEmpty(versionId)) + { + return ServiceResult.Create( + StatusCodes.BadInvalidArgument, "The VersionId argument is required."); + } + long? epoch = OptionalEpoch(input, 1); + WotRegistryMutationResult result = await m_registry + .SetDefaultVersionAsync(groupId, resourceId, versionId!, epoch, ct) + .ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask CommitDocumentAsync( + string groupId, string resourceId, WoTDocumentKindEnum kind, + byte[] content, CancellationToken ct) + { + var request = new WotUpsertResourceRequest + { + GroupId = groupId, + ResourceId = resourceId, + Kind = kind, + Content = content, + ContentType = kind == WoTDocumentKindEnum.ThingModel + ? "application/tm+json" + : "application/td+json", + Format = kind == WoTDocumentKindEnum.ThingModel ? "WoT-TM/1.1" : "WoT-TD/1.1", + SetAsDefault = true + }; + WotRegistryMutationResult result = await m_registry + .UpsertResourceAsync(request, ct).ConfigureAwait(false); + // A validation failure still stores the version (Warning): the bytes + // are never lost and the previous active projection is retained. + return result.Outcome is WoTOutcomeEnum.Rejected or WoTOutcomeEnum.Failed + ? ServiceResult.Create(StatusCodes.BadInvalidState, result.Message) + : ServiceResult.Good; + } + + /// + /// Wires the AddAttribute/RemoveAttribute Method handlers on a + /// materialized Labels (AttributesType) container, instantiating the + /// two optional Method children when not already present. + /// + private void WireLabelsContainer( + AttributesState? labels, + Func, CancellationToken, ValueTask> onAdd, + Func, CancellationToken, ValueTask> onRemove) + { + if (labels is null) + { + return; + } + labels.AddAddAttribute(m_manager.SystemContext) + .AddRemoveAttribute(m_manager.SystemContext); + labels.AddAttribute?.OnCallMethod2Async = (c, m, o, i, ot, t) => onAdd(c, i, t); + labels.RemoveAttribute?.OnCallMethod2Async = (c, m, o, i, ot, t) => onRemove(c, i, t); + } + + /// + /// Reconciles the browsable label Property children of a Labels + /// container against the desired dictionary: adds/updates changed + /// values, and removes labels no longer present. Ordinal enumeration + /// of keeps materialization order + /// deterministic. + /// + private async ValueTask SyncLabelPropertiesAsync( + AttributesState labels, + string basePath, + ImmutableSortedDictionary desired, + CancellationToken ct) + { + ISystemContext context = m_manager.SystemContext; + var existing = new Dictionary>(StringComparer.Ordinal); + var children = new List(); + labels.GetChildren(context, children); + foreach (BaseInstanceState child in children) + { + if (child is PropertyState property && property.BrowseName.Name is string name) + { + existing[name] = property; + } + } + + foreach (KeyValuePair label in desired) + { + if (existing.TryGetValue(label.Key, out PropertyState? property)) + { + if (!string.Equals(property.Value, label.Value, StringComparison.Ordinal)) + { + property.Value = label.Value; + property.ClearChangeMasks(context, includeChildren: false); + } + continue; + } + PropertyState created = labels.AddAttribute_Placeholder( + context, new QualifiedName(label.Key, m_modelNs)); + created.NodeId = LabelNodeId(basePath, label.Key); + created.Value = label.Value; + await m_manager.AddPredefinedNodeAsync(created, ct).ConfigureAwait(false); + } + + foreach (KeyValuePair> stale in existing + .Where(kv => !desired.ContainsKey(kv.Key)).ToList()) + { + labels.RemoveChild(stale.Value); + await m_manager.DeleteNodeAsync(m_manager.SystemContext, stale.Value.NodeId, ct) + .ConfigureAwait(false); + } + } + + private NodeId LabelNodeId(string basePath, string key) + { + return new NodeId($"{basePath}/labels/{key}", m_modelNs); + } + + private async ValueTask OnAddRegistryLabelAsync( + ISystemContext context, ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "AddAttribute"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? key = GetString(input, 0); + string value = GetString(input, 1) ?? string.Empty; + long? epoch = OptionalEpoch(input, 2); + WotRegistryMutationResult result; + try + { + result = await m_registry + .AddRegistryLabelAsync(key ?? string.Empty, value, epoch, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnRemoveRegistryLabelAsync( + ISystemContext context, ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "RemoveAttribute"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? key = GetString(input, 0); + long? epoch = OptionalEpoch(input, 1); + WotRegistryMutationResult result; + try + { + result = await m_registry + .RemoveRegistryLabelAsync(key ?? string.Empty, epoch, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnAddGroupLabelAsync( + string groupId, ISystemContext context, ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "AddAttribute"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? key = GetString(input, 0); + string value = GetString(input, 1) ?? string.Empty; + long? epoch = OptionalEpoch(input, 2); + WotRegistryMutationResult result; + try + { + result = await m_registry + .AddGroupLabelAsync(groupId, key ?? string.Empty, value, epoch, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnRemoveGroupLabelAsync( + string groupId, ISystemContext context, ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "RemoveAttribute"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? key = GetString(input, 0); + long? epoch = OptionalEpoch(input, 1); + WotRegistryMutationResult result; + try + { + result = await m_registry + .RemoveGroupLabelAsync(groupId, key ?? string.Empty, epoch, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnAddResourceLabelAsync( + string groupId, string resourceId, ISystemContext context, + ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "AddAttribute"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? key = GetString(input, 0); + string value = GetString(input, 1) ?? string.Empty; + long? epoch = OptionalEpoch(input, 2); + WotRegistryMutationResult result; + try + { + result = await m_registry + .AddResourceLabelAsync(groupId, resourceId, key ?? string.Empty, value, epoch, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private async ValueTask OnRemoveResourceLabelAsync( + string groupId, string resourceId, ISystemContext context, + ArrayOf input, CancellationToken ct) + { + ServiceResult access = m_manager.CheckManagementAccess(context, "RemoveAttribute"); + if (ServiceResult.IsBad(access)) + { + return access; + } + string? key = GetString(input, 0); + long? epoch = OptionalEpoch(input, 1); + WotRegistryMutationResult result; + try + { + result = await m_registry + .RemoveResourceLabelAsync(groupId, resourceId, key ?? string.Empty, epoch, ct) + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + return ex.Result; + } + await ReconcileAsync(ct).ConfigureAwait(false); + return ToServiceResult(result); + } + + private WoTDocumentKindEnum KindForGroup(string groupId) + { + return string.Equals(NormalizeId(groupId), WotRegistryGroups.ThingModels, StringComparison.Ordinal) + ? WoTDocumentKindEnum.ThingModel + : WoTDocumentKindEnum.ThingDescription; + } + + private static string NormalizeId(string id) + { + return WotRegistryService.NormalizeSegment(id, nameof(id)); + } + + private static string BuildXid(string groupId, string resourceId) + { + return $"/groups/{groupId}/resources/{resourceId}"; + } + + private const string RegistryNodeIdPath = "WoTRegistry"; + + private static string GroupNodeIdPath(string groupId) + { + return "WoTRegistry/groups/" + groupId; + } + + private static string ResourceNodeIdPath(string groupId, string resourceId) + { + return $"WoTRegistry/groups/{groupId}/resources/{resourceId}"; + } + + private NodeId GroupNodeId(string groupId) + { + return new NodeId(GroupNodeIdPath(groupId), m_modelNs); + } + + private NodeId ResourceNodeId(string groupId, string resourceId) + { + return new NodeId(ResourceNodeIdPath(groupId, resourceId), m_modelNs); + } + + private void WireMethod( + BaseObjectState parent, string browseName, GenericMethodCalledEventHandler2Async handler) + { + MethodState? method = + parent.FindChild(m_manager.SystemContext, new QualifiedName(browseName, XRegistryNs)) as + MethodState + ?? parent.FindChild(m_manager.SystemContext, new QualifiedName(browseName, m_modelNs)) as + MethodState; + method?.OnCallMethod2Async = handler; + } + + private ushort XRegistryNs + => (ushort)m_manager.Server.NamespaceUris.GetIndex(XRegistryWellKnown.XRegistryNamespaceUri); + + /// + /// Links the / + /// Properties of every Method in + /// the subtree from their materialized child nodes. The generated + /// instance factories add the argument nodes as plain children without + /// setting these Properties, which the server's Call argument validation + /// requires. + /// + internal static void LinkMethodArguments(NodeState? node, ISystemContext context) + { + if (node is null) + { + return; + } + if (node is MethodState method) + { + var arguments = new List(); + method.GetChildren(context, arguments); + foreach (BaseInstanceState child in arguments) + { + if (child is not PropertyState> args) + { + continue; + } + if (method.InputArguments is null && + string.Equals(args.BrowseName.Name, Ua.BrowseNames.InputArguments, + StringComparison.Ordinal)) + { + method.InputArguments = args; + } + else if (method.OutputArguments is null && + string.Equals(args.BrowseName.Name, Ua.BrowseNames.OutputArguments, + StringComparison.Ordinal)) + { + method.OutputArguments = args; + } + } + } + var children = new List(); + node.GetChildren(context, children); + foreach (BaseInstanceState child in children) + { + LinkMethodArguments(child, context); + } + } + + private static void SetValue(PropertyState? property, T value) + { + property?.Value = value; + } + + private static string? GetString(ArrayOf input, int index) + { + return index < input.Count && input[index].AsBoxedObject(Variant.BoxingBehavior.Legacy) is string s + ? s : null; + } + + private static bool GetBool(ArrayOf input, int index, bool fallback) + { + return GetBoolOrNull(input, index) ?? fallback; + } + + private static bool? GetBoolOrNull(ArrayOf input, int index) + { + return index < input.Count && input[index].AsBoxedObject(Variant.BoxingBehavior.Legacy) is bool b + ? b : null; + } + + private static long? OptionalEpoch(ArrayOf input, int index) + { + if (index >= input.Count) + { + return null; + } + return input[index].AsBoxedObject(Variant.BoxingBehavior.Legacy) switch + { + uint u => u == 0 ? null : u, + int i => i == 0 ? null : i, + long l => l == 0 ? null : l, + _ => null + }; + } + + private static ServiceResult ToServiceResult(WotRegistryMutationResult result) + { + return result.Outcome switch + { + WoTOutcomeEnum.Success or WoTOutcomeEnum.Warning or WoTOutcomeEnum.Unchanged + => ServiceResult.Good, + WoTOutcomeEnum.Rejected + => ServiceResult.Create(StatusCodes.BadInvalidState, result.Message), + _ => ServiceResult.Create(StatusCodes.BadNodeIdUnknown, result.Message) + }; + } + + private sealed class GroupEntry + { + public GroupEntry(GroupState node, WoTDocumentKindEnum kind) + { + Node = node; + Kind = kind; + } + + public GroupState Node { get; } + public WoTDocumentKindEnum Kind { get; } + + public Dictionary Resources { get; } + = new(StringComparer.Ordinal); + } + + private sealed class ResourceEntry + { + public ResourceEntry( + WoTDocumentState node, WotResourceFileManager? file, + string groupId, string resourceId, WoTDocumentKindEnum kind) + { + Node = node; + File = file; + GroupId = groupId; + ResourceId = resourceId; + Kind = kind; + } + + public WoTDocumentState Node { get; } + public WotResourceFileManager? File { get; } + public string GroupId { get; } + public string ResourceId { get; } + public WoTDocumentKindEnum Kind { get; } + } + + private readonly WotRegistryNodeManager m_manager; + private readonly IWotRegistryService m_registry; + private readonly WotRegistryServerOptions m_options; + private readonly ushort m_modelNs; + private readonly SemaphoreSlim m_gate = new(1, 1); + private readonly Dictionary m_groups = new(StringComparer.Ordinal); + + private readonly System.Collections.Concurrent.ConcurrentDictionary + m_resourcesByXid = new(StringComparer.Ordinal); + + private BaseObjectState? m_registryNode; + private bool m_disposed; + } +} diff --git a/src/Opc.Ua.WotCon.Server/WotRegistryServerOptions.cs b/src/Opc.Ua.WotCon.Server/WotRegistryServerOptions.cs new file mode 100644 index 0000000000..b775a3d955 --- /dev/null +++ b/src/Opc.Ua.WotCon.Server/WotRegistryServerOptions.cs @@ -0,0 +1,112 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry.Server; + +namespace Opc.Ua.WotCon.Server +{ + /// + /// Options for the WoT Connectivity 1.1 registry NodeManager. These are + /// bindable from configuration (only the simple-typed members) and augmented + /// at runtime with the persistence store, binder registry and management + /// access policy. + /// + public sealed class WotRegistryServerOptions + { + /// + /// Gets or sets the folder used by the file-backed registry store. When + /// null the registry is kept in memory only. + /// + public string? StorageFolder { get; set; } + + /// + /// Gets or sets the store that holds the document bytes. When null the documents + /// live wherever the registry store puts them — in the server process for an in-memory + /// registry, or in the registry folder for a file-backed one. + /// + /// Substituting a store is what lets a registry run in a high-availability or distributed + /// deployment, because the documents then live somewhere every node can reach. The store is + /// keyed by the SHA-256 content digest of the document, so writes are idempotent and two + /// resource versions with identical bytes share one entry. A supplied store owns the + /// durability of the bytes it holds; the registry still writes and switches its own + /// manifest atomically, which is safe because content-addressed documents are immutable and + /// are always written before the manifest that references them. + /// + /// + public IXRegistryResourceStore? ResourceStore { get; set; } + + /// + /// Gets or sets whether the registry automatically re-projects after every + /// content mutation. Defaults to true. + /// + public bool AutoRefresh { get; set; } = true; + + /// + /// Gets or sets whether unsupported binding forms fail a strict closure + /// (rather than materializing degraded nodes). + /// + public bool StrictBindings { get; set; } + + /// + /// Gets or sets how a superseded projection generation is retired after + /// a successful version switch. + /// + public WotProjectionRetirementPolicy RetirementPolicy { get; set; } = + WotProjectionRetirementPolicy.Graceful; + + /// + /// Gets or sets the id of the group into which legacy 1.02 assets are + /// registered as Thing Description resources. + /// + public string LegacyGroupId { get; set; } = WotRegistryGroups.ThingDescriptions; + + /// + /// Gets the resource bounds enforced by the registry service. + /// + public WotRegistryPersistenceBounds Bounds { get; } = new WotRegistryPersistenceBounds(); + + /// + /// Gets or sets the management access policy used to secure the registry + /// management Methods. + /// + public WotManagementAccessPolicy ManagementAccess { get; set; } + = new WotManagementAccessPolicy(); + + /// + /// Gets the WoT binding capabilities advertised by the registry + /// SupportedBindings object. Empty in this phase (no concrete + /// protocol binders are registered). + /// + public IList SupportedBindings { get; } + = []; + } +} diff --git a/src/Opc.Ua.WotCon/Design/Opc.Ua.WotCon.NodeSet2.csv b/src/Opc.Ua.WotCon/Design/Opc.Ua.WotCon.NodeSet2.csv new file mode 100644 index 0000000000..81a748ed61 --- /dev/null +++ b/src/Opc.Ua.WotCon/Design/Opc.Ua.WotCon.NodeSet2.csv @@ -0,0 +1,307 @@ +WoTAssetConnectionManagementType,1,ObjectType +WoTAssetConnectionManagementType_WoTAssetName_Placeholder,2,Object +WotConNamespaceMetadata_NamespaceFile,3,Object +WotConNamespaceMetadata_NamespaceFile_Size,4,Variable +WotConNamespaceMetadata_NamespaceFile_Writable,5,Variable +WotConNamespaceMetadata_NamespaceFile_UserWritable,6,Variable +WotConNamespaceMetadata_NamespaceFile_OpenCount,7,Variable +WotConNamespaceMetadata_NamespaceFile_MimeType,8,Variable +WotConNamespaceMetadata_NamespaceFile_MaxByteStringLength,9,Variable +WotConNamespaceMetadata_NamespaceFile_LastModifiedTime,10,Variable +WotConNamespaceMetadata_NamespaceFile_Open,11,Method +WotConNamespaceMetadata_NamespaceFile_Open_InputArguments,12,Variable +WotConNamespaceMetadata_NamespaceFile_Open_OutputArguments,13,Variable +WotConNamespaceMetadata_NamespaceFile_Close,14,Method +WotConNamespaceMetadata_NamespaceFile_Close_InputArguments,15,Variable +WotConNamespaceMetadata_NamespaceFile_Read,16,Method +WotConNamespaceMetadata_NamespaceFile_Read_InputArguments,17,Variable +WotConNamespaceMetadata_NamespaceFile_Read_OutputArguments,18,Variable +WotConNamespaceMetadata_NamespaceFile_Write,19,Method +WotConNamespaceMetadata_NamespaceFile_Write_InputArguments,20,Variable +WotConNamespaceMetadata_NamespaceFile_GetPosition,21,Method +WotConNamespaceMetadata_NamespaceFile_GetPosition_InputArguments,22,Variable +WotConNamespaceMetadata_NamespaceFile_GetPosition_OutputArguments,23,Variable +WotConNamespaceMetadata_NamespaceFile_SetPosition,24,Method +WotConNamespaceMetadata_NamespaceFile_SetPosition_InputArguments,25,Variable +WoTAssetConnectionManagementType_CreateAsset,26,Method +WoTAssetConnectionManagementType_CreateAsset_InputArguments,27,Variable +WoTAssetConnectionManagementType_CreateAsset_OutputArguments,28,Variable +WoTAssetConnectionManagementType_DeleteAsset,29,Method +WoTAssetConnectionManagementType_DeleteAsset_InputArguments,30,Variable +WoTAssetConnectionManagement,31,Object +WoTAssetConnectionManagement_CreateAsset,32,Method +WoTAssetConnectionManagement_CreateAsset_InputArguments,33,Variable +WoTAssetConnectionManagement_CreateAsset_OutputArguments,34,Variable +WoTAssetConnectionManagement_DeleteAsset,35,Method +WoTAssetConnectionManagement_DeleteAsset_InputArguments,36,Variable +WotConNamespaceMetadata_NamespaceFile_ExportNamespace,37,Method +WotConNamespaceMetadata_ConfigurationVersion,38,Variable +WotConNamespaceMetadata_ModelVersion,39,Variable +WoTAssetConnectionManagementType_SupportedWoTBindings,40,Variable +WoTAssetConnectionManagementType_DiscoverAssets,41,Method +IWoTAssetType,42,ObjectType +IWoTAssetType_WoTFile,43,Object +IWoTAssetType_WoTFile_Size,44,Variable +IWoTAssetType_WoTFile_Writable,45,Variable +IWoTAssetType_WoTFile_UserWritable,46,Variable +IWoTAssetType_WoTFile_OpenCount,47,Variable +WoTAssetConnectionManagementType_DiscoverAssets_OutputArguments,48,Variable +WoTAssetConnectionManagementType_CreateAssetForEndpoint,49,Method +WoTAssetConnectionManagementType_CreateAssetForEndpoint_InputArguments,50,Variable +IWoTAssetType_WoTFile_Open,51,Method +IWoTAssetType_WoTFile_Open_InputArguments,52,Variable +IWoTAssetType_WoTFile_Open_OutputArguments,53,Variable +IWoTAssetType_WoTFile_Close,54,Method +IWoTAssetType_WoTFile_Close_InputArguments,55,Variable +IWoTAssetType_WoTFile_Read,56,Method +IWoTAssetType_WoTFile_Read_InputArguments,57,Variable +IWoTAssetType_WoTFile_Read_OutputArguments,58,Variable +IWoTAssetType_WoTFile_Write,59,Method +IWoTAssetType_WoTFile_Write_InputArguments,60,Variable +IWoTAssetType_WoTFile_GetPosition,61,Method +IWoTAssetType_WoTFile_GetPosition_InputArguments,62,Variable +IWoTAssetType_WoTFile_GetPosition_OutputArguments,63,Variable +IWoTAssetType_WoTFile_SetPosition,64,Method +IWoTAssetType_WoTFile_SetPosition_InputArguments,65,Variable +IWoTAssetType_WoTPropertyName_Placeholder,66,Variable +WotConNamespaceMetadata,67,Object +WotConNamespaceMetadata_NamespaceUri,68,Variable +WotConNamespaceMetadata_NamespaceVersion,69,Variable +WotConNamespaceMetadata_NamespacePublicationDate,70,Variable +WotConNamespaceMetadata_IsNamespaceSubset,71,Variable +WotConNamespaceMetadata_StaticNodeIdTypes,72,Variable +WotConNamespaceMetadata_StaticNumericNodeIdRange,73,Variable +WotConNamespaceMetadata_StaticStringNodeIdPattern,74,Variable +WoTAssetConnectionManagementType_ConnectionTest,75,Method +WoTAssetConnectionManagementType_ConnectionTest_InputArguments,76,Variable +WoTAssetConnectionManagementType_ConnectionTest_OutputArguments,77,Variable +WoTAssetConnectionManagementType_Configuration,78,Object +WoTAssetConnectionManagementType_Configuration_License,79,Variable +WoTAssetConnectionManagement_SupportedWoTBindings,80,Variable +WoTAssetConnectionManagement_DiscoverAssets,81,Method +WoTAssetConnectionManagement_DiscoverAssets_OutputArguments,82,Variable +WoTAssetConnectionManagement_CreateAssetForEndpoint,83,Method +WoTAssetConnectionManagement_CreateAssetForEndpoint_InputArguments,84,Variable +WoTAssetConnectionManagement_ConnectionTest,85,Method +WoTAssetConnectionManagement_ConnectionTest_InputArguments,86,Variable +WoTAssetConnectionManagement_ConnectionTest_OutputArguments,87,Variable +WoTAssetConnectionManagement_Configuration,88,Object +WoTAssetConnectionManagement_Configuration_License,89,Variable +CreateAssetMethodType,90,Method +CreateAssetMethodType_InputArguments,91,Variable +CreateAssetMethodType_OutputArguments,92,Variable +DeleteAssetMethodType,93,Method +DeleteAssetMethodType_InputArguments,94,Variable +DiscoverAssetsMethodType,95,Method +DiscoverAssetsMethodType_OutputArguments,96,Variable +CreateAssetForEndpointMethodType,97,Method +CreateAssetForEndpointMethodType_InputArguments,98,Variable +WotConNamespaceMetadata_DefaultRolePermissions,99,Variable +WotConNamespaceMetadata_DefaultUserRolePermissions,100,Variable +WotConNamespaceMetadata_DefaultAccessRestrictions,101,Variable +ConnectionTestMethodType,102,Method +ConnectionTestMethodType_InputArguments,103,Variable +ConnectionTestMethodType_OutputArguments,104,Variable +WoTAssetConfigurationType,105,ObjectType +IWoTAssetType_WoTFile_CloseAndUpdate,106,Method +IWoTAssetType_WoTFile_CloseAndUpdate_InputArguments,107,Variable +WoTAssetConfigurationType_WoTConfigurationParameterName_Placeholder,108,Variable +WoTAssetConfigurationType_License,109,Variable +WoTAssetFileType,110,ObjectType +WoTAssetFileType_CloseAndUpdate,111,Method +WoTAssetFileType_CloseAndUpdate_InputArguments,112,Variable +IWoTAssetType_WoTFile_MimeType,113,Variable +IWoTAssetType_WoTFile_MaxByteStringLength,114,Variable +WoTAssetType,115,Unspecified +WoTAssetType_WoTFile,116,Unspecified +WoTAssetType_WoTFile_Size,117,Unspecified +WoTAssetType_WoTFile_Writable,118,Unspecified +WoTAssetType_WoTFile_UserWritable,119,Unspecified +WoTAssetType_WoTFile_OpenCount,120,Unspecified +IWoTAssetType_WoTFile_LastModifiedTime,121,Variable +IWoTAssetType_AssetEndpoint,122,Variable +CloseAndUpdateMethodType,123,Method +WoTAssetType_WoTFile_Open,124,Unspecified +WoTAssetType_WoTFile_Open_InputArguments,125,Unspecified +WoTAssetType_WoTFile_Open_OutputArguments,126,Unspecified +WoTAssetType_WoTFile_Close,127,Unspecified +WoTAssetType_WoTFile_Close_InputArguments,128,Unspecified +WoTAssetType_WoTFile_Read,129,Unspecified +WoTAssetType_WoTFile_Read_InputArguments,130,Unspecified +WoTAssetType_WoTFile_Read_OutputArguments,131,Unspecified +WoTAssetType_WoTFile_Write,132,Unspecified +WoTAssetType_WoTFile_Write_InputArguments,133,Unspecified +WoTAssetType_WoTFile_GetPosition,134,Unspecified +WoTAssetType_WoTFile_GetPosition_InputArguments,135,Unspecified +WoTAssetType_WoTFile_GetPosition_OutputArguments,136,Unspecified +WoTAssetType_WoTFile_SetPosition,137,Unspecified +WoTAssetType_WoTFile_SetPosition_InputArguments,138,Unspecified +WoTAssetType_WoTFile_CloseAndUpdate,139,Unspecified +WoTAssetType_WoTFile_CloseAndUpdate_InputArguments,140,Unspecified +WoTAssetType_WoTPropertyName_Placeholder,141,Unspecified +HasWoTComponent,142,ReferenceType +CloseAndUpdateMethodType_InputArguments,143,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile,144,Object +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Size,145,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Writable,146,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_UserWritable,147,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_OpenCount,148,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_MimeType,149,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_MaxByteStringLength,150,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_LastModifiedTime,151,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Open,152,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Open_InputArguments,153,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Open_OutputArguments,154,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Close,155,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Close_InputArguments,156,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Read,157,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Read_InputArguments,158,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Read_OutputArguments,159,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Write,160,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_Write_InputArguments,161,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_GetPosition,162,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_GetPosition_InputArguments,163,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_GetPosition_OutputArguments,164,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_SetPosition,165,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_SetPosition_InputArguments,166,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_CloseAndUpdate,167,Method +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_WoTFile_CloseAndUpdate_InputArguments,168,Variable +WoTAssetConnectionManagementType_WoTAssetName_Placeholder_AssetEndpoint,169,Variable +WoTAssetConnectionManagementType_CreateAssetForEndpoint_OutputArguments,170,Variable +WoTAssetConnectionManagement_CreateAssetForEndpoint_OutputArguments,171,Variable +CreateAssetForEndpointMethodType_OutputArguments,172,Variable +WoTDocumentKindEnum,64020,DataType +WoTDocumentKindEnum_EnumStrings,64500,Variable +WoTLoadStateEnum,64021,DataType +WoTLoadStateEnum_EnumStrings,64501,Variable +WoTRefreshModeEnum,64022,DataType +WoTRefreshModeEnum_EnumStrings,64502,Variable +WoTAtomicityEnum,64023,DataType +WoTAtomicityEnum_EnumStrings,64503,Variable +WoTDeletePolicyEnum,64024,DataType +WoTDeletePolicyEnum_EnumStrings,64504,Variable +WoTOutcomeEnum,64025,DataType +WoTOutcomeEnum_EnumStrings,64505,Variable +WoTPhaseEnum,64026,DataType +WoTPhaseEnum_EnumStrings,64506,Variable +WoTBindingCapabilityEnum,64027,DataType +WoTBindingCapabilityEnum_EnumStrings,64507,Variable +WoTValidationOutcomeDataType,64040,DataType +WoTValidationOutcomeDataType_DefaultBinary,64508,Object +WoTValidationOutcomeDataType_DefaultJSON,64509,Object +WoTBindingCapabilityDataType,64041,DataType +WoTBindingCapabilityDataType_DefaultBinary,64510,Object +WoTBindingCapabilityDataType_DefaultJSON,64511,Object +WoTRefreshOptionsDataType,64042,DataType +WoTRefreshOptionsDataType_DefaultBinary,64512,Object +WoTRefreshOptionsDataType_DefaultJSON,64513,Object +WoTResourceSelectorDataType,64043,DataType +WoTResourceSelectorDataType_DefaultBinary,64514,Object +WoTResourceSelectorDataType_DefaultJSON,64515,Object +WoTResourceLoadResultDataType,64044,DataType +WoTResourceLoadResultDataType_DefaultBinary,64516,Object +WoTResourceLoadResultDataType_DefaultJSON,64517,Object +WoTRefreshSummaryDataType,64045,DataType +WoTRefreshSummaryDataType_DefaultBinary,64518,Object +WoTRefreshSummaryDataType_DefaultJSON,64519,Object +WoTDependencyDataType,64046,DataType +WoTDependencyDataType_DefaultBinary,64520,Object +WoTDependencyDataType_DefaultJSON,64521,Object +WoTRegistryType,64000,ObjectType +ThingDescriptionGroupType,64001,ObjectType +ThingModelGroupType,64002,ObjectType +WoTDocumentType,64003,ObjectType +ThingDescriptionFileType,64004,ObjectType +ThingModelFileType,64005,ObjectType +WoTBindingType,64006,ObjectType +WoTResourceEventType,64010,ObjectType +WoTValidationFailureEventType,64011,ObjectType +WoTLoadFailureEventType,64012,ObjectType +WoTBindingFailureEventType,64013,ObjectType +WoTRefreshCompletedEventType,64014,ObjectType +HasWoTProjection,64060,ReferenceType +WoTRegistryType_AutoRefresh,64522,Variable +WoTRegistryType_RefreshMode,64523,Variable +WoTRegistryType_RefreshInterval,64524,Variable +WoTRegistryType_RefreshGeneration,64525,Variable +WoTRegistryType_LastRefreshTime,64526,Variable +WoTRegistryType_LastRefreshSummary,64527,Variable +WoTRegistryType_DefaultAtomicity,64528,Variable +WoTRegistryType_DeletePolicy,64529,Variable +WoTRegistryType_ValidateFormat,64530,Variable +WoTRegistryType_ValidateCompatibility,64531,Variable +WoTRegistryType_StrictValidation,64532,Variable +WoTRegistryType_VocabularyVersion,64533,Variable +WoTRegistryType_SelectedBindings,64534,Variable +WoTRegistryType_SupportedBindings,64535,Object +WoTRegistryType_ThingDescriptionGroup,64536,Object +WoTRegistryType_ThingModelGroup,64537,Object +WoTRegistryType_Refresh,64538,Method +WoTRegistryType_Refresh_InputArguments,64539,Variable +WoTRegistryType_Refresh_OutputArguments,64540,Variable +ThingDescriptionGroupType_ValidateFormat,64541,Variable +ThingDescriptionGroupType_ValidateCompatibility,64542,Variable +ThingDescriptionGroupType_ConsistentFormat,64543,Variable +ThingDescriptionGroupType_ThingDescription,64544,Object +ThingModelGroupType_ValidateFormat,64545,Variable +ThingModelGroupType_ValidateCompatibility,64546,Variable +ThingModelGroupType_ConsistentFormat,64547,Variable +ThingModelGroupType_ThingModel,64548,Object +WoTDocumentType_DocumentKind,64549,Variable +WoTDocumentType_Enabled,64550,Variable +WoTDocumentType_LoadState,64551,Variable +WoTDocumentType_DesiredVersionId,64552,Variable +WoTDocumentType_ActiveVersionId,64553,Variable +WoTDocumentType_IsDefault,64554,Variable +WoTDocumentType_Ancestor,64555,Variable +WoTDocumentType_Compatibility,64556,Variable +WoTDocumentType_AutoRefresh,64557,Variable +WoTDocumentType_RefreshGeneration,64558,Variable +WoTDocumentType_LastRefreshTime,64559,Variable +WoTDocumentType_ContentDigest,64560,Variable +WoTDocumentType_ValidationOutcome,64561,Variable +WoTDocumentType_MaterializedNodeCount,64562,Variable +WoTDocumentType_RootNodeId,64563,Variable +WoTDocumentType_SelectedBindings,64564,Variable +WoTDocumentType_Validate,64565,Method +WoTDocumentType_Validate_OutputArguments,64566,Variable +WoTDocumentType_SetEnabled,64567,Method +WoTDocumentType_SetEnabled_InputArguments,64568,Variable +WoTDocumentType_SetDefaultVersion,64569,Method +WoTDocumentType_SetDefaultVersion_InputArguments,64570,Variable +ThingDescriptionFileType_ThingId,64571,Variable +ThingDescriptionFileType_ThingTitle,64572,Variable +ThingDescriptionFileType_BaseUri,64573,Variable +ThingDescriptionFileType_ModelReference,64574,Variable +ThingModelFileType_ModelTitle,64575,Variable +ThingModelFileType_ModelVersion,64576,Variable +ThingModelFileType_DerivedTypeNodeId,64577,Variable +WoTBindingType_BindingUri,64578,Variable +WoTBindingType_Title,64579,Variable +WoTBindingType_ProfileVersion,64580,Variable +WoTBindingType_DraftMaturity,64581,Variable +WoTBindingType_Enabled,64582,Variable +WoTBindingType_ContentTypes,64583,Variable +WoTBindingType_Capabilities,64584,Variable +WoTResourceEventType_Xid,64585,Variable +WoTResourceEventType_ResourceId,64586,Variable +WoTResourceEventType_VersionId,64587,Variable +WoTResourceEventType_DocumentKind,64588,Variable +WoTResourceEventType_Generation,64589,Variable +WoTResourceEventType_Phase,64590,Variable +WoTResourceEventType_Outcome,64591,Variable +WoTValidationFailureEventType_ValidationOutcome,64592,Variable +WoTLoadFailureEventType_LoadState,64593,Variable +WoTLoadFailureEventType_FailedNodeId,64594,Variable +WoTLoadFailureEventType_Reason,64595,Variable +WoTBindingFailureEventType_BindingUri,64596,Variable +WoTBindingFailureEventType_Reason,64597,Variable +WoTRefreshCompletedEventType_Summary,64598,Variable +WoTRefreshCompletedEventType_RequestId,64599,Variable +WoTRefreshCompletedEventType_Generation,64600,Variable +WoTRegistry,64100,Object +WoTRegistry_Refresh,64601,Method +WoTRegistry_Refresh_InputArguments,64602,Variable +WoTRegistry_Refresh_OutputArguments,64603,Variable +WoTRegistry_RegistryId,64604,Variable +WoTRegistry_RefreshGeneration,64605,Variable diff --git a/src/Opc.Ua.WotCon/Design/Opc.Ua.WotCon.NodeSet2.xml b/src/Opc.Ua.WotCon/Design/Opc.Ua.WotCon.NodeSet2.xml new file mode 100644 index 0000000000..f2552d5bd0 --- /dev/null +++ b/src/Opc.Ua.WotCon/Design/Opc.Ua.WotCon.NodeSet2.xml @@ -0,0 +1,2746 @@ + + + + + http://opcfoundation.org/UA/xRegistry/ + http://opcfoundation.org/UA/WoT-Con/ + + + + + + + + + i=1 + i=3 + i=5 + i=6 + i=7 + i=9 + i=11 + i=12 + i=13 + i=294 + i=15 + i=17 + i=18 + i=21 + i=290 + i=296 + i=22 + i=29 + i=23751 + i=24 + i=35 + i=37 + i=40 + i=45 + i=46 + i=47 + i=38 + i=17603 + i=41 + i=48 + i=32 + + + WoTDocumentKindEnum + The kind of WoT document a resource carries: a Thing Description (a concrete instance) or a Thing Model (a reusable type template). + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64500 + + A W3C WoT Thing Description (WoT-TD/1.1); projects to OPC UA instances.A W3C WoT Thing Model (WoT-TM/1.1); projects to OPC UA types. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64020 + + ThingDescriptionThingModel + + + WoTLoadStateEnum + The lifecycle state of a WoT document's derived projection in the AddressSpace. The registry file always remains stored; this enum reflects only the state of the code-behind projection. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64501 + + Stored but not projected into the AddressSpace.Format and compatibility validation is in progress.The projection is being materialized under a shadow generation.The projection is committed and serving as the active generation.Validation or projection failed; the last valid projection (if any) stays active.A newer generation has replaced this one; awaiting the configured retirement policy.Graceful retirement is waiting for monitored items and requests to drain.The projection has been removed from the AddressSpace. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64021 + + UnloadedValidatingLoadingActiveFailedSupersededRetiringRetired + + + WoTRefreshModeEnum + How a registry or document triggers refresh of its derived projection. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64502 + + Only an explicit Refresh Method call re-projects.The registry re-projects on a fixed interval (RefreshInterval).The registry re-projects when a stored document changes (write/CloseAndUpdate).The registry re-projects on an implementation-defined schedule. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64022 + + ManualPeriodicEventDrivenScheduled + + + WoTAtomicityEnum + The commit granularity applied when a refresh projects one or more documents. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64503 + + Each resource commits independently; a failure isolates to that resource.All resources of a group commit together or not at all.A document and its full dependency closure (DAG) commit atomically.All selected documents commit as a single all-or-nothing transaction. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64023 + + PerResourcePerGroupPerClosurePerRegistry + + + WoTDeletePolicyEnum + How the registry treats dependents when a document version is unloaded or deleted. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64504 + + Reject the operation while any other loaded document still depends on it.Retire the projection but keep the stored document for dependents to resolve.Unload dependents that resolve only through this document.Force-unload the projection even while dependents remain, marking them Failed. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64024 + + RejectRetireCascadeForce + + + WoTOutcomeEnum + The outcome of a validation, projection or refresh operation on a document or the registry. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64505 + + The operation completed and changed the projection.The operation was idempotent; the content digest matched and nothing changed.The operation completed with non-fatal warnings.The operation was not applicable and was skipped.The operation was rejected by policy (for example concurrency or delete policy).The operation failed; the previous valid projection (if any) remains active. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64025 + + SuccessUnchangedWarningSkippedRejectedFailed + + + WoTPhaseEnum + The processing phase a document reached, used to locate where an outcome was produced. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64506 + + Reading document bytes and resolving registry-scoped context/schema references.Parsing the JSON-LD document.Validating the document against its WoT-TD/WoT-TM format.Validating the version against the resource compatibility policy.Resolving the dependency closure (tm:extends, tm:ref, links rel=type).Materializing types/instances into a shadow generation.Committing the shadow generation as active.Applying the configured graceful or immediate retirement policy. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64026 + + FetchParseFormatValidationCompatibilityValidationDependencyResolutionProjectionActivationRetirement + + + WoTBindingCapabilityEnum + A single interaction operation a protocol binding supports, aligned with the WoT form op vocabulary. + WoT Connectivity 1.1 DataTypes + + i=29 + ns=2;i=64507 + + Read a property affordance.Write a property affordance.Observe (subscribe to) a property affordance.Invoke an action affordance.Subscribe to an event affordance.Unsubscribe from an event affordance. + + + EnumStrings + + i=78 + i=68 + ns=2;i=64027 + + ReadPropertyWritePropertyObservePropertyInvokeActionSubscribeEventUnsubscribeEvent + + + WoTValidationOutcomeDataType + An immutable snapshot of a document's format and compatibility validation result. Read as a single Variant value; a new snapshot is produced on each validation and never mutated in place. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64508 + ns=2;i=64509 + + True if format validation was performed.Outcome of format validation (WoT-TD/WoT-TM conformance).Human-readable reason for the format outcome (empty on success).True if compatibility validation was performed.Outcome of compatibility validation against the resource policy.Human-readable reason for the compatibility outcome (empty on success).The compatibility policy in force (for example NONE, BACKWARD, FULL).UTC time the validation completed.The pinned WoT Binding JSON-LD vocabulary version used for validation. + + + Default Binary + + i=76 + ns=2;i=64040 + + + + Default JSON + + i=76 + ns=2;i=64040 + + + + WoTBindingCapabilityDataType + An immutable snapshot of a protocol binding's identity, version-pinned W3C document, maturity and supported operations. Held as an array element only for immutable snapshots; browseable binding objects (WoTBindingType) carry the live, per-field form. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64510 + ns=2;i=64511 + + The WoT protocol-binding vocabulary URI (for example the OPC UA, HTTP or Modbus binding).Human-readable binding title.The version-pinned W3C binding document version this capability snapshot was built against.The W3C maturity of the pinned binding document (for example WD, CR, PR, REC).The interaction operations this binding supports.The content types this binding produces/consumes. + + + Default Binary + + i=76 + ns=2;i=64041 + + + + Default JSON + + i=76 + ns=2;i=64041 + + + + WoTRefreshOptionsDataType + Immutable options controlling a single Refresh invocation. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64512 + ns=2;i=64513 + + Commit granularity for this refresh.Re-project even when the content digest is unchanged.Validate and compute results without committing any projection change.Also refresh documents that depend on the selected documents.How to treat dependents when a selected document is unloaded/retired.Maximum number of documents projected concurrently; 0 lets the server decide.Overall time budget for the refresh; 0 lets the server decide. + + + Default Binary + + i=76 + ns=2;i=64042 + + + + Default JSON + + i=76 + ns=2;i=64042 + + + + WoTResourceSelectorDataType + An immutable selector identifying which stored documents a Refresh applies to. An empty selector array selects the whole registry. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64514 + ns=2;i=64515 + + Restrict to Thing Descriptions or Thing Models; omit to select both.Restrict to a group by groupid; empty selects all groups.Restrict to a resource by resourceid; empty selects all resources.Restrict to a version by versionid; empty selects the resource's default version.Select a single entity by its xRegistry xid; overrides the other fields when set. + + + Default Binary + + i=76 + ns=2;i=64043 + + + + Default JSON + + i=76 + ns=2;i=64043 + + + + WoTResourceLoadResultDataType + An immutable per-resource result row of a Refresh. Never mutated; the array is a point-in-time snapshot for one generation. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64516 + ns=2;i=64517 + + The xRegistry xid of the affected resource/version.The groupid of the resource's group.The resourceid of the affected resource.The versionid that was projected.Whether the document is a Thing Description or a Thing Model.The per-resource outcome.The phase the resource reached (the failing phase on failure).The resulting load state of the projection.The refresh generation this result belongs to.Number of AddressSpace nodes materialized for this resource.The root node of the materialized projection, if any.The content digest (hash) of the projected document bytes.Human-readable detail for the outcome. + + + Default Binary + + i=76 + ns=2;i=64044 + + + + Default JSON + + i=76 + ns=2;i=64044 + + + + WoTRefreshSummaryDataType + An immutable summary of one Refresh invocation, also carried by the WoTRefreshCompletedEventType and cached on the registry as LastRefreshSummary. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64518 + ns=2;i=64519 + + The caller-supplied request identifier echoed back for correlation.The committed refresh generation (0 on a dry run or full failure).The overall outcome of the refresh.The commit granularity that was applied.UTC start time of the refresh.UTC end time of the refresh.Total number of resources considered.Number of resources that changed successfully.Number of resources that were idempotently unchanged.Number of resources that failed.Number of resources skipped by selection or policy.Number of superseded generations retired. + + + Default Binary + + i=76 + ns=2;i=64045 + + + + Default JSON + + i=76 + ns=2;i=64045 + + + + WoTDependencyDataType + An immutable edge of the document dependency DAG, used to describe closures in results and diagnostics. + WoT Connectivity 1.1 DataTypes + + i=22 + ns=2;i=64520 + ns=2;i=64521 + + The xid of the dependent document.The xid of the document depended upon (empty if unresolved).The raw href/URI of the dependency as authored in the document.The dependency kind (for example tm:extends, tm:ref, links.rel=type).True if the dependency resolved to a stored document. + + + Default Binary + + i=76 + ns=2;i=64046 + + + + Default JSON + + i=76 + ns=2;i=64046 + + + + WoTRegistryType + The WoT Connectivity 1.1 registry root - an xRegistry RegistryType (a FolderType) that holds ThingDescriptionGroupType and ThingModelGroupType groups. The stored Thing Description / Thing Model files and their versions are canonical; the projected AddressSpace (types from Thing Models, instances from Thing Descriptions) is derived code-behind. Exposed as a well-known WoTRegistry object under the Server object (i=2253). Adds registry-wide refresh, generation and validation-policy state and the Refresh Method. + WoT Connectivity 1.1 + + ns=1;i=63000 + ns=2;i=64522 + ns=2;i=64523 + ns=2;i=64524 + ns=2;i=64525 + ns=2;i=64526 + ns=2;i=64527 + ns=2;i=64528 + ns=2;i=64529 + ns=2;i=64530 + ns=2;i=64531 + ns=2;i=64532 + ns=2;i=64533 + ns=2;i=64534 + ns=2;i=64535 + ns=2;i=64536 + ns=2;i=64537 + ns=2;i=64538 + ns=2;i=64014 + + + + ThingDescriptionGroupType + An xRegistry GroupType that collects related ThingDescriptionFileType resources (a Thing Description Group per the WoT xRegistry model). Adds the group-level format/compatibility validation policy. Its <ThingDescription> placeholder constrains members to the Thing Description subtype. + WoT Connectivity 1.1 + + ns=1;i=63001 + ns=2;i=64541 + ns=2;i=64542 + ns=2;i=64543 + ns=2;i=64544 + + + + ThingModelGroupType + An xRegistry GroupType that collects related ThingModelFileType resources (a Thing Model Group per the WoT xRegistry model). Adds the group-level format/compatibility validation policy. Its <ThingModel> placeholder constrains members to the Thing Model subtype. + WoT Connectivity 1.1 + + ns=1;i=63001 + ns=2;i=64545 + ns=2;i=64546 + ns=2;i=64547 + ns=2;i=64548 + + + + WoTDocumentType + The abstract base of a stored WoT document resource - an xRegistry ResourceType (a FileType) whose content bytes are the JSON-LD document, read/written with the inherited Open/Read/Write/Close Methods. Adds the derived-projection metadata (load state, desired/active version, validation and compatibility outcomes, content digest, materialized-node count and root, selected bindings) and the Validate, SetEnabled and SetDefaultVersion Methods. Concrete subtypes fix the document kind. + WoT Connectivity 1.1 + + ns=1;i=63002 + ns=2;i=64549 + ns=2;i=64550 + ns=2;i=64551 + ns=2;i=64552 + ns=2;i=64553 + ns=2;i=64554 + ns=2;i=64555 + ns=2;i=64556 + ns=2;i=64557 + ns=2;i=64558 + ns=2;i=64559 + ns=2;i=64560 + ns=2;i=64561 + ns=2;i=64562 + ns=2;i=64563 + ns=2;i=64564 + ns=2;i=64565 + ns=2;i=64567 + ns=2;i=64569 + ns=2;i=64011 + ns=2;i=64012 + ns=2;i=64013 + + + + ThingDescriptionFileType + A concrete WoTDocumentType whose content is a W3C WoT Thing Description (WoT-TD/1.1, application/td+json). Projects to OPC UA instances: affordances become Variables, Methods and event sources; forms become binder plans. Adds the Thing instance identity (ThingId, base URI) and the link to the Thing Model it derives from. + WoT Connectivity 1.1 + + ns=2;i=64003 + ns=2;i=64571 + ns=2;i=64572 + ns=2;i=64573 + ns=2;i=64574 + + + + ThingModelFileType + A concrete WoTDocumentType whose content is a W3C WoT Thing Model (WoT-TM/1.1, application/tm+json). Projects to OPC UA types: it materializes an ObjectType or VariableType and the affordance member declarations and modelling rules. Adds the derived type NodeId and model version. + WoT Connectivity 1.1 + + ns=2;i=64003 + ns=2;i=64575 + ns=2;i=64576 + ns=2;i=64577 + + + + WoTBindingType + A browseable protocol-binding descriptor: the live, per-field representation of one W3C WoT protocol binding the server can realize (its URI, title, version-pinned W3C document, draft maturity, enabled state, content types and a capability snapshot). Selected/active binding sets are additionally exposed as immutable WoTBindingCapabilityDataType array snapshots. Policy and identity are browseable; no credentials or secrets are ever exposed here. + WoT Connectivity 1.1 + + i=58 + ns=2;i=64578 + ns=2;i=64579 + ns=2;i=64580 + ns=2;i=64581 + ns=2;i=64582 + ns=2;i=64583 + ns=2;i=64584 + + + + WoTResourceEventType + The common base event for a WoT resource lifecycle notification. Carries the identity of the affected resource/version, the document kind, the refresh generation, the phase reached and the outcome. Abstract; servers emit one of its concrete subtypes. + WoT Connectivity 1.1 Events + + i=2041 + ns=2;i=64585 + ns=2;i=64586 + ns=2;i=64587 + ns=2;i=64588 + ns=2;i=64589 + ns=2;i=64590 + ns=2;i=64591 + + + + WoTValidationFailureEventType + Raised when a document fails format or compatibility validation. The failing resource is the event source; the stored document is retained and any previous valid projection stays active. + WoT Connectivity 1.1 Events + + ns=2;i=64010 + ns=2;i=64592 + + + + WoTLoadFailureEventType + Raised when a validated document fails to project (materialize) into the AddressSpace, or when its shadow generation cannot be activated. The failing resource is the event source. + WoT Connectivity 1.1 Events + + ns=2;i=64010 + ns=2;i=64593 + ns=2;i=64594 + ns=2;i=64595 + + + + WoTBindingFailureEventType + Raised when a form cannot be bound to its protocol binding (unknown binding, unsupported operation or a runtime binder error). The failing resource is the event source. + WoT Connectivity 1.1 Events + + ns=2;i=64010 + ns=2;i=64596 + ns=2;i=64597 + + + + WoTRefreshCompletedEventType + Raised by the registry when a Refresh completes (including automatic refreshes). Carries the refresh summary and the committed generation. The registry object is the event source. + WoT Connectivity 1.1 Events + + i=2041 + ns=2;i=64598 + ns=2;i=64599 + ns=2;i=64600 + + + + HasWoTProjection + Links a stored WoT document resource (source) to the root node of its derived AddressSpace projection (target). Used to correlate materialized nodes and their NodeVersion with the canonical document, and to find the document behind a projected node. + WoTProjectionOf + WoT Connectivity 1.1 References + + i=32 + + + + AutoRefresh + True if the registry automatically re-projects stored documents (per RefreshMode); false if only explicit Refresh calls re-project. + + i=80 + i=68 + ns=2;i=64000 + + + + RefreshMode + How automatic refresh is triggered when AutoRefresh is true. + + i=80 + i=68 + ns=2;i=64000 + + + + RefreshInterval + The interval used when RefreshMode is Periodic. + + i=80 + i=68 + ns=2;i=64000 + + + + RefreshGeneration + The current committed projection generation; incremented on every committed refresh. Materialized nodes carry the generation in their NodeVersion for correlation. + + i=78 + i=68 + ns=2;i=64000 + + + + LastRefreshTime + UTC time of the last completed refresh. + + i=80 + i=68 + ns=2;i=64000 + + + + LastRefreshSummary + An immutable snapshot summarizing the last completed refresh. + + i=80 + i=68 + ns=2;i=64000 + + + + DefaultAtomicity + The commit granularity applied when a Refresh omits an explicit atomicity. + + i=80 + i=68 + ns=2;i=64000 + + + + DeletePolicy + The default policy for treating dependents on unload/delete. + + i=80 + i=68 + ns=2;i=64000 + + + + ValidateFormat + Registry-wide default: validate document format on ingest/refresh. + + i=80 + i=68 + ns=2;i=64000 + + + + ValidateCompatibility + Registry-wide default: validate version compatibility on ingest/refresh. + + i=80 + i=68 + ns=2;i=64000 + + + + StrictValidation + If true, a validation warning is treated as a failure. + + i=80 + i=68 + ns=2;i=64000 + + + + VocabularyVersion + The version-pinned WoT Binding JSON-LD vocabulary this registry validates and projects against. + + i=80 + i=68 + ns=2;i=64000 + + + + SelectedBindings + An immutable snapshot array of the protocol bindings currently selected/active registry-wide. + + i=80 + i=68 + ns=2;i=64000 + + + + SupportedBindings + A folder of browseable WoTBindingType binding descriptors the server can realize (the live, per-field form of the selected-bindings snapshot). + + i=80 + i=61 + ns=2;i=64000 + + + + <ThingDescriptionGroup> + A Thing Description Group held by this registry (constrained to the ThingDescriptionGroupType subtype). + + i=11508 + ns=2;i=64001 + ns=2;i=64000 + + + + <ThingModelGroup> + A Thing Model Group held by this registry (constrained to the ThingModelGroupType subtype). + + i=11508 + ns=2;i=64002 + ns=2;i=64000 + + + + Refresh + Re-project selected stored documents into the AddressSpace. Idempotent: a document whose content digest is unchanged is reported Unchanged and not re-materialized unless Options.Force is set. Projects into a shadow generation and switches atomically per Options.Atomicity; superseded generations use the implementation's documented graceful or immediate retirement policy. If ExpectedGeneration is non-zero and does not equal RefreshGeneration, the call fails with Bad_InvalidState and changes nothing (optimistic concurrency). An empty Selection selects the whole registry. + + i=80 + ns=2;i=64000 + ns=2;i=64539 + ns=2;i=64540 + + + + InputArguments + + i=78 + i=68 + ns=2;i=64538 + + i=297Selectionns=2;i=6404310The documents to refresh; empty selects the whole registry.i=297Optionsns=2;i=64042-1Options controlling atomicity, force, dry-run and dependents.i=297ExpectedGenerationi=7-1Expected current RefreshGeneration for optimistic concurrency; 0 disables the check.i=297RequestIdi=12-1Caller-supplied identifier echoed into the summary and the completion event. + + + OutputArguments + + i=78 + i=68 + ns=2;i=64538 + + i=297Summaryns=2;i=64045-1The refresh summary.i=297Resultsns=2;i=6404410The per-resource results.i=297NewGenerationi=7-1The committed generation (unchanged on dry run or full failure). + + + ValidateFormat + Group-level policy: validate Thing Description format (WoT-TD/1.1) on ingest. + + i=80 + i=68 + ns=2;i=64001 + + + + ValidateCompatibility + Group-level policy: validate version compatibility on ingest. + + i=80 + i=68 + ns=2;i=64001 + + + + ConsistentFormat + Group-level policy: require all versions of a resource to share one format. + + i=80 + i=68 + ns=2;i=64001 + + + + <ThingDescription> + A Thing Description resource held by this group (constrained to the ThingDescriptionFileType subtype). + + i=11508 + ns=2;i=64004 + ns=2;i=64001 + + + + ValidateFormat + Group-level policy: validate Thing Model format (WoT-TM/1.1) on ingest. + + i=80 + i=68 + ns=2;i=64002 + + + + ValidateCompatibility + Group-level policy: validate version compatibility on ingest. + + i=80 + i=68 + ns=2;i=64002 + + + + ConsistentFormat + Group-level policy: require all versions of a resource to share one format. + + i=80 + i=68 + ns=2;i=64002 + + + + <ThingModel> + A Thing Model resource held by this group (constrained to the ThingModelFileType subtype). + + i=11508 + ns=2;i=64005 + ns=2;i=64002 + + + + DocumentKind + Whether this document is a Thing Description or a Thing Model. Fixed by the concrete subtype. + + i=78 + i=68 + ns=2;i=64003 + + + + Enabled + The desired enabled state: true requests that the document be validated and projected; false requests unload. + + i=78 + i=68 + ns=2;i=64003 + + + + LoadState + The actual lifecycle state of this document's derived projection. + + i=78 + i=68 + ns=2;i=64003 + + + + DesiredVersionId + The versionid the operator wants active for this resource (the desired/pinned version). + + i=80 + i=68 + ns=2;i=64003 + + + + ActiveVersionId + The versionid whose projection is currently active. + + i=80 + i=68 + ns=2;i=64003 + + + + IsDefault + xRegistry isdefault: true when this version is the resource's default (sticky) version. + + i=80 + i=68 + ns=2;i=64003 + + + + Ancestor + xRegistry ancestor: the versionid this version derives from (version lineage). + + i=80 + i=68 + ns=2;i=64003 + + + + Compatibility + The compatibility policy all versions of this resource adhere to (for example NONE, BACKWARD, FULL). + + i=80 + i=68 + ns=2;i=64003 + + + + AutoRefresh + Per-document override of the registry AutoRefresh setting. + + i=80 + i=68 + ns=2;i=64003 + + + + RefreshGeneration + The registry generation at which this document was last projected. + + i=80 + i=68 + ns=2;i=64003 + + + + LastRefreshTime + UTC time this document was last projected. + + i=80 + i=68 + ns=2;i=64003 + + + + ContentDigest + The content digest (hash) of the stored document bytes; used to make refresh idempotent. + + i=80 + i=68 + ns=2;i=64003 + + + + ValidationOutcome + An immutable snapshot of this document's format and compatibility validation result. + + i=80 + i=68 + ns=2;i=64003 + + + + MaterializedNodeCount + The number of AddressSpace nodes materialized from this document's active projection. + + i=80 + i=68 + ns=2;i=64003 + + + + RootNodeId + The root node of this document's active projection (the type or instance root). + + i=80 + i=68 + ns=2;i=64003 + + + + SelectedBindings + An immutable snapshot array of the protocol bindings selected for this document's forms. + + i=80 + i=68 + ns=2;i=64003 + + + + Validate + Validate the stored document (format and, when enabled, compatibility) without changing its projection. Returns the outcome snapshot; also refreshes the ValidationOutcome Property. + + i=80 + ns=2;i=64003 + ns=2;i=64566 + + + + OutputArguments + + i=78 + i=68 + ns=2;i=64565 + + i=297Outcomens=2;i=64040-1The validation outcome snapshot. + + + SetEnabled + Set the desired Enabled state of this document. Enabling requests validation and projection; disabling requests unload per the registry DeletePolicy. If ExpectedEpoch is non-zero and does not equal the resource's current Epoch the call fails with Bad_InvalidState and changes nothing. + + i=80 + ns=2;i=64003 + ns=2;i=64568 + + + + InputArguments + + i=78 + i=68 + ns=2;i=64567 + + i=297Enabledi=1-1The desired enabled state.i=297ExpectedEpochi=7-1Expected current Epoch for optimistic concurrency; 0 disables the check. + + + SetDefaultVersion + Make a specific version of this resource its default (sticky) version, so that resolvers selecting the resource without a versionid resolve to it. If ExpectedEpoch is non-zero and does not equal the resource's current Epoch the call fails with Bad_InvalidState and changes nothing. + + i=80 + ns=2;i=64003 + ns=2;i=64570 + + + + InputArguments + + i=78 + i=68 + ns=2;i=64569 + + i=297VersionIdi=12-1The versionid to make default.i=297ExpectedEpochi=7-1Expected current Epoch for optimistic concurrency; 0 disables the check. + + + ThingId + The Thing Description id (a URI/URN identifying the concrete Thing instance). + + i=80 + i=68 + ns=2;i=64004 + + + + ThingTitle + The Thing Description human-readable title. + + i=80 + i=68 + ns=2;i=64004 + + + + BaseUri + The Thing Description base URI used to resolve relative form hrefs. + + i=80 + i=68 + ns=2;i=64004 + + + + ModelReference + The xid or href of the Thing Model this Thing Description derives from (links rel=type), when present. + + i=80 + i=68 + ns=2;i=64004 + + + + ModelTitle + The Thing Model human-readable title. + + i=80 + i=68 + ns=2;i=64005 + + + + ModelVersion + The Thing Model version (WoT version.model), when present. + + i=80 + i=68 + ns=2;i=64005 + + + + DerivedTypeNodeId + The ObjectType or VariableType materialized from this Thing Model. + + i=80 + i=68 + ns=2;i=64005 + + + + BindingUri + The WoT protocol-binding vocabulary URI this descriptor represents. + + i=78 + i=68 + ns=2;i=64006 + + + + Title + Human-readable binding title. + + i=80 + i=68 + ns=2;i=64006 + + + + ProfileVersion + The version-pinned W3C binding document version. + + i=80 + i=68 + ns=2;i=64006 + + + + DraftMaturity + The W3C maturity of the pinned binding document (for example WD, CR, PR, REC). + + i=80 + i=68 + ns=2;i=64006 + + + + Enabled + True if the server currently realizes forms of this binding. + + i=80 + i=68 + ns=2;i=64006 + + + + ContentTypes + The content types this binding produces/consumes. + + i=80 + i=68 + ns=2;i=64006 + + + + Capabilities + An immutable capability snapshot for this binding. + + i=80 + i=68 + ns=2;i=64006 + + + + Xid + The xRegistry xid of the affected resource/version. + + i=78 + i=68 + ns=2;i=64010 + + + + ResourceId + The resourceid of the affected resource. + + i=78 + i=68 + ns=2;i=64010 + + + + VersionId + The versionid of the affected version. + + i=78 + i=68 + ns=2;i=64010 + + + + DocumentKind + Whether the document is a Thing Description or a Thing Model. + + i=78 + i=68 + ns=2;i=64010 + + + + Generation + The refresh generation the notification relates to. + + i=78 + i=68 + ns=2;i=64010 + + + + Phase + The phase reached (the failing phase on a failure event). + + i=78 + i=68 + ns=2;i=64010 + + + + Outcome + The outcome the notification reports. + + i=78 + i=68 + ns=2;i=64010 + + + + ValidationOutcome + The full validation outcome snapshot for the failure. + + i=78 + i=68 + ns=2;i=64011 + + + + LoadState + The load state after the failed projection/activation. + + i=78 + i=68 + ns=2;i=64012 + + + + FailedNodeId + The node whose materialization failed, if identifiable. + + i=78 + i=68 + ns=2;i=64012 + + + + Reason + Human-readable failure reason. + + i=78 + i=68 + ns=2;i=64012 + + + + BindingUri + The binding URI that could not be bound. + + i=78 + i=68 + ns=2;i=64013 + + + + Reason + Human-readable binding failure reason. + + i=78 + i=68 + ns=2;i=64013 + + + + Summary + The refresh summary snapshot. + + i=78 + i=68 + ns=2;i=64014 + + + + RequestId + The caller-supplied request identifier echoed from the Refresh call. + + i=78 + i=68 + ns=2;i=64014 + + + + Generation + The committed generation. + + i=78 + i=68 + ns=2;i=64014 + + + + WoTRegistry + The server-wide WoT Connectivity 1.1 registry, a well-known component of the Server object. Its stored Thing Description / Thing Model files are canonical; the projected AddressSpace is derived. It is the notifier for the WoT resource lifecycle events raised by its groups and resources. + WoT Connectivity 1.1 Instances + + ns=2;i=64000 + i=2253 + i=2253 + ns=2;i=64601 + ns=2;i=64604 + ns=2;i=64605 + + + + Refresh + Re-project selected stored documents into the AddressSpace. The functional Refresh Method on the well-known WoTRegistry object; a server binds the concrete handler. + WoT Connectivity 1.1 Instances + + ns=2;i=64100 + ns=2;i=64602 + ns=2;i=64603 + + + + InputArguments + WoT Connectivity 1.1 Instances + + i=68 + ns=2;i=64601 + + i=297Selectionns=2;i=6404310The documents to refresh; empty selects the whole registry.i=297Optionsns=2;i=64042-1Options controlling atomicity, force, dry-run and dependents.i=297ExpectedGenerationi=7-1Expected current RefreshGeneration for optimistic concurrency; 0 disables the check.i=297RequestIdi=12-1Caller-supplied identifier echoed into the summary and the completion event. + + + OutputArguments + WoT Connectivity 1.1 Instances + + i=68 + ns=2;i=64601 + + i=297Summaryns=2;i=64045-1The refresh summary.i=297Resultsns=2;i=6404410The per-resource results.i=297NewGenerationi=7-1The committed generation (unchanged on dry run or full failure). + + + RegistryId + xRegistry registryid: the stable identifier of this registry (Mandatory, inherited from the xRegistry RegistryType). Default value for the well-known instance; a server MAY override it. + WoT Connectivity 1.1 Instances + + i=68 + ns=2;i=64100 + + WoTRegistry + + + RefreshGeneration + The current committed projection generation; incremented on every committed refresh (Mandatory). Materialized as 0 at load time, before any Refresh has committed. + WoT Connectivity 1.1 Instances + + i=68 + ns=2;i=64100 + + 0 + + + WoTAssetConnectionManagementType + WoT Connectivity 1.02 legacy (deprecated) + + i=58 + ns=2;i=2 + ns=2;i=26 + ns=2;i=29 + ns=2;i=40 + ns=2;i=41 + ns=2;i=49 + ns=2;i=75 + ns=2;i=78 + + + + <WoTAssetName> + WoT Connectivity 1.02 legacy (deprecated) + + i=11508 + ns=2;i=1 + i=58 + ns=2;i=144 + ns=2;i=169 + ns=2;i=42 + + + + NamespaceFile + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=11575 + ns=2;i=4 + ns=2;i=5 + ns=2;i=6 + ns=2;i=7 + ns=2;i=8 + ns=2;i=9 + ns=2;i=10 + ns=2;i=11 + ns=2;i=14 + ns=2;i=16 + ns=2;i=19 + ns=2;i=21 + ns=2;i=24 + ns=2;i=37 + + + + Size + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + Writable + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + UserWritable + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + OpenCount + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + MimeType + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + MaxByteStringLength + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + LastModifiedTime + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + i=68 + + + + Open + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=12 + ns=2;i=13 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=11 + i=68 + + i=297Modei=3-1 + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=11 + i=68 + + i=297FileHandlei=7-1 + + + Close + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=15 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=14 + i=68 + + i=297FileHandlei=7-1 + + + Read + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=17 + ns=2;i=18 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=16 + i=68 + + i=297FileHandlei=7-1i=297Lengthi=6-1 + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=16 + i=68 + + i=297Datai=15-1 + + + Write + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=20 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=19 + i=68 + + i=297FileHandlei=7-1i=297Datai=15-1 + + + GetPosition + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=22 + ns=2;i=23 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=21 + i=68 + + i=297FileHandlei=7-1 + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=21 + i=68 + + i=297Positioni=9-1 + + + SetPosition + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=25 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=24 + i=68 + + i=297FileHandlei=7-1i=297Positioni=9-1 + + + CreateAsset + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=1 + ns=2;i=27 + ns=2;i=28 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=26 + i=68 + + i=297AssetNamei=12-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=26 + i=68 + + i=297AssetIdi=17-1 + + + DeleteAsset + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=1 + ns=2;i=30 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=29 + i=68 + + i=297AssetIdi=17-1 + + + WoTAssetConnectionManagement + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=1 + i=85 + ns=2;i=32 + ns=2;i=35 + ns=2;i=80 + ns=2;i=81 + ns=2;i=83 + ns=2;i=85 + ns=2;i=88 + + + + CreateAsset + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + ns=2;i=33 + ns=2;i=34 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=32 + i=68 + + i=297AssetNamei=12-1 + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=32 + i=68 + + i=297AssetIdi=17-1 + + + DeleteAsset + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + ns=2;i=36 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=35 + i=68 + + i=297AssetIdi=17-1 + + + ExportNamespace + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + + + + ConfigurationVersion + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + ModelVersion + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + 1.1.0 + + + SupportedWoTBindings + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=1 + i=68 + + + + DiscoverAssets + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=1 + ns=2;i=48 + + + + IWoTAssetType + WoT Connectivity 1.02 legacy (deprecated) + + i=17602 + ns=2;i=43 + ns=2;i=66 + ns=2;i=122 + + + + WoTFile + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=42 + ns=2;i=110 + ns=2;i=44 + ns=2;i=45 + ns=2;i=46 + ns=2;i=47 + ns=2;i=51 + ns=2;i=54 + ns=2;i=56 + ns=2;i=59 + ns=2;i=61 + ns=2;i=64 + ns=2;i=106 + ns=2;i=113 + ns=2;i=114 + ns=2;i=121 + + + + Size + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + i=68 + + + + Writable + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + i=68 + + + + UserWritable + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + i=68 + + + + OpenCount + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + i=68 + + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=41 + i=68 + + i=297AssetEndpointsi=1210 + + + CreateAssetForEndpoint + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=1 + ns=2;i=50 + ns=2;i=170 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=49 + i=68 + + i=297AssetNamei=12-1i=297AssetEndpointi=12-1 + + + Open + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=52 + ns=2;i=53 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=51 + i=68 + + i=297Modei=3-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=51 + i=68 + + i=297FileHandlei=7-1 + + + Close + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=55 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=54 + i=68 + + i=297FileHandlei=7-1 + + + Read + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=57 + ns=2;i=58 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=56 + i=68 + + i=297FileHandlei=7-1i=297Lengthi=6-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=56 + i=68 + + i=297Datai=15-1 + + + Write + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=60 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=59 + i=68 + + i=297FileHandlei=7-1i=297Datai=15-1 + + + GetPosition + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=62 + ns=2;i=63 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=61 + i=68 + + i=297FileHandlei=7-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=61 + i=68 + + i=297Positioni=9-1 + + + SetPosition + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=65 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=64 + i=68 + + i=297FileHandlei=7-1i=297Positioni=9-1 + + + <WoTPropertyName> + WoT Connectivity 1.02 legacy (deprecated) + + i=11508 + ns=2;i=42 + i=63 + + + + http://opcfoundation.org/UA/WoT-Con/ + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=3 + ns=2;i=38 + ns=2;i=39 + i=11616 + i=11715 + ns=2;i=68 + ns=2;i=69 + ns=2;i=70 + ns=2;i=71 + ns=2;i=72 + ns=2;i=73 + ns=2;i=74 + ns=2;i=99 + ns=2;i=100 + ns=2;i=101 + + + + NamespaceUri + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + http://opcfoundation.org/UA/WoT-Con/ + + + NamespaceVersion + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + 1.1.0 + + + NamespacePublicationDate + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + 2026-07-22T00:00:00Z + + + IsNamespaceSubset + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + false + + + StaticNodeIdTypes + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + StaticNumericNodeIdRange + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + StaticStringNodeIdPattern + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + + ConnectionTest + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=1 + ns=2;i=76 + ns=2;i=77 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=75 + i=68 + + i=297AssetEndpointi=12-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=75 + i=68 + + i=297Successi=1-1i=297Statusi=12-1 + + + Configuration + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=1 + ns=2;i=105 + ns=2;i=79 + + + + License + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=78 + i=68 + + + + SupportedWoTBindings + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + i=68 + + + + DiscoverAssets + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + ns=2;i=82 + + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=81 + i=68 + + i=297AssetEndpointsi=1210 + + + CreateAssetForEndpoint + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + ns=2;i=84 + ns=2;i=171 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=83 + i=68 + + i=297AssetNamei=12-1i=297AssetEndpointi=12-1 + + + ConnectionTest + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + ns=2;i=86 + ns=2;i=87 + + + + InputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=85 + i=68 + + i=297AssetEndpointi=12-1 + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=85 + i=68 + + i=297Successi=1-1i=297Statusi=12-1 + + + Configuration + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=31 + ns=2;i=105 + ns=2;i=89 + + + + License + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=88 + i=68 + + + + CreateAssetMethodType + WoT Connectivity 1.02 legacy (deprecated) + + ns=2;i=91 + ns=2;i=92 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=90 + i=68 + + i=297AssetNamei=12-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=90 + i=68 + + i=297AssetIdi=17-1 + + + DeleteAssetMethodType + WoT Connectivity 1.02 legacy (deprecated) + + ns=2;i=94 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=93 + i=68 + + i=297AssetIdi=17-1 + + + DiscoverAssetsMethodType + WoT Connectivity 1.02 legacy (deprecated) + + ns=2;i=96 + + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=95 + i=68 + + i=297AssetEndpointsi=1210 + + + CreateAssetForEndpointMethodType + WoT Connectivity 1.02 legacy (deprecated) + + ns=2;i=98 + ns=2;i=172 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=97 + i=68 + + i=297AssetNamei=12-1i=297AssetEndpointi=12-1 + + + DefaultRolePermissions + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + DefaultUserRolePermissions + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + DefaultAccessRestrictions + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=67 + i=68 + + + + ConnectionTestMethodType + WoT Connectivity 1.02 legacy (deprecated) + + ns=2;i=103 + ns=2;i=104 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=102 + i=68 + + i=297AssetEndpointi=12-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=102 + i=68 + + i=297Successi=1-1i=297Statusi=12-1 + + + WoTAssetConfigurationType + WoT Connectivity 1.02 legacy (deprecated) + + i=17602 + ns=2;i=108 + ns=2;i=109 + + + + CloseAndUpdate + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=43 + ns=2;i=107 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=106 + i=68 + + i=297FileHandlei=7-1 + + + <WoTConfigurationParameterName> + WoT Connectivity 1.02 legacy (deprecated) + + i=11508 + ns=2;i=105 + i=68 + + + + License + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=105 + i=68 + + + + WoTAssetFileType + WoT Connectivity 1.02 legacy (deprecated) + + i=11575 + ns=2;i=111 + + + + CloseAndUpdate + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=110 + ns=2;i=112 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=111 + i=68 + + i=297FileHandlei=7-1 + + + MimeType + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=43 + i=68 + + + + MaxByteStringLength + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=43 + i=68 + + + + LastModifiedTime + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=43 + i=68 + + + + AssetEndpoint + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=42 + i=68 + + + + CloseAndUpdateMethodType + WoT Connectivity 1.02 legacy (deprecated) + + ns=2;i=143 + + + + HasWoTComponent + WoTComponentOf + WoT Connectivity 1.02 legacy (deprecated) + + i=47 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=123 + i=68 + + i=297FileHandlei=7-1 + + + WoTFile + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=2 + ns=2;i=110 + ns=2;i=145 + ns=2;i=146 + ns=2;i=147 + ns=2;i=148 + ns=2;i=149 + ns=2;i=150 + ns=2;i=151 + ns=2;i=152 + ns=2;i=155 + ns=2;i=157 + ns=2;i=160 + ns=2;i=162 + ns=2;i=165 + ns=2;i=167 + + + + Size + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + i=68 + + + + Writable + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + i=68 + + + + UserWritable + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + i=68 + + + + OpenCount + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + i=68 + + + + MimeType + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=144 + i=68 + + + + MaxByteStringLength + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=144 + i=68 + + + + LastModifiedTime + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=144 + i=68 + + + + Open + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=153 + ns=2;i=154 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=152 + i=68 + + i=297Modei=3-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=152 + i=68 + + i=297FileHandlei=7-1 + + + Close + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=156 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=155 + i=68 + + i=297FileHandlei=7-1 + + + Read + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=158 + ns=2;i=159 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=157 + i=68 + + i=297FileHandlei=7-1i=297Lengthi=6-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=157 + i=68 + + i=297Datai=15-1 + + + Write + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=161 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=160 + i=68 + + i=297FileHandlei=7-1i=297Datai=15-1 + + + GetPosition + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=163 + ns=2;i=164 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=162 + i=68 + + i=297FileHandlei=7-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=162 + i=68 + + i=297Positioni=9-1 + + + SetPosition + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=166 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=165 + i=68 + + i=297FileHandlei=7-1i=297Positioni=9-1 + + + CloseAndUpdate + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=144 + ns=2;i=168 + + + + InputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=167 + i=68 + + i=297FileHandlei=7-1 + + + AssetEndpoint + WoT Connectivity 1.02 legacy (deprecated) + + i=80 + ns=2;i=2 + i=68 + + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=49 + i=68 + + i=297AssetIdi=17-1 + + + OutputArguments + WoT Connectivity 1.02 Legacy Instances + + ns=2;i=83 + i=68 + + i=297AssetIdi=17-1 + + + OutputArguments + WoT Connectivity 1.02 legacy (deprecated) + + i=78 + ns=2;i=97 + i=68 + + i=297AssetIdi=17-1 + + diff --git a/src/Opc.Ua.WotCon/Opc.Ua.WotCon.csproj b/src/Opc.Ua.WotCon/Opc.Ua.WotCon.csproj index 70db071ff4..79f0751565 100644 --- a/src/Opc.Ua.WotCon/Opc.Ua.WotCon.csproj +++ b/src/Opc.Ua.WotCon/Opc.Ua.WotCon.csproj @@ -6,7 +6,7 @@ Opc.Ua.WotCon $(NoWarn);CS1591 enable - OPC UA WoT Connectivity (OPC 10100-1) information model + OPC UA WoT Connectivity 1.1 information model — a registry-first revision (additive registry nodes plus the incorporated, deprecated OPC 10100-1 v1.02 surface) in one namespace. true NugetREADME.md MIT @@ -24,6 +24,11 @@ + + @@ -41,12 +46,40 @@ true - - + + + - - + + + Design\Opc.Ua.XRegistry.NodeSet2.xml + Opc.Ua.XRegistry + XRegistry + http://opcfoundation.org/UA/xRegistry/ + true + + + + Opc.Ua.WotCon + WotCon + http://opcfoundation.org/UA/WoT-Con/ + + diff --git a/src/Opc.Ua.XRegistry.Client/GenericXRegistryClient.cs b/src/Opc.Ua.XRegistry.Client/GenericXRegistryClient.cs index 6553c1bff9..7d8c981fd8 100644 --- a/src/Opc.Ua.XRegistry.Client/GenericXRegistryClient.cs +++ b/src/Opc.Ua.XRegistry.Client/GenericXRegistryClient.cs @@ -56,6 +56,29 @@ public GenericXRegistryClient( { } + /// + /// Initializes a generic registry client rooted at an explicit registry Object. + /// + /// A domain registry declares its own root rather than reusing the provisional well-known + /// identifier, and a caller typically discovers it by Browse. This overload drives such a + /// registry through the base-model proxies without deriving a domain client. + /// + /// + /// The connected session whose server hosts the registry. + /// The registry companion namespace URI. + /// + /// The registry root Object. Pass a null NodeId to use the well-known root. + /// + /// Telemetry context used by the generated proxies. + public GenericXRegistryClient( + ISession session, + string registryNamespaceUri, + NodeId registryNodeId, + ITelemetryContext telemetry) + : base(session, registryNamespaceUri, registryNodeId, telemetry) + { + } + /// /// Initializes a generic client bound to the abstract xRegistry base namespace. /// diff --git a/src/Opc.Ua.XRegistry.Client/XRegistryClient.cs b/src/Opc.Ua.XRegistry.Client/XRegistryClient.cs index 5f8d8ec3f6..c559f26678 100644 --- a/src/Opc.Ua.XRegistry.Client/XRegistryClient.cs +++ b/src/Opc.Ua.XRegistry.Client/XRegistryClient.cs @@ -58,7 +58,7 @@ public abstract class XRegistryClient { /// /// Initializes a registry client bound to a connected and the - /// registry's companion namespace. + /// registry's companion namespace, using the well-known registry root Object. /// /// The connected session whose server hosts the registry. /// The registry companion namespace URI. @@ -71,6 +71,37 @@ protected XRegistryClient( ISession session, string registryNamespaceUri, ITelemetryContext telemetry) + : this(session, registryNamespaceUri, default, telemetry) + { + } + + /// + /// Initializes a registry client bound to a connected , the + /// registry's companion namespace, and an explicit registry root Object. + /// + /// A domain registry does not necessarily publish its root at + /// — that identifier is provisional, and a + /// domain model such as WoT Connectivity declares its own root, which a client typically + /// discovers by Browse. Passing the resolved NodeId here makes the root a construction-time + /// input that cannot subsequently drift. + /// + /// + /// The connected session whose server hosts the registry. + /// The registry companion namespace URI. + /// + /// The registry root Object. Pass a null NodeId to use the well-known root + /// in the resolved registry namespace. + /// + /// Telemetry context used by the generated proxies. + /// or + /// is null. + /// is null/empty. + /// The server does not expose the registry namespace. + protected XRegistryClient( + ISession session, + string registryNamespaceUri, + NodeId registryNodeId, + ITelemetryContext telemetry) { Session = session ?? throw new ArgumentNullException(nameof(session)); Telemetry = telemetry ?? throw new ArgumentNullException(nameof(telemetry)); @@ -90,6 +121,9 @@ protected XRegistryClient( RegistryNamespaceUri = registryNamespaceUri; NamespaceIndex = (ushort)index; + RegistryNodeId = registryNodeId.IsNull + ? new NodeId(XRegistryWellKnown.RegistryObject, NamespaceIndex) + : registryNodeId; } /// @@ -108,11 +142,12 @@ protected XRegistryClient( public ushort NamespaceIndex { get; } /// - /// Gets the NodeId of the registry root Object, which a server publishes at a well-known - /// identifier in its registry namespace. This is the starting point for the group lifecycle, - /// so a caller does not have to Browse for it. + /// Gets the NodeId of the registry root Object. By default this is the well-known + /// identifier a server publishes in its registry namespace, so a caller does not have to + /// Browse for it; a domain registry whose root lives elsewhere supplies it at construction. + /// This is the starting point for the group lifecycle. /// - public NodeId RegistryNodeId => new(XRegistryWellKnown.RegistryObject, NamespaceIndex); + public NodeId RegistryNodeId { get; } /// /// Gets the telemetry context handed to the generated proxies. diff --git a/tests/Opc.Ua.Aot.Tests/HostingAotTests.cs b/tests/Opc.Ua.Aot.Tests/HostingAotTests.cs index e9eefc94ae..fb273035a4 100644 --- a/tests/Opc.Ua.Aot.Tests/HostingAotTests.cs +++ b/tests/Opc.Ua.Aot.Tests/HostingAotTests.cs @@ -206,8 +206,12 @@ public async Task AddRuntimeNodeSetStreamRegistrationIsAotSafeAsync() string nodeSetXml = "" + "" + - "" + namespaceUri + "" + - "" + + "" + + namespaceUri + + "" + + "" + "" + "Root" + ""; @@ -219,17 +223,14 @@ public async Task AddRuntimeNodeSetStreamRegistrationIsAotSafeAsync() o.ApplicationName = "AotRuntimeNodeSetServer"; o.AutoAcceptUntrustedCertificates = true; }) - .AddRuntimeNodeSet(options => - { - options.Sources = + .AddRuntimeNodeSet(options => options.Sources = [ RuntimeNodeSetSource.FromStream( "AOT runtime NodeSet", _ => new ValueTask( new MemoryStream(Encoding.UTF8.GetBytes(nodeSetXml))), [namespaceUri]) - ]; - }); + ]); using ServiceProvider sp = services.BuildServiceProvider(); IAsyncNodeManagerFactory factory = sp.GetService(); diff --git a/tests/Opc.Ua.Di.Tests/DeviceBuilderTests.cs b/tests/Opc.Ua.Di.Tests/DeviceBuilderTests.cs index a63395660c..4abf190af1 100644 --- a/tests/Opc.Ua.Di.Tests/DeviceBuilderTests.cs +++ b/tests/Opc.Ua.Di.Tests/DeviceBuilderTests.cs @@ -27,10 +27,12 @@ * http://opcfoundation.org/License/MIT/1.00/ * ======================================================================*/ +using System.Collections.Generic; using System.Threading.Tasks; using NUnit.Framework; using Opc.Ua.Di.Server; using Opc.Ua.Di.Server.Builders; +using Opc.Ua.Server.Fluent; namespace Opc.Ua.Di.Tests { @@ -134,6 +136,30 @@ public async Task CreateDeviceAsyncRegistersInPredefinedNodes() Assert.That(resolved, Is.SameAs(builder.Device)); } + [Test] + public void VariableFromDataTypeIdResolvesUniquePredefinedVariable() + { + ushort namespaceIndex = m_fixture.Manager.DiNamespaceIndex; + var predefined = new BaseDataVariableState(null) + { + NodeId = new NodeId("UniqueDataTypeVariable", namespaceIndex), + BrowseName = new QualifiedName("UniqueDataTypeVariable", namespaceIndex), + DisplayName = new LocalizedText("UniqueDataTypeVariable"), + DataType = Types.DataTypeIds.String, + ValueRank = ValueRanks.Scalar, + Value = "value" + }; + m_fixture.Manager.AddPlainPredefinedNodeSynchronously(predefined); + NodeManagerBuilder builder = m_fixture.Manager.GetOrCreateBuilder(); + + IVariableBuilder variable = + builder.VariableFromDataTypeId( + Types.DataTypeIds.String, + predefined.BrowseName); + + Assert.That(variable.Node, Is.SameAs(predefined)); + } + [Test] public async Task CreateDeviceAsyncFailsOnDuplicateBrowseName() { @@ -178,6 +204,46 @@ public async Task WithIdentificationWritesNameplate() Assert.That(builder.Device.RevisionCounter!.Value, Is.EqualTo(7)); } + [Test] + public async Task WithIdentificationWritesCompleteNameplateAsync() + { + IDeviceBuilder builder = await m_fixture.Manager + .CreateDeviceAsync(new QualifiedName( + "DeviceCompleteNameplate", + m_fixture.Manager.DiNamespaceIndex)) + .ConfigureAwait(false); + + builder.WithIdentification(id => + { + id.ManufacturerUri = "https://example.test/manufacturer"; + id.Model = new LocalizedText("Model 2000"); + id.HardwareRevision = "HW-2"; + id.SoftwareRevision = "SW-3"; + id.DeviceRevision = "REV-4"; + id.ProductCode = "PC-5"; + id.DeviceManual = "https://example.test/manual"; + id.ProductInstanceUri = "urn:example:device:6"; + }); + + Assert.Multiple(() => + { + Assert.That( + builder.Device.ManufacturerUri!.Value, + Is.EqualTo("https://example.test/manufacturer")); + Assert.That(builder.Device.Model!.Value.Text, Is.EqualTo("Model 2000")); + Assert.That(builder.Device.HardwareRevision!.Value, Is.EqualTo("HW-2")); + Assert.That(builder.Device.SoftwareRevision!.Value, Is.EqualTo("SW-3")); + Assert.That(builder.Device.DeviceRevision!.Value, Is.EqualTo("REV-4")); + Assert.That(builder.Device.ProductCode!.Value, Is.EqualTo("PC-5")); + Assert.That( + builder.Device.DeviceManual!.Value, + Is.EqualTo("https://example.test/manual")); + Assert.That( + builder.Device.ProductInstanceUri!.Value, + Is.EqualTo("urn:example:device:6")); + }); + } + [Test] public async Task WithIdentificationSkipsUnsetFields() { @@ -238,6 +304,37 @@ public async Task WithFunctionalGroupIsIdempotent() "Calling WithMaintenanceGroup twice should reuse the existing group."); } + [Test] + public async Task WellKnownFunctionalGroupsCreateExpectedNodesAsync() + { + IDeviceBuilder builder = await m_fixture.Manager + .CreateDeviceAsync(new QualifiedName( + "DeviceAllGroups", + m_fixture.Manager.DiNamespaceIndex)) + .ConfigureAwait(false); + var names = new List(); + + builder + .WithIdentificationGroup(group => names.Add(group.Group.BrowseName.Name ?? string.Empty)) + .WithDiagnosticsGroup(group => names.Add(group.Group.BrowseName.Name ?? string.Empty)) + .WithStatusGroup(group => names.Add(group.Group.BrowseName.Name ?? string.Empty)) + .WithOperationalGroup(group => names.Add(group.Group.BrowseName.Name ?? string.Empty)) + .WithStatisticsGroup(group => names.Add(group.Group.BrowseName.Name ?? string.Empty)) + .WithOperationCountersGroup(group => names.Add(group.Group.BrowseName.Name ?? string.Empty)); + + Assert.That( + names, + Is.EquivalentTo( + [ + WellKnownFunctionalGroups.Identification, + WellKnownFunctionalGroups.Diagnostics, + WellKnownFunctionalGroups.Status, + WellKnownFunctionalGroups.Operational, + WellKnownFunctionalGroups.Statistics, + WellKnownFunctionalGroups.OperationCounters + ])); + } + [Test] public async Task DeviceWrapsExistingNode() { @@ -296,7 +393,9 @@ public async Task ConnectsToAddsForwardReference() a.ConnectsTo(b.Device.NodeId); var connectsToRefType = NodeId.Create( +#pragma warning disable IDE0002 // fully qualify: net-TFM simplification analysis disagrees across targets here global::Opc.Ua.Di.ReferenceTypes.ConnectsTo, +#pragma warning restore IDE0002 DiNodeManager.DiNamespaceUri, m_fixture.Server.CurrentInstance.NamespaceUris); diff --git a/tests/Opc.Ua.Di.Tests/TransferServicesExtensionsTests.cs b/tests/Opc.Ua.Di.Tests/TransferServicesExtensionsTests.cs new file mode 100644 index 0000000000..24da175f94 --- /dev/null +++ b/tests/Opc.Ua.Di.Tests/TransferServicesExtensionsTests.cs @@ -0,0 +1,221 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using Moq; +using NUnit.Framework; +using Opc.Ua.Di.Server.Transfer; + +namespace Opc.Ua.Di.Tests +{ + [TestFixture] + [Category("DI")] + [Category("Transfer")] + public sealed class TransferServicesExtensionsTests + { + [Test] + public void BindToTransferServiceRejectsInvalidArguments() + { + ITransferService service = Mock.Of(); + BaseObjectState transferServices = CreateTransferServices().Object; + + Assert.That( + () => TransferServicesExtensions.BindToTransferService( + null!, + new NodeId("Device", 2), + service), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("transferServices")); + Assert.That( + () => transferServices.BindToTransferService(NodeId.Null, service), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("elementId")); + Assert.That( + () => transferServices.BindToTransferService(new NodeId("Device", 2), null!), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("service")); + } + + [Test] + public void BindToTransferServiceRequiresAllMethodChildren() + { + var transferServices = new BaseObjectState(null) + { + BrowseName = new QualifiedName("TransferServices", 2) + }; + transferServices.AddChild(CreateMethod( + transferServices, + BrowseNames.TransferToDevice)); + + Assert.That( + () => transferServices.BindToTransferService( + new NodeId("Device", 2), + Mock.Of()), + Throws.InstanceOf() + .With.Property(nameof(ServiceResultException.StatusCode)) + .EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public void BoundTransferMethodsRouteToService() + { + NodeId elementId = new("Device", 2); + var service = new Mock(MockBehavior.Strict); + service + .Setup(s => s.TransferToDeviceAsync( + It.IsAny(), + elementId, + It.Is(set => set.ElementId == elementId), + default)) + .ReturnsAsync(11); + service + .Setup(s => s.TransferFromDeviceAsync( + It.IsAny(), + elementId, + default)) + .ReturnsAsync(12); + (BaseObjectState Object, MethodState To, MethodState From, _) = + CreateTransferServices(); + Object.BindToTransferService(elementId, service.Object); + var toOutputs = new List(); + var fromOutputs = new List(); + var context = new SystemContext(telemetry: null!); + + ServiceResult toResult = To.OnCallMethod2!( + context, + To, + Object.NodeId, + [], + toOutputs); + ServiceResult fromResult = From.OnCallMethod2!( + context, + From, + Object.NodeId, + [], + fromOutputs); + + Assert.Multiple(() => + { + Assert.That(ServiceResult.IsGood(toResult), Is.True); + Assert.That(toOutputs[0].GetInt32(), Is.EqualTo(11)); + Assert.That(toOutputs[1].GetInt32(), Is.EqualTo((int)(uint)StatusCodes.Good)); + Assert.That(ServiceResult.IsGood(fromResult), Is.True); + Assert.That(fromOutputs[0].GetInt32(), Is.EqualTo(12)); + Assert.That(fromOutputs[1].GetInt32(), Is.EqualTo((int)(uint)StatusCodes.Good)); + }); + } + + [Test] + public void BoundFetchValidatesAndRoutesArguments() + { + var service = new Mock(MockBehavior.Strict); + service + .SetupSequence(s => s.FetchAsync( + It.IsAny(), + 7, + 3, + 25, + true, + default)) + .ReturnsAsync(new FetchResult(3, true, [], StatusCodes.Good)) + .ReturnsAsync(new FetchResult(3, true, [], StatusCodes.BadInternalError)); + (BaseObjectState Object, _, _, MethodState Fetch) = CreateTransferServices(); + Object.BindToTransferService(new NodeId("Device", 2), service.Object); + var context = new SystemContext(telemetry: null!); + ArrayOf inputs = + [ + new Variant(7), + new Variant(3), + new Variant(25), + new Variant(true) + ]; + var outputs = new List(); + + ServiceResult missing = Fetch.OnCallMethod2!( + context, + Fetch, + Object.NodeId, + [new Variant(7)], + []); + ServiceResult success = Fetch.OnCallMethod2!( + context, + Fetch, + Object.NodeId, + inputs, + outputs); + ServiceResult failure = Fetch.OnCallMethod2!( + context, + Fetch, + Object.NodeId, + inputs, + []); + + Assert.Multiple(() => + { + Assert.That(missing.StatusCode, Is.EqualTo(StatusCodes.BadArgumentsMissing)); + Assert.That(ServiceResult.IsGood(success), Is.True); + Assert.That(outputs, Has.Count.EqualTo(1)); + Assert.That(outputs[0].IsNull, Is.True); + Assert.That(failure.StatusCode, Is.EqualTo(StatusCodes.BadInternalError)); + }); + } + + private static ( + BaseObjectState Object, + MethodState To, + MethodState From, + MethodState Fetch) CreateTransferServices() + { + var transferServices = new BaseObjectState(null) + { + NodeId = new NodeId("TransferServices", 2), + BrowseName = new QualifiedName("TransferServices", 2) + }; + MethodState transferTo = CreateMethod( + transferServices, + BrowseNames.TransferToDevice); + MethodState transferFrom = CreateMethod( + transferServices, + BrowseNames.TransferFromDevice); + MethodState fetch = CreateMethod( + transferServices, + BrowseNames.FetchTransferResultData); + transferServices.AddChild(transferTo); + transferServices.AddChild(transferFrom); + transferServices.AddChild(fetch); + return (transferServices, transferTo, transferFrom, fetch); + } + + private static MethodState CreateMethod(BaseObjectState parent, string browseName) + { + return new MethodState(parent) + { + NodeId = new NodeId(browseName, 2), + BrowseName = new QualifiedName(browseName, 2) + }; + } + } +} diff --git a/tests/Opc.Ua.Server.TestFramework/ServerTestServices.cs b/tests/Opc.Ua.Server.TestFramework/ServerTestServices.cs index 102afd72f6..1707ceb62e 100644 --- a/tests/Opc.Ua.Server.TestFramework/ServerTestServices.cs +++ b/tests/Opc.Ua.Server.TestFramework/ServerTestServices.cs @@ -322,6 +322,21 @@ public async ValueTask RepublishAsync( lifetime).ConfigureAwait(false); } + public async ValueTask DeleteMonitoredItemsAsync( + RequestHeader requestHeader, + uint subscriptionId, + ArrayOf monitoredItemIds, + CancellationToken ct = default) + { + using var lifetime = new RequestLifetime(ct); + return await m_server.DeleteMonitoredItemsAsync( + SecureChannelContext, + requestHeader, + subscriptionId, + monitoredItemIds, + lifetime).ConfigureAwait(false); + } + public async ValueTask DeleteSubscriptionsAsync( RequestHeader requestHeader, ArrayOf subscriptionIds, diff --git a/tests/Opc.Ua.Server.Tests/AsyncCustomNodeManagerTests.cs b/tests/Opc.Ua.Server.Tests/AsyncCustomNodeManagerTests.cs index 9060813e5a..f9e63b45a1 100644 --- a/tests/Opc.Ua.Server.Tests/AsyncCustomNodeManagerTests.cs +++ b/tests/Opc.Ua.Server.Tests/AsyncCustomNodeManagerTests.cs @@ -5667,10 +5667,23 @@ public ValueTask TransferMonitoredItemsAsync( IList monitoredItems, IList processedItems, IList errors, + MonitoredItemTransferOptions? transferOptions = null, CancellationToken cancellationToken = default) { return m_adapter.TransferMonitoredItemsAsync( - context, sendInitialValues, monitoredItems, processedItems, errors, cancellationToken); + context, sendInitialValues, monitoredItems, processedItems, errors, transferOptions, cancellationToken); + } + + public ValueTask RollbackMonitoredItemsTransferAsync( + OperationContext context, + IList monitoredItems, + IList processedItems, + IList errors, + MonitoredItemTransferOptions? transferOptions = null, + CancellationToken cancellationToken = default) + { + return m_adapter.RollbackMonitoredItemsTransferAsync( + context, monitoredItems, processedItems, errors, transferOptions, cancellationToken); } public ValueTask SessionClosingAsync( diff --git a/tests/Opc.Ua.Server.Tests/Fluent/NodeManagerBuilderTests.cs b/tests/Opc.Ua.Server.Tests/Fluent/NodeManagerBuilderTests.cs index ec4edf7e61..d1a085c545 100644 --- a/tests/Opc.Ua.Server.Tests/Fluent/NodeManagerBuilderTests.cs +++ b/tests/Opc.Ua.Server.Tests/Fluent/NodeManagerBuilderTests.cs @@ -617,6 +617,32 @@ private static BaseObjectState MakeObject(string name, NodeId typeDefId) }; } + private static NodeManagerBuilder CreateBuilderWithDataTypeIndex( + Dictionary> byDataType) + { + return new NodeManagerBuilder( + CreateContext(), + Mock.Of(), + kNs, + _ => null, + _ => null, + _ => [], + dataTypeId => byDataType.TryGetValue(dataTypeId, out ArrayOf list) + ? list + : []); + } + + private static BaseDataVariableState MakeVariable(string name, NodeId dataTypeId) + { + return new BaseDataVariableState(parent: null) + { + NodeId = new NodeId(name, kNs), + BrowseName = new QualifiedName(name, kNs), + DataType = dataTypeId, + ValueRank = ValueRanks.Scalar + }; + } + [Test] public void NodeFromTypeIdResolvesSingleton() { @@ -865,5 +891,115 @@ public void VariableByBrowseNameThrowsBadTypeMismatchOnNonVariable() () => b.Node(root.NodeId).Variable(m.BrowseName)); Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadTypeMismatch)); } + + [Test] + public void VariableFromDataTypeIdResolvesUniqueVariable() + { + NodeId dataTypeId = DataTypeIds.Int32; + BaseDataVariableState only = MakeVariable("ByDataType", dataTypeId); + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex( + new Dictionary> { [dataTypeId] = [only] }); + + IVariableBuilder byDataType = b.VariableFromDataTypeId(dataTypeId); + + Assert.That(byDataType.Node, Is.SameAs(only)); + } + + [Test] + public void VariableFromDataTypeIdNullThrowsBadNodeIdInvalid() + { + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex([]); + + ServiceResultException ex = Assert.Throws( + () => b.VariableFromDataTypeId(NodeId.Null)); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadNodeIdInvalid)); + } + + [Test] + public void VariableFromDataTypeIdMissingThrowsBadNodeIdUnknown() + { + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex([]); + + ServiceResultException ex = Assert.Throws( + () => b.VariableFromDataTypeId(DataTypeIds.Int32)); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public void VariableFromDataTypeIdAmbiguousThrowsBadBrowseNameDuplicated() + { + NodeId dataTypeId = DataTypeIds.Int32; + BaseDataVariableState a = MakeVariable("Temp1", dataTypeId); + BaseDataVariableState bn = MakeVariable("Temp2", dataTypeId); + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex( + new Dictionary> { [dataTypeId] = [a, bn] }); + + ServiceResultException ex = Assert.Throws( + () => b.VariableFromDataTypeId(dataTypeId)); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadBrowseNameDuplicated)); + } + + [Test] + public void VariableFromDataTypeIdWithBrowseNameDisambiguates() + { + NodeId dataTypeId = DataTypeIds.Int32; + BaseDataVariableState a = MakeVariable("Temp1", dataTypeId); + BaseDataVariableState bn = MakeVariable("Temp2", dataTypeId); + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex( + new Dictionary> { [dataTypeId] = [a, bn] }); + + IVariableBuilder byName = b.VariableFromDataTypeId(dataTypeId, bn.BrowseName); + + Assert.That(byName.Node, Is.SameAs(bn)); + } + + [Test] + public void VariableFromDataTypeIdWithBrowseNameMissThrowsBadNodeIdUnknown() + { + NodeId dataTypeId = DataTypeIds.Int32; + BaseDataVariableState a = MakeVariable("Temp1", dataTypeId); + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex( + new Dictionary> { [dataTypeId] = [a] }); + + ServiceResultException ex = Assert.Throws( + () => b.VariableFromDataTypeId(dataTypeId, new QualifiedName("Nope", kNs))); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public void VariableFromDataTypeIdWithDuplicateBrowseNameThrowsBadBrowseNameDuplicated() + { + NodeId dataTypeId = DataTypeIds.Int32; + BaseDataVariableState first = MakeVariable("Duplicate", dataTypeId); + BaseDataVariableState second = MakeVariable("Duplicate", dataTypeId); + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex( + new Dictionary> { [dataTypeId] = [first, second] }); + + ServiceResultException ex = Assert.Throws( + () => b.VariableFromDataTypeId(dataTypeId, first.BrowseName)); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadBrowseNameDuplicated)); + } + + /// + /// Mirrors : + /// the DataType resolver contract only guarantees the candidates it is + /// handed are instances at the + /// production resolver level; if a custom resolver (as injected here) + /// returns a non-variable node, + /// must still surface a clear + /// rather than an unhandled cast failure. + /// + [Test] + public void VariableFromDataTypeIdThrowsBadTypeMismatchForNonVariable() + { + NodeId dataTypeId = DataTypeIds.Int32; + BaseObjectState only = MakeObject("NotAVariable", ObjectTypeIds.BaseObjectType); + NodeManagerBuilder b = CreateBuilderWithDataTypeIndex( + new Dictionary> { [dataTypeId] = [only] }); + + ServiceResultException ex = Assert.Throws( + () => b.VariableFromDataTypeId(dataTypeId)); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadTypeMismatch)); + } } } diff --git a/tests/Opc.Ua.Server.Tests/Hosting/CombinedHostingTests.cs b/tests/Opc.Ua.Server.Tests/Hosting/CombinedHostingTests.cs index bf8ae02207..7d1db5cfcb 100644 --- a/tests/Opc.Ua.Server.Tests/Hosting/CombinedHostingTests.cs +++ b/tests/Opc.Ua.Server.Tests/Hosting/CombinedHostingTests.cs @@ -41,7 +41,6 @@ using Opc.Ua.Gds.Server.Hosting; using Opc.Ua.Server.Hosting; using Opc.Ua.Server.UserDatabase; -using Opc.Ua.WotCon.Server; #nullable enable @@ -50,7 +49,7 @@ namespace Opc.Ua.Server.Tests.Hosting /// /// Integration tests for the unified OPC UA dependency-injection /// surface across multiple co-hosted features (regular server, - /// client, LDS server, GDS server, WoT Connectivity). + /// client, LDS server, and GDS server). /// /// /// These tests only exercise the DI registration @@ -305,35 +304,6 @@ public void NodeManagerRegisteredOnRegularServerIsIsolatedFromGdsLds() "LDS hosted service must not consume OpcUaServerNodeManagerRegistration."); } - [Test] - public void AddWotConServerRegistersUnderServerFeature() - { - var services = new ServiceCollection(); - services.AddLogging(); - - services.AddOpcUa() - .AddServer(opt => ConfigureServerOptions(opt, "WotConHostServer")) - .Services.AddOpcUa() - .AddWotConServer(opt => opt.AssetNamespaceUri = "urn:test:wot:assets"); - - using ServiceProvider sp = services.BuildServiceProvider(); - - IList registrations = - [.. sp.GetServices()]; - - int wotCount = registrations.Count( - r => r.SyncFactory is WotConnectivityNodeManagerFactory); - Assert.That(wotCount, Is.EqualTo(1), - "WotConnectivityNodeManagerFactory must be registered exactly once " + - "as an OpcUaServerNodeManagerRegistration."); - - // The WotCon node-manager factory itself must be resolvable - // for tooling / introspection. - WotConnectivityNodeManagerFactory factory = - sp.GetRequiredService(); - Assert.That(factory, Is.Not.Null); - } - private static void ConfigureServerOptions(OpcUaServerOptions opt, string name) { opt.ApplicationName = name; diff --git a/tests/Opc.Ua.Server.Tests/Hosting/HostedNodeManagerLifecycleTests.cs b/tests/Opc.Ua.Server.Tests/Hosting/HostedNodeManagerLifecycleTests.cs index 1594934033..60b2956801 100644 --- a/tests/Opc.Ua.Server.Tests/Hosting/HostedNodeManagerLifecycleTests.cs +++ b/tests/Opc.Ua.Server.Tests/Hosting/HostedNodeManagerLifecycleTests.cs @@ -109,6 +109,30 @@ public void ReloadAsyncWithSyncFactoryThrowsWhenNotAttached() Throws.InvalidOperationException); } + [Test] + public void ShadowReloadAsyncWithAsyncFactoryThrowsWhenNotAttached() + { + var hosted = new HostedNodeManagerLifecycle(); + NodeManagerRegistration registration = NewRegistration(); + IAsyncNodeManagerFactory replacement = Mock.Of(); + + Assert.That( + async () => await hosted.ShadowReloadAsync(registration, replacement).ConfigureAwait(false), + Throws.InvalidOperationException); + } + + [Test] + public void ShadowReloadAsyncWithSyncFactoryThrowsWhenNotAttached() + { + var hosted = new HostedNodeManagerLifecycle(); + NodeManagerRegistration registration = NewRegistration(); + INodeManagerFactory replacement = Mock.Of(); + + Assert.That( + async () => await hosted.ShadowReloadAsync(registration, replacement).ConfigureAwait(false), + Throws.InvalidOperationException); + } + [Test] public void RemoveAsyncThrowsWhenNotAttached() { @@ -254,6 +278,46 @@ public async Task ReloadAsyncWithSyncFactoryDelegatesToAttachedLifecycleAsync() Assert.That(actual, Is.SameAs(expected)); } + [Test] + public async Task ShadowReloadAsyncWithAsyncFactoryDelegatesToAttachedLifecycleAsync() + { + var hosted = new HostedNodeManagerLifecycle(); + var inner = new Mock(); + NodeManagerRegistration current = NewRegistration(); + NodeManagerRegistration expected = NewRegistration(); + IAsyncNodeManagerFactory replacement = Mock.Of(); + inner + .Setup(l => l.ShadowReloadAsync(current, replacement, CancellationToken.None)) + .Returns(new ValueTask(expected)); + hosted.Attach(inner.Object); + + NodeManagerRegistration actual = await hosted + .ShadowReloadAsync(current, replacement) + .ConfigureAwait(false); + + Assert.That(actual, Is.SameAs(expected)); + } + + [Test] + public async Task ShadowReloadAsyncWithSyncFactoryDelegatesToAttachedLifecycleAsync() + { + var hosted = new HostedNodeManagerLifecycle(); + var inner = new Mock(); + NodeManagerRegistration current = NewRegistration(); + NodeManagerRegistration expected = NewRegistration(); + INodeManagerFactory replacement = Mock.Of(); + inner + .Setup(l => l.ShadowReloadAsync(current, replacement, CancellationToken.None)) + .Returns(new ValueTask(expected)); + hosted.Attach(inner.Object); + + NodeManagerRegistration actual = await hosted + .ShadowReloadAsync(current, replacement) + .ConfigureAwait(false); + + Assert.That(actual, Is.SameAs(expected)); + } + [Test] public async Task RemoveAsyncDelegatesToAttachedLifecycleAsync() { diff --git a/tests/Opc.Ua.Server.Tests/MonitoredItemRetirementTests.cs b/tests/Opc.Ua.Server.Tests/MonitoredItemRetirementTests.cs new file mode 100644 index 0000000000..5320b49d18 --- /dev/null +++ b/tests/Opc.Ua.Server.Tests/MonitoredItemRetirementTests.cs @@ -0,0 +1,293 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Moq; +using NUnit.Framework; +using Opc.Ua.Tests; + +namespace Opc.Ua.Server.Tests +{ + /// + /// Covers the immediate-retirement contract a + /// implements for the NodeManager lifecycle: a retired item stops accepting + /// values and events, reports a terminal status, and only then releases its + /// owner references. + /// + [TestFixture] + [Category("Subscription")] + [Category("NodeManagerLifecycle")] + [Parallelizable] + public class MonitoredItemRetirementTests + { + [SetUp] + public void SetUp() + { + m_telemetry = NUnitTelemetryContext.Create(); + } + + [Test] + public void RetireRejectsANullError() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + + ArgumentNullException exception = Assert.Throws( + () => retirable.Retire(null!)); + + Assert.That(exception.ParamName, Is.EqualTo("error")); + } + + [Test] + public void RetireMarksTheItemRetiredAndRecordsTheError() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + var error = new ServiceResult(StatusCodes.BadNodeIdUnknown); + + Assert.That(retirable.IsRetired, Is.False); + Assert.That(retirable.RetirementError, Is.Null); + + retirable.Retire(error); + + Assert.That(retirable.IsRetired, Is.True); + Assert.That(retirable.RetirementError, Is.SameAs(error)); + } + + [Test] + public void RetireIsIdempotentAndKeepsTheFirstError() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + var first = new ServiceResult(StatusCodes.BadNodeIdUnknown); + var second = new ServiceResult(StatusCodes.BadOutOfService); + + retirable.Retire(first); + retirable.Retire(second); + + Assert.That(retirable.RetirementError, Is.SameAs(first)); + } + + [Test] + public void RetireQueuesTheTerminalStatusOnADataChangeItem() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + Assert.That(item.IsReadyToPublish, Is.True); + } + + [Test] + public void RetireNotifiesTheSubscriptionThatTheItemIsReadyToPublish() + { + using MonitoredItem item = CreateDataChangeItem(); + var subscription = new Mock(); + item.SubscriptionCallback = subscription.Object; + IRetirableMonitoredItem retirable = item; + + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + subscription.Verify(s => s.ItemReadyToPublish(item), Times.Once); + } + + [Test] + public void RetireLeavesAnEventItemWithNothingToPublish() + { + using MonitoredItem item = CreateEventItem(); + IRetirableMonitoredItem retirable = item; + + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + Assert.That(retirable.IsRetired, Is.True); + Assert.That(item.IsReadyToPublish, Is.False); + Assert.That(item.IsReadyToTrigger, Is.False); + } + + [Test] + public void QueueValueIsIgnoredAfterRetirement() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + Assert.That( + () => item.QueueValue(new DataValue(new Variant(42)), null, true), + Throws.Nothing, + "a retired item must silently drop late values instead of throwing"); + } + + [Test] + public void QueueEventFieldsIsIgnoredAfterRetirement() + { + using MonitoredItem item = CreateEventItem(); + IRetirableMonitoredItem retirable = item; + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + Assert.That( + () => item.QueueEvent(new EventFieldList()), + Throws.Nothing, + "a retired item must silently drop late events instead of throwing"); + Assert.That(item.IsReadyToPublish, Is.False); + } + + [Test] + public void QueueEventInstanceIsIgnoredAfterRetirement() + { + using MonitoredItem item = CreateEventItem(); + IRetirableMonitoredItem retirable = item; + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + Assert.That( + () => item.QueueEvent(new Mock().Object, true), + Throws.Nothing); + Assert.That(item.IsReadyToPublish, Is.False); + } + + [Test] + public void QueueEventRejectsANullInstance() + { + using MonitoredItem item = CreateEventItem(); + + ArgumentNullException exception = Assert.Throws( + () => item.QueueEvent(null!, false)); + + Assert.That(exception.ParamName, Is.EqualTo("instance")); + } + + [Test] + public void DetachOwnerRequiresRetirementFirst() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + + Assert.That( + () => retirable.DetachOwner(), + Throws.InstanceOf()); + } + + [Test] + public void DetachOwnerReleasesTheNodeManagerReferencesAfterRetirement() + { + var nodeManager = new Mock().Object; + using MonitoredItem item = CreateDataChangeItem(nodeManager, new object()); + IRetirableMonitoredItem retirable = item; + + Assert.That(item.NodeManager, Is.SameAs(nodeManager)); + Assert.That(item.ManagerHandle, Is.Not.Null); + + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + retirable.DetachOwner(); + + Assert.That(item.NodeManager, Is.Null); + Assert.That(item.ManagerHandle, Is.Null); + } + + [Test] + public void DetachOwnerIsIdempotentAfterRetirement() + { + using MonitoredItem item = CreateDataChangeItem(); + IRetirableMonitoredItem retirable = item; + retirable.Retire(new ServiceResult(StatusCodes.BadNodeIdUnknown)); + + retirable.DetachOwner(); + + Assert.That(() => retirable.DetachOwner(), Throws.Nothing); + } + + private MonitoredItem CreateDataChangeItem( + IAsyncNodeManager nodeManager = null, + object managerHandle = null) + { + return CreateItem( + new ReadValueId + { + NodeId = new NodeId("Retirement", 2), + AttributeId = Attributes.Value + }, + filter: null, + nodeManager, + managerHandle); + } + + private MonitoredItem CreateEventItem() + { + var filter = new EventFilter(); + filter.AddSelectClause( + new NodeId(ObjectTypes.BaseEventType), + new QualifiedName(BrowseNames.EventId)); + return CreateItem( + new ReadValueId + { + NodeId = ObjectIds.Server, + AttributeId = Attributes.EventNotifier + }, + filter, + nodeManager: null, + managerHandle: null); + } + + private MonitoredItem CreateItem( + ReadValueId itemToMonitor, + MonitoringFilter filter, + IAsyncNodeManager nodeManager, + object managerHandle) + { + using var queueFactory = new MonitoredItemQueueFactory(m_telemetry); + var server = new Mock(); + server.Setup(s => s.Telemetry).Returns(m_telemetry); + server.Setup(s => s.NamespaceUris).Returns(new NamespaceTable()); + server.Setup(s => s.TypeTree).Returns(new TypeTable(new NamespaceTable())); + server.Setup(s => s.MonitoredItemQueueFactory).Returns(queueFactory); + server.Setup(s => s.SubscriptionStore).Returns(Mock.Of()); + + return new MonitoredItem( + server.Object, + nodeManager ?? new Mock().Object, + managerHandle!, + subscriptionId: 1, + id: 2, + itemToMonitor: itemToMonitor, + diagnosticsMasks: DiagnosticsMasks.None, + timestampsToReturn: TimestampsToReturn.Both, + MonitoringMode.Reporting, + clientHandle: 3, + originalFilter: filter, + filterToUse: filter, + range: null, + samplingInterval: 1000, + queueSize: 1, + discardOldest: true, + sourceSamplingInterval: 1000); + } + + private ITelemetryContext m_telemetry; + } +} diff --git a/tests/Opc.Ua.Server.Tests/NodeManager/AsyncNodeManagerAdapterDelegationTests.cs b/tests/Opc.Ua.Server.Tests/NodeManager/AsyncNodeManagerAdapterDelegationTests.cs index eb1e2f67d0..ba2e8036cf 100644 --- a/tests/Opc.Ua.Server.Tests/NodeManager/AsyncNodeManagerAdapterDelegationTests.cs +++ b/tests/Opc.Ua.Server.Tests/NodeManager/AsyncNodeManagerAdapterDelegationTests.cs @@ -35,6 +35,8 @@ using System.Threading.Tasks; using Moq; using NUnit.Framework; +using Opc.Ua.Sample; +using Opc.Ua.Tests; namespace Opc.Ua.Server.Tests.NodeManager { @@ -219,6 +221,11 @@ await adapter.TransferMonitoredItemsAsync( values.MonitoredItems, values.TransferProcessed, values.TransferErrors).ConfigureAwait(false); + await adapter.RollbackMonitoredItemsTransferAsync( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors).ConfigureAwait(false); await adapter.SetMonitoringModeAsync( values.Context, MonitoringMode.Reporting, @@ -382,6 +389,11 @@ await adapter.TransferMonitoredItemsAsync( values.MonitoredItems, values.TransferProcessed, values.TransferErrors).ConfigureAwait(false); + await adapter.RollbackMonitoredItemsTransferAsync( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors).ConfigureAwait(false); await adapter.SetMonitoringModeAsync( values.Context, MonitoringMode.Reporting, @@ -419,6 +431,89 @@ await adapter.ValidateRolePermissionsAsync( manager.VerifyAll(); } + [Test] + public async Task RollbackMonitoredItemsTransferAsyncForwardsToPlainSyncManagerAsync() + { + var manager = new Mock(MockBehavior.Strict); + using var adapter = new AsyncNodeManagerAdapter(manager.Object); + TestValues values = CreateTestValues(); + var options = new MonitoredItemTransferOptions { DeferInitialValues = true }; + manager.Setup(m => m.RollbackMonitoredItemsTransfer( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors, + options)); + + await adapter.RollbackMonitoredItemsTransferAsync( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors, + options).ConfigureAwait(false); + + manager.VerifyAll(); + } + + [Test] + public async Task RollbackMonitoredItemsTransferAsyncForwardsToNodeManager2Async() + { + var manager = new Mock(MockBehavior.Strict); + using var adapter = new AsyncNodeManagerAdapter(manager.Object); + TestValues values = CreateTestValues(); + var options = new MonitoredItemTransferOptions { DeferInitialValues = true }; + manager.Setup(m => m.RollbackMonitoredItemsTransfer( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors, + options)); + + await adapter.RollbackMonitoredItemsTransferAsync( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors, + options).ConfigureAwait(false); + + manager.VerifyAll(); + } + + [Test] + public async Task RollbackMonitoredItemsTransferAsyncFiresSampleNodeManagerHookAsync() + { + var server = new Mock(); + var namespaceUris = new NamespaceTable(); + server.SetupGet(s => s.NamespaceUris).Returns(namespaceUris); + server.SetupGet(s => s.ServerUris).Returns(new StringTable()); + server.SetupGet(s => s.TypeTree).Returns(new TypeTable(namespaceUris)); + server.SetupGet(s => s.Telemetry).Returns(NUnitTelemetryContext.Create()); + server.SetupGet(s => s.DefaultSystemContext) + .Returns(new ServerSystemContext(server.Object, NewOpContext(RequestType.Unknown))); + var manager = new TestSampleNodeManager(server.Object); + using var adapter = new AsyncNodeManagerAdapter(manager); + var item = new Mock(); + item.SetupGet(monitoredItem => monitoredItem.ManagerHandle) + .Returns(new MonitoredNode(server.Object, adapter, new BaseDataVariableState(null))); + IList monitoredItems = [item.Object]; + IList processedItems = [false]; + IList errors = [ServiceResult.Good]; + + await adapter.RollbackMonitoredItemsTransferAsync( + NewOpContext(RequestType.Unknown), + monitoredItems, + processedItems, + errors).ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(manager.RolledBackItems, Has.Count.EqualTo(1)); + Assert.That(manager.RolledBackItems[0], Is.SameAs(item.Object)); + Assert.That(processedItems[0], Is.True); + Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + }); + } + [Test] public async Task ExtendedSyncFallbacksHandleLegacyNodeManagerAsync() { @@ -678,6 +773,15 @@ private static void SetupAsyncFacet(Mock manager, TestVal values.MonitoredItems, values.TransferProcessed, values.TransferErrors, + It.IsAny(), + It.IsAny())) + .Returns(default(ValueTask)); + manager.Setup(m => m.RollbackMonitoredItemsTransferAsync( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors, + It.IsAny(), It.IsAny())) .Returns(default(ValueTask)); manager.Setup(m => m.SetMonitoringModeAsync( @@ -825,6 +929,12 @@ private static void SetupSyncFallback(Mock manager, TestValues va values.MonitoredItems, values.TransferProcessed, values.TransferErrors)); + manager.Setup(m => m.RollbackMonitoredItemsTransfer( + values.Context, + values.MonitoredItems, + values.TransferProcessed, + values.TransferErrors, + It.IsAny())); manager.Setup(m => m.SetMonitoringMode( values.Context, MonitoringMode.Reporting, @@ -975,5 +1085,25 @@ private sealed class TestValues public ServiceResult RoleResult { get; set; } = null!; } + + private sealed class TestSampleNodeManager : SampleNodeManager + { + public TestSampleNodeManager(IServerInternal server) + : base(server) + { + } + + public IList RolledBackItems { get; } = []; + + protected override void OnMonitoredItemsTransferRolledBack( + ServerSystemContext context, + IList monitoredItems) + { + foreach (IMonitoredItem monitoredItem in monitoredItems) + { + RolledBackItems.Add(monitoredItem); + } + } + } } } diff --git a/tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs b/tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs index c38f1621dd..03d056ad7a 100644 --- a/tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs +++ b/tests/Opc.Ua.Server.Tests/NodeManager/MasterNodeManagerDeterministicTests.cs @@ -29,6 +29,7 @@ #nullable enable +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -138,7 +139,7 @@ public void BrowseAsync_NullContext_ThrowsArgumentNullException() new ViewDescription(), 0u, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -157,7 +158,7 @@ public void BrowseAsync_UnknownViewId_ThrowsBadViewIdUnknown() view, 0u, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property(nameof(ServiceResultException.StatusCode)) .EqualTo(StatusCodes.BadViewIdUnknown)); @@ -174,7 +175,7 @@ public async Task BrowseAsync_EmptyBatch_ReturnsEmptyResultsAsync() new ViewDescription(), 0u, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -196,7 +197,7 @@ public async Task BrowseAsync_UnknownNode_ReturnsBadNodeIdUnknownAsync() new ViewDescription(), 0u, new BrowseDescription[] { nodeToBrowse }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); @@ -223,7 +224,7 @@ public async Task BrowseAsyncCompletedBrowseReturnsNullContinuationPointAsync() new ViewDescription(), 0u, new BrowseDescription[] { nodeToBrowse }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); @@ -248,7 +249,7 @@ public async Task BrowseAsync_UnknownReferenceType_ReturnsBadReferenceTypeIdInva new ViewDescription(), 0u, new BrowseDescription[] { nodeToBrowse }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadReferenceTypeIdInvalid)); } @@ -270,7 +271,7 @@ public async Task BrowseAsync_InvalidBrowseDirection_ReturnsBadBrowseDirectionIn new ViewDescription(), 0u, new BrowseDescription[] { nodeToBrowse }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadBrowseDirectionInvalid)); } @@ -297,7 +298,7 @@ public async Task BrowseAsync_WhenNoContinuationPointCanBeAssigned_ReturnsBadNoC new ViewDescription(), 1u, new BrowseDescription[] { nodeToBrowse }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNoContinuationPoints)); @@ -319,7 +320,7 @@ public void BrowseNextAsync_NullContext_ThrowsArgumentNullException() null!, false, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -334,7 +335,7 @@ public async Task BrowseNextAsync_EmptyBatch_ReturnsEmptyResultsAsync() ctx, false, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -354,7 +355,7 @@ public async Task BrowseNextAsync_InvalidContinuationPoint_ReturnsBadContinuatio ctx, false, continuationPoints, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadContinuationPointInvalid)); @@ -376,7 +377,7 @@ public async Task BrowseNextAsync_ReleaseInvalidContinuationPoint_ReturnsGoodAsy ctx, true, continuationPoints, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.EqualTo(1)); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); @@ -403,7 +404,7 @@ public async Task BrowseNextAsync_WhenNoContinuationPointCanBeAssigned_ReturnsBa new ViewDescription(), 1u, new BrowseDescription[] { nodeToBrowse }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(firstResults.Count, Is.EqualTo(1)); Assert.That(firstResults[0].StatusCode, Is.EqualTo(StatusCodes.Good)); @@ -413,7 +414,7 @@ public async Task BrowseNextAsync_WhenNoContinuationPointCanBeAssigned_ReturnsBa ctx, false, new ByteString[] { firstResults[0].ContinuationPoint }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(nextResults.Count, Is.EqualTo(1)); Assert.That(nextResults[0].StatusCode, Is.EqualTo(StatusCodes.Good)); @@ -425,7 +426,7 @@ public async Task BrowseNextAsync_WhenNoContinuationPointCanBeAssigned_ReturnsBa ctx, false, new ByteString[] { nextResults[0].ContinuationPoint }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(finalResults.Count, Is.EqualTo(1)); Assert.That(finalResults[0].StatusCode, Is.EqualTo(StatusCodes.BadNoContinuationPoints)); @@ -446,7 +447,7 @@ public async Task TranslateBrowsePathsToNodeIdsAsync_EmptyBatch_ReturnsEmptyResu (ArrayOf results, _) = await sut.TranslateBrowsePathsToNodeIdsAsync( ctx, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -472,7 +473,7 @@ public async Task TranslateBrowsePathsToNodeIdsAsync_UnknownStartingNode_Returns (ArrayOf results, _) = await sut.TranslateBrowsePathsToNodeIdsAsync( ctx, new BrowsePath[] { browsePath }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } @@ -492,7 +493,7 @@ public async Task TranslateBrowsePathsToNodeIdsAsync_EmptyRelativePath_ReturnsBa (ArrayOf results, _) = await sut.TranslateBrowsePathsToNodeIdsAsync( ctx, new BrowsePath[] { browsePath }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNothingToDo)); } @@ -518,7 +519,7 @@ public async Task TranslateBrowsePathsToNodeIdsAsync_NullTargetName_ReturnsBadBr (ArrayOf results, _) = await sut.TranslateBrowsePathsToNodeIdsAsync( ctx, new BrowsePath[] { browsePath }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadBrowseNameInvalid)); } @@ -535,7 +536,7 @@ public void ReadAsync_NegativeMaxAge_ThrowsBadMaxAgeInvalid() -1.0, TimestampsToReturn.Neither, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property(nameof(ServiceResultException.StatusCode)) .EqualTo(StatusCodes.BadMaxAgeInvalid)); @@ -553,7 +554,7 @@ public void ReadAsync_InvalidTimestampsToReturn_ThrowsBadTimestampsToReturnInval 0.0, (TimestampsToReturn)99, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property(nameof(ServiceResultException.StatusCode)) .EqualTo(StatusCodes.BadTimestampsToReturnInvalid)); @@ -570,7 +571,7 @@ public async Task ReadAsync_EmptyBatch_ReturnsEmptyResultsAsync() 0.0, TimestampsToReturn.Neither, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(values.Count, Is.Zero); } @@ -586,7 +587,7 @@ public async Task ReadAsync_NullNodeId_ReturnsBadNodeIdInvalidAsync() 0.0, TimestampsToReturn.Neither, new ReadValueId[] { new() { AttributeId = Attributes.Value } }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(values[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); } @@ -604,7 +605,7 @@ public async Task ReadAsync_InvalidAttributeId_ReturnsBadAttributeIdInvalidAsync 0.0, TimestampsToReturn.Neither, new ReadValueId[] { readValueId }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(values[0].StatusCode, Is.EqualTo(StatusCodes.BadAttributeIdInvalid)); } @@ -622,7 +623,7 @@ public async Task ReadAsync_UnknownNode_ReturnsBadNodeIdUnknownAsync() 0.0, TimestampsToReturn.Neither, new ReadValueId[] { readValueId }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(values[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } @@ -636,7 +637,7 @@ public void WriteAsync_NullContext_ThrowsArgumentNullException() async () => await sut.WriteAsync( null!, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -650,7 +651,7 @@ public async Task WriteAsync_EmptyBatch_ReturnsEmptyResultsAsync() (ArrayOf results, _) = await sut.WriteAsync( ctx, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -664,7 +665,7 @@ public async Task WriteAsync_NullNodeId_ReturnsBadNodeIdInvalidAsync() (ArrayOf results, _) = await sut.WriteAsync( ctx, new WriteValue[] { new() { AttributeId = Attributes.Value } }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0], Is.EqualTo(StatusCodes.BadNodeIdInvalid)); } @@ -685,7 +686,7 @@ public async Task WriteAsync_UnknownNode_ReturnsBadNodeIdUnknownAsync() (ArrayOf results, _) = await sut.WriteAsync( ctx, new WriteValue[] { writeValue }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0], Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } @@ -703,7 +704,7 @@ public void HistoryReadAsync_NullDetails_ThrowsBadHistoryOperationInvalid() TimestampsToReturn.Neither, false, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property(nameof(ServiceResultException.StatusCode)) .EqualTo(StatusCodes.BadHistoryOperationInvalid)); @@ -721,7 +722,7 @@ public async Task HistoryReadAsync_EmptyBatch_ReturnsEmptyResultsAsync() TimestampsToReturn.Neither, false, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -738,7 +739,7 @@ public async Task HistoryReadAsync_NullNodeId_ReturnsBadNodeIdInvalidAsync() TimestampsToReturn.Neither, false, new HistoryReadValueId[] { new() }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); } @@ -757,7 +758,7 @@ public async Task HistoryReadAsync_UnknownNode_ReturnsBadNodeIdUnknownAsync() TimestampsToReturn.Neither, false, new HistoryReadValueId[] { historyReadValueId }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } @@ -771,7 +772,7 @@ public async Task HistoryUpdateAsync_EmptyBatch_ReturnsEmptyResultsAsync() (ArrayOf results, _) = await sut.HistoryUpdateAsync( ctx, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -790,7 +791,7 @@ public async Task HistoryUpdateAsync_NullNodeId_ReturnsBadNodeIdInvalidAsync() (ArrayOf results, _) = await sut.HistoryUpdateAsync( ctx, new ExtensionObject[] { details }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); } @@ -810,7 +811,7 @@ public async Task HistoryUpdateAsync_UnknownNode_ReturnsBadNodeIdUnknownAsync() (ArrayOf results, _) = await sut.HistoryUpdateAsync( ctx, new ExtensionObject[] { details }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } @@ -824,7 +825,7 @@ public void CallAsync_NullContext_ThrowsArgumentNullException() async () => await sut.CallAsync( null!, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -838,7 +839,7 @@ public async Task CallAsync_EmptyBatch_ReturnsEmptyResultsAsync() (ArrayOf results, _) = await sut.CallAsync( ctx, System.Array.Empty().ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results.Count, Is.Zero); } @@ -852,7 +853,7 @@ public async Task CallAsync_NullObjectId_ReturnsBadNodeIdInvalidAsync() (ArrayOf results, _) = await sut.CallAsync( ctx, new CallMethodRequest[] { new() }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); } @@ -868,7 +869,7 @@ public async Task CallAsync_NullMethodId_ReturnsBadMethodInvalidAsync() (ArrayOf results, _) = await sut.CallAsync( ctx, new CallMethodRequest[] { request }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadMethodInvalid)); } @@ -888,7 +889,7 @@ public async Task CallAsync_UnknownObject_ReturnsBadNodeIdUnknownAsync() (ArrayOf results, _) = await sut.CallAsync( ctx, new CallMethodRequest[] { request }.ToArrayOf(), - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(results[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } @@ -909,7 +910,7 @@ public void CreateMonitoredItemsAsync_NullContext_ThrowsArgumentNullException() [], [], false, - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -931,7 +932,7 @@ public void CreateMonitoredItemsAsync_NullErrors_ThrowsArgumentNullException() [], [], false, - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("errors")); } @@ -953,7 +954,7 @@ public void CreateMonitoredItemsAsync_NullMonitoredItems_ThrowsArgumentNullExcep [], null!, false, - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("monitoredItems")); } @@ -975,7 +976,7 @@ public void CreateMonitoredItemsAsync_NegativePublishingInterval_ThrowsArgumentO [], [], false, - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("publishingInterval")); } @@ -997,7 +998,7 @@ public void CreateMonitoredItemsAsync_InvalidTimestampsToReturn_ThrowsBadTimesta [], [], false, - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property(nameof(ServiceResultException.StatusCode)) .EqualTo(StatusCodes.BadTimestampsToReturnInvalid)); @@ -1016,7 +1017,7 @@ public void ModifyMonitoredItemsAsync_NullContext_ThrowsArgumentNullException() System.Array.Empty().ToArrayOf(), [], [], - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -1035,7 +1036,7 @@ public void ModifyMonitoredItemsAsync_InvalidTimestampsToReturn_ThrowsBadTimesta System.Array.Empty().ToArrayOf(), [], [], - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property(nameof(ServiceResultException.StatusCode)) .EqualTo(StatusCodes.BadTimestampsToReturnInvalid)); @@ -1052,7 +1053,7 @@ public void DeleteMonitoredItemsAsync_NullContext_ThrowsArgumentNullException() 1u, [], [], - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -1072,7 +1073,7 @@ await sut.DeleteMonitoredItemsAsync( 1u, itemsToDelete, errors, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.BadMonitoredItemIdInvalid)); } @@ -1090,7 +1091,7 @@ await sut.DeleteMonitoredItemsAsync( 1u, itemsToDelete, errors, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.Good)); } @@ -1120,7 +1121,7 @@ await sut.ModifyMonitoredItemsAsync( new[] { request }.ToArrayOf(), errors, filterResults, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); Assert.That(request.Processed, Is.True); @@ -1137,7 +1138,7 @@ public void SetMonitoringModeAsync_NullContext_ThrowsArgumentNullException() MonitoringMode.Reporting, [], [], - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -1157,7 +1158,7 @@ await sut.SetMonitoringModeAsync( MonitoringMode.Reporting, itemsToModify, errors, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.BadMonitoredItemIdInvalid)); } @@ -1174,7 +1175,7 @@ await sut.SetMonitoringModeAsync( MonitoringMode.Reporting, [item], errors, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.Good)); Assert.That(item.MonitoringMode, Is.EqualTo(MonitoringMode.Reporting)); @@ -1192,7 +1193,7 @@ public void TransferMonitoredItemsAsync_NullContext_ThrowsArgumentNullException( false, [], [], - CancellationToken.None).ConfigureAwait(false), + cancellationToken: CancellationToken.None).ConfigureAwait(false), Throws.TypeOf() .With.Property("ParamName").EqualTo("context")); } @@ -1211,7 +1212,7 @@ await sut.TransferMonitoredItemsAsync( false, monitoredItems, errors, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.BadMonitoredItemIdInvalid)); } @@ -1228,12 +1229,195 @@ await sut.TransferMonitoredItemsAsync( true, [item], errors, - CancellationToken.None).ConfigureAwait(false); + cancellationToken: CancellationToken.None).ConfigureAwait(false); Assert.That(errors[0].StatusCode, Is.EqualTo(StatusCodes.Good)); Assert.That(Publish(item).Peek().Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } + + [Test] + public async Task TransferMonitoredItemsAsyncFailureRollsBackOwnerAndResendAsync() + { + var sourceSession = new Mock(); + sourceSession.SetupGet(session => session.Id).Returns(new NodeId(Guid.NewGuid())); + sourceSession.SetupGet(session => session.EffectiveIdentity) + .Returns(new Mock().Object); + sourceSession.SetupGet(session => session.PreferredLocales).Returns([]); + var destinationSession = new Mock(); + destinationSession.SetupGet(session => session.Id).Returns(new NodeId(Guid.NewGuid())); + destinationSession.SetupGet(session => session.EffectiveIdentity) + .Returns(new Mock().Object); + destinationSession.SetupGet(session => session.PreferredLocales).Returns([]); + var owner = new Mock(); + var laterOwner = new Mock(); + ISession observedOwner = sourceSession.Object; + ISession observedLaterOwner = sourceSession.Object; + int rollbackCalls = 0; + int laterRollbackCalls = 0; + int ownerForwardCalls = 0; + int laterForwardCalls = 0; + bool failNextDestinationCallback = true; + + owner.Setup(nodeManager => nodeManager.TransferMonitoredItemsAsync( + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Callback, IList, IList, MonitoredItemTransferOptions, CancellationToken>( + (context, sendInitialValues, monitoredItems, processedItems, errors, transferOptions, _) => + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (!processedItems[ii] && + ReferenceEquals(monitoredItems[ii].NodeManager, owner.Object)) + { + processedItems[ii] = true; + errors[ii] = ServiceResult.Good; + if (sendInitialValues) + { + monitoredItems[ii].SetupResendDataTrigger(); + } + } + } + observedOwner = context.Session; + ownerForwardCalls++; + }) + .Returns(default(ValueTask)); + laterOwner.Setup(nodeManager => nodeManager.TransferMonitoredItemsAsync( + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Callback, IList, IList, MonitoredItemTransferOptions, CancellationToken>( + (context, sendInitialValues, monitoredItems, processedItems, errors, transferOptions, _) => + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (!processedItems[ii] && + ReferenceEquals(monitoredItems[ii].NodeManager, laterOwner.Object)) + { + processedItems[ii] = true; + errors[ii] = ServiceResult.Good; + if (sendInitialValues) + { + monitoredItems[ii].SetupResendDataTrigger(); + } + } + } + observedLaterOwner = context.Session; + laterForwardCalls++; + if (ReferenceEquals(context.Session, destinationSession.Object) && + failNextDestinationCallback) + { + failNextDestinationCallback = false; + throw new InvalidOperationException("Later owner failed."); + } + }) + .Returns(default(ValueTask)); + + owner.Setup(nodeManager => nodeManager.RollbackMonitoredItemsTransferAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Callback, IList, IList, MonitoredItemTransferOptions, CancellationToken>( + (context, monitoredItems, processedItems, errors, _, _) => + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (!processedItems[ii] && + ReferenceEquals(monitoredItems[ii].NodeManager, owner.Object)) + { + processedItems[ii] = true; + errors[ii] = ServiceResult.Good; + } + } + observedOwner = context.Session; + rollbackCalls++; + }) + .Returns(default(ValueTask)); + laterOwner.Setup(nodeManager => nodeManager.RollbackMonitoredItemsTransferAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Callback, IList, IList, MonitoredItemTransferOptions, CancellationToken>( + (context, monitoredItems, processedItems, errors, _, _) => + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (!processedItems[ii] && + ReferenceEquals(monitoredItems[ii].NodeManager, laterOwner.Object)) + { + processedItems[ii] = true; + errors[ii] = ServiceResult.Good; + } + } + observedLaterOwner = context.Session; + laterRollbackCalls++; + }) + .Returns(default(ValueTask)); + + using var sut = new MasterNodeManager( + m_server.CurrentInstance, + m_fixture.Config, + null, + owner.Object, + laterOwner.Object); + using var item = CreateMonitoredItem(owner.Object, sourceSession.Object, 2, 3, 42); + using var laterItem = CreateMonitoredItem(laterOwner.Object, sourceSession.Object, 4, 5, 84); + + var failedErrors = new List { null!, null! }; + Assert.ThrowsAsync( + async () => await sut.TransferMonitoredItemsAsync( + new OperationContext(destinationSession.Object, DiagnosticsMasks.None), + true, + [item, laterItem], + failedErrors, + cancellationToken: CancellationToken.None).ConfigureAwait(false)); + + Assert.Multiple(() => + { + Assert.That(observedOwner, Is.SameAs(sourceSession.Object)); + Assert.That(observedLaterOwner, Is.SameAs(destinationSession.Object)); + Assert.That(ownerForwardCalls, Is.EqualTo(1)); + Assert.That(laterForwardCalls, Is.EqualTo(1)); + Assert.That(rollbackCalls, Is.EqualTo(1)); + Assert.That(laterRollbackCalls, Is.Zero); + Assert.That(item.IsResendData, Is.False); + Assert.That(laterItem.IsResendData, Is.False); + }); + + var retryErrors = new List { null!, null! }; + await sut.TransferMonitoredItemsAsync( + new OperationContext(destinationSession.Object, DiagnosticsMasks.None), + false, + [item, laterItem], + retryErrors, + cancellationToken: CancellationToken.None).ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(observedOwner, Is.SameAs(destinationSession.Object)); + Assert.That(observedLaterOwner, Is.SameAs(destinationSession.Object)); + Assert.That(item.IsResendData, Is.False); + Assert.That(laterItem.IsResendData, Is.False); + Assert.That(Publish(item), Is.Empty); + Assert.That(Publish(laterItem), Is.Empty); + }); + } + private MasterNodeManager CreateMasterNodeManager() { return new MasterNodeManager( @@ -1272,6 +1456,44 @@ private MonitoredItem CreateDetachedMonitoredItem( return monitoredItem; } + + private MonitoredItem CreateMonitoredItem( + IAsyncNodeManager nodeManager, + ISession session, + uint id, + uint clientHandle, + int value) + { + var monitoredItem = new MonitoredItem( + m_server.CurrentInstance, + nodeManager, + new object(), + subscriptionId: 1, + id: id, + itemToMonitor: new ReadValueId + { + NodeId = new NodeId($"Transactional{id}", 2), + AttributeId = Attributes.Value + }, + diagnosticsMasks: DiagnosticsMasks.None, + timestampsToReturn: TimestampsToReturn.Both, + monitoringMode: MonitoringMode.Reporting, + clientHandle: clientHandle, + originalFilter: null, + filterToUse: null, + range: null, + samplingInterval: 1000, + queueSize: 1, + discardOldest: true, + sourceSamplingInterval: 1000); + var subscription = new Mock(); + subscription.SetupGet(value => value.Session).Returns(session); + monitoredItem.SubscriptionCallback = subscription.Object; + monitoredItem.QueueValue(new DataValue(new Variant(value)), null); + Assert.That(Publish(monitoredItem), Has.Count.EqualTo(1)); + return monitoredItem; + } + private Queue Publish(MonitoredItem item) { var notifications = new Queue(); diff --git a/tests/Opc.Ua.Server.Tests/NodeManager/NodeManagerLifecycleTests.cs b/tests/Opc.Ua.Server.Tests/NodeManager/NodeManagerLifecycleTests.cs index eedd3abaa6..7a34a30a3c 100644 --- a/tests/Opc.Ua.Server.Tests/NodeManager/NodeManagerLifecycleTests.cs +++ b/tests/Opc.Ua.Server.Tests/NodeManager/NodeManagerLifecycleTests.cs @@ -29,8 +29,10 @@ using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; +using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading; @@ -40,6 +42,7 @@ using NUnit.Framework; using Opc.Ua.Server.RuntimeNodeSet; using Opc.Ua.Server.TestFramework; +using Opc.Ua.Security.Certificates; using Opc.Ua.Tests; using Quickstarts.ReferenceServer; @@ -78,6 +81,7 @@ public sealed class NodeManagerLifecycleTests private const uint kRootNodeId = 8000; private const uint kValueNodeId = 8001; + private const uint kEuRangeNodeId = 8002; private const string kRootBrowseName = "LifecycleRoot"; private const string kValueBrowseName = "LifecycleValue"; private const int kGeneration1Value = 1; @@ -86,12 +90,20 @@ public sealed class NodeManagerLifecycleTests private const int kSecondRegistrationValue = 202; private string m_pkiRoot; - private ServerFixture m_fixture; - private ReferenceServer m_server; + private ServerFixture m_fixture; + private LifecycleTestServer m_server; private RequestHeader m_requestHeader; private SecureChannelContext m_secureChannelContext; private ILogger m_logger; + /// + /// Shared by every Session the fixture activates. A subscription transfer between + /// two anonymous Sessions is only permitted when both report the same client + /// ApplicationUri (OPC 10000-4 §5.7.3.1). + /// + private const string kClientApplicationUri = + "urn:localhost:opcfoundation.org:NodeManagerLifecycleTests"; + /// /// Starts a fresh and activates a session for the test. /// @@ -103,7 +115,7 @@ public async Task SetUpAsync() nameof(NodeManagerLifecycleTests), Guid.NewGuid().ToString("N")); - m_fixture = new ServerFixture(t => new ReferenceServer(t)) + m_fixture = new ServerFixture(t => new LifecycleTestServer(t)) { UriScheme = Utils.UriSchemeOpcTcp, SecurityNone = true, @@ -114,7 +126,9 @@ public async Task SetUpAsync() m_logger = NUnitTelemetryContext.Create().CreateLogger(); (m_requestHeader, m_secureChannelContext) = await m_server - .CreateAndActivateSessionAsync(TestContext.CurrentContext.Test.Name) + .CreateAndActivateSessionAsync( + TestContext.CurrentContext.Test.Name, + clientApplicationUri: kClientApplicationUri) .ConfigureAwait(false); m_requestHeader.Timestamp = DateTimeUtc.Now; } @@ -268,9 +282,10 @@ public async Task RegistrationsReturnsDefensiveSnapshotsAsync() /// /// A registration handle that is stale (superseded generation), foreign (unknown /// Id), or spoofed (wrong NodeManager reference for a known Id) - /// must be rejected by both Reload and Remove with the provider's ownership-mismatch - /// message, without invoking a replacement factory and without changing the current - /// generation's registration, routing, value, or namespace state. + /// must be rejected by Reload, ShadowReload, and Remove with the provider's + /// ownership-mismatch message, without invoking a replacement factory and without + /// changing the current generation's registration, routing, value, or namespace + /// state. /// /// /// Thrown when is not a supported value. @@ -281,6 +296,9 @@ public async Task RegistrationsReturnsDefensiveSnapshotsAsync() [TestCase(LifecycleOperation.Remove, MismatchKind.StaleGeneration)] [TestCase(LifecycleOperation.Remove, MismatchKind.ForeignId)] [TestCase(LifecycleOperation.Remove, MismatchKind.ForeignNodeManager)] + [TestCase(LifecycleOperation.ShadowReload, MismatchKind.StaleGeneration)] + [TestCase(LifecycleOperation.ShadowReload, MismatchKind.ForeignId)] + [TestCase(LifecycleOperation.ShadowReload, MismatchKind.ForeignNodeManager)] public async Task RegistrationIdentityMismatchIsRejectedWithoutChangingCurrentGenerationAsync( LifecycleOperation operation, MismatchKind mismatchKind) @@ -319,30 +337,51 @@ public async Task RegistrationIdentityMismatchIsRejectedWithoutChangingCurrentGe const string expectedMessage = "The registration is stale or is not owned by this lifecycle provider."; - if (operation == LifecycleOperation.Reload) - { - var replacementFactory = new Mock(MockBehavior.Strict); - - Assert.That( - async () => await m_server.NodeManagerLifecycle - .ReloadAsync(mismatched, replacementFactory.Object) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains(expectedMessage)); - - replacementFactory.Verify( - f => f.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny()), - Times.Never); - } - else + switch (operation) { - Assert.That( - async () => await m_server.NodeManagerLifecycle - .RemoveAsync(mismatched) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains(expectedMessage)); + case LifecycleOperation.Reload: + { + var replacementFactory = new Mock(MockBehavior.Strict); + + Assert.That( + async () => await m_server.NodeManagerLifecycle + .ReloadAsync(mismatched, replacementFactory.Object) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains(expectedMessage)); + + replacementFactory.Verify( + f => f.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Never); + break; + } + case LifecycleOperation.ShadowReload: + { + var replacementFactory = new Mock(MockBehavior.Strict); + + Assert.That( + async () => await m_server.NodeManagerLifecycle + .ShadowReloadAsync(mismatched, replacementFactory.Object) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains(expectedMessage)); + + replacementFactory.Verify( + f => f.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Never); + break; + } + default: + Assert.That( + async () => await m_server.NodeManagerLifecycle + .RemoveAsync(mismatched) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains(expectedMessage)); + break; } // The current registration/generation/routing/value/namespace state must be @@ -424,1164 +463,5918 @@ public void AddAsyncFromServiceDispatchScopeRejectsWithoutInvokingFactory() Times.Never); } - /// - /// When the replacement factory throws during Reload, the sentinel exception must - /// propagate unchanged, the current generation's registration, routing, value, and - /// namespace state must be entirely unaffected, and no replacement is published. - /// [Test] - public async Task ReloadAsyncWhenReplacementFactoryThrowsKeepsCurrentManagerAsync() + public async Task OptedInRuntimeNodeSetCanBeAddedFromRequestScopeAsync() { - NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) - .ConfigureAwait(false); - IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var valueNodeId = new NodeId(kValueNodeId, ns); - int namespaceCountBefore = server.NamespaceUris.Count; - uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + RuntimeNodeSetOptions options = CreateGenerationOptions(generation: 1); + options.AllowLifecycleFromRequestCallback = true; + NodeManagerRegistration registration = null; - var replacementFactory = new Mock(MockBehavior.Strict); - replacementFactory - .Setup(f => f.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Throws(new SentinelException()); - - Assert.That( - async () => await m_server.NodeManagerLifecycle - .ReloadAsync(original, replacementFactory.Object) - .ConfigureAwait(false), - Throws.TypeOf()); - - ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; - NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); - Assert.That(survivor, Is.Not.Null); - Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); - Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); - - Assert.That( - master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), - Is.EqualTo(1)); + try + { + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + registration = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(options) + .ConfigureAwait(false); - DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); - Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + Assert.That(registration, Is.Not.Null); + Assert.That(registration.Generation, Is.EqualTo(1)); + } + finally + { + server.RequestManager.RequestCompleted(context); + } - Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); - uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); - Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); + if (registration is not null) + { + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + } } - /// - /// When the replacement factory returns null during Reload, the provider - /// must reject it with its own diagnostic message after invoking the factory exactly - /// once, and the current generation's registration, routing, value, and namespace - /// state must be entirely unaffected. - /// [Test] - public async Task ReloadAsyncWhenReplacementFactoryReturnsNullKeepsCurrentManagerAsync() + public async Task OptedInRuntimeNodeSetCanBeReloadedAndRemovedFromRequestScopeAsync() { - NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + RuntimeNodeSetOptions initialOptions = CreateGenerationOptions(generation: 1); + initialOptions.AllowLifecycleFromRequestCallback = true; + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(initialOptions) .ConfigureAwait(false); - IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var valueNodeId = new NodeId(kValueNodeId, ns); - int namespaceCountBefore = server.NamespaceUris.Count; - uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); - var replacementFactory = new Mock(MockBehavior.Strict); - replacementFactory - .Setup(f => f.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync((IAsyncNodeManager)null!); + try + { + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + RuntimeNodeSetOptions replacement = CreateGenerationOptions(generation: 2); + replacement.AllowLifecycleFromRequestCallback = true; + registration = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync(registration, replacement) + .ConfigureAwait(false); + Assert.That(registration.Generation, Is.EqualTo(2)); - Assert.That( - async () => await m_server.NodeManagerLifecycle - .ReloadAsync(original, replacementFactory.Object) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "The replacement NodeManager factory returned null.")); + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + } + finally + { + server.RequestManager.RequestCompleted(context); + } - replacementFactory.Verify( - f => f.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny()), - Times.Once); + bool remainsRegistered = false; + foreach (NodeManagerRegistration candidate + in m_server.NodeManagerLifecycle.Registrations) + { + remainsRegistered |= candidate.Id == registration.Id; + } + Assert.That(remainsRegistered, Is.False); + } - ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; - NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); - Assert.That(survivor, Is.Not.Null); - Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); - Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); + [Test] + public async Task SimultaneousCallbackSafeAddsExcludePeerLifecycleWaitersAsync() + { + const string NamespaceUriA = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CallbackAddA"; + const string NamespaceUriB = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CallbackAddB"; + IServerInternal server = m_server.CurrentInstance; + Mock managerA = CreateLifecycleNodeManager(NamespaceUriA); + Mock managerB = CreateLifecycleNodeManager(NamespaceUriB); + var firstFactoryEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseFirstFactory = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var secondRequestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var factoryA = new CallbackSafeNodeManagerFactory( + [NamespaceUriA], + async (_, _, ct) => + { + firstFactoryEntered.TrySetResult(true); + await releaseFirstFactory.Task.WaitAsync(ct).ConfigureAwait(false); + return managerA.Object; + }); + var factoryB = new CallbackSafeNodeManagerFactory( + [NamespaceUriB], + (_, _, _) => new ValueTask(managerB.Object)); - Assert.That( - master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), - Is.EqualTo(1)); + Task addA = RunLifecycleCallbackRequestAsync( + server, + () => m_server.NodeManagerLifecycle.AddAsync(factoryA).AsTask()); + await firstFactoryEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Task addB = RunLifecycleCallbackRequestAsync( + server, + () => m_server.NodeManagerLifecycle.AddAsync(factoryB).AsTask(), + secondRequestEntered); + await secondRequestEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); - DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); - Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + try + { + await server.RequestManager + .WaitForCurrentRequestsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + } + finally + { + releaseFirstFactory.TrySetResult(true); + } - Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); - uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); - Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); + NodeManagerRegistration[] registrations = await Task + .WhenAll(addA, addB) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That(factoryA.CreateCount, Is.EqualTo(1)); + Assert.That(factoryB.CreateCount, Is.EqualTo(1)); + + foreach (NodeManagerRegistration registration in registrations) + { + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + } } - /// - /// When the replacement NodeManager's CreateAddressSpaceAsync fails during - /// Reload, the sentinel exception must propagate, the host's own cleanup path must - /// run exactly once (DeleteAddressSpaceAsync) followed by the lifecycle - /// provider's own disposal of the failed replacement (Dispose), the current - /// generation's registration/routing/value must be entirely unaffected, no - /// replacement is ever published or routed, and the namespace state is stable. - /// [Test] - public async Task ReloadAsyncWhenReplacementCreateAddressSpaceFailsKeepsCurrentManagerAsync() + public async Task SimultaneousCallbackSafeReloadsExcludePeerLifecycleWaitersAsync() { - NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) - .ConfigureAwait(false); - + const string NamespaceUriA = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CallbackReloadA"; + const string NamespaceUriB = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CallbackReloadB"; IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var valueNodeId = new NodeId(kValueNodeId, ns); - int namespaceCountBefore = server.NamespaceUris.Count; - uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); - - var failingManager = new Mock(); - failingManager - .Setup(m => m.CreateAddressSpaceAsync( - It.IsAny>>(), + Mock originalManagerA = + CreateLifecycleNodeManager(NamespaceUriA); + Mock originalManagerB = + CreateLifecycleNodeManager(NamespaceUriB); + originalManagerA + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), It.IsAny())) - .Throws(new SentinelException()); - var cleanupOrder = new List(); - failingManager - .Setup(m => m.DeleteAddressSpaceAsync(It.IsAny())) - .Callback(() => cleanupOrder.Add("DeleteAddressSpaceAsync")) - .Returns(new ValueTask()); - Mock failingManagerAsDisposable = failingManager.As(); - failingManagerAsDisposable - .Setup(d => d.Dispose()) - .Callback(() => cleanupOrder.Add("Dispose")); - - var replacementFactory = new Mock(); - replacementFactory - .Setup(f => f.CreateAsync( - It.IsAny(), - It.IsAny(), + .Returns(new ValueTask>([])); + originalManagerB + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), It.IsAny())) - .ReturnsAsync(failingManager.Object); - - Assert.That( - async () => await m_server.NodeManagerLifecycle - .ReloadAsync(original, replacementFactory.Object) - .ConfigureAwait(false), - Throws.TypeOf()); + .Returns(new ValueTask>([])); + NodeManagerRegistration originalA = await m_server.NodeManagerLifecycle + .AddAsync( + new CallbackSafeNodeManagerFactory( + [NamespaceUriA], + (_, _, _) => new ValueTask( + originalManagerA.Object))) + .ConfigureAwait(false); + NodeManagerRegistration originalB = await m_server.NodeManagerLifecycle + .AddAsync( + new CallbackSafeNodeManagerFactory( + [NamespaceUriB], + (_, _, _) => new ValueTask( + originalManagerB.Object))) + .ConfigureAwait(false); - failingManager.Verify( - m => m.DeleteAddressSpaceAsync(It.IsAny()), - Times.Once); - failingManagerAsDisposable.Verify(d => d.Dispose(), Times.Once); - string[] expectedCleanupOrder = ["DeleteAddressSpaceAsync", "Dispose"]; - Assert.That(cleanupOrder, Is.EqualTo(expectedCleanupOrder)); + Mock replacementManagerA = + CreateLifecycleNodeManager(NamespaceUriA); + Mock replacementManagerB = + CreateLifecycleNodeManager(NamespaceUriB); + var firstFactoryEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseFirstFactory = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var secondRequestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var replacementFactoryA = new CallbackSafeNodeManagerFactory( + [NamespaceUriA], + async (_, _, ct) => + { + firstFactoryEntered.TrySetResult(true); + await releaseFirstFactory.Task.WaitAsync(ct).ConfigureAwait(false); + return replacementManagerA.Object; + }); + var replacementFactoryB = new CallbackSafeNodeManagerFactory( + [NamespaceUriB], + (_, _, _) => new ValueTask( + replacementManagerB.Object)); - ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; - NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); - Assert.That(survivor, Is.Not.Null); - Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); - Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); + Task reloadA = RunLifecycleCallbackRequestAsync( + server, + () => m_server.NodeManagerLifecycle + .ReloadAsync(originalA, replacementFactoryA) + .AsTask()); + await firstFactoryEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Task reloadB = RunLifecycleCallbackRequestAsync( + server, + () => m_server.NodeManagerLifecycle + .ReloadAsync(originalB, replacementFactoryB) + .AsTask(), + secondRequestEntered); + await secondRequestEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); - Assert.That( - master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), - Is.EqualTo(1)); - Assert.That( - master.AsyncNodeManagers.Count(m => ReferenceEquals(m, failingManager.Object)), - Is.Zero); + try + { + await server.RequestManager + .WaitForCurrentRequestsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + } + finally + { + releaseFirstFactory.TrySetResult(true); + } - DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); - Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + NodeManagerRegistration[] replacements = await Task + .WhenAll(reloadA, reloadB) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That(replacementFactoryA.CreateCount, Is.EqualTo(1)); + Assert.That(replacementFactoryB.CreateCount, Is.EqualTo(1)); - Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); - uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); - Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); + foreach (NodeManagerRegistration replacement in replacements) + { + await m_server.NodeManagerLifecycle + .RemoveAsync(replacement) + .ConfigureAwait(false); + } } - /// - /// Reload transfers a compatible monitored item to the replacement generation - /// without changing its object identity or publishing a transient bad status. - /// [Test] - public async Task ReloadAsyncRetainsCompatibleMonitoredItemAsync() + public async Task ShutdownWaitsForSimultaneousCallbackSafeLifecycleOperationsAsync() { - NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) - .ConfigureAwait(false); - + const string NamespaceUriA = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CallbackShutdownA"; + const string NamespaceUriB = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CallbackShutdownB"; IServerInternal server = m_server.CurrentInstance; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var valueNodeId = new NodeId(kValueNodeId, ns); - - var services = new ServerTestServices(m_server, m_secureChannelContext); - (uint subscriptionId, uint monitoredItemId) = - await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) - .ConfigureAwait(false); - var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager - .GetSubscriptions() - .Single(candidate => candidate.Id == subscriptionId); - IMonitoredItem originalItem = subscription - .GetMonitoredItemsSnapshot(original.NodeManager) - .Single(); - ArrayOf acknowledgements = []; - + Mock managerA = CreateLifecycleNodeManager(NamespaceUriA); + Mock managerB = CreateLifecycleNodeManager(NamespaceUriB); + managerA.As(); + managerB.As(); + var firstFactoryEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseFirstFactory = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var secondRequestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var factoryA = new CallbackSafeNodeManagerFactory( + [NamespaceUriA], + async (_, _, ct) => + { + firstFactoryEntered.TrySetResult(true); + await releaseFirstFactory.Task.WaitAsync(ct).ConfigureAwait(false); + return managerA.Object; + }); + var factoryB = new CallbackSafeNodeManagerFactory( + [NamespaceUriB], + (_, _, _) => new ValueTask(managerB.Object)); + var lifecycle = new NodeManagerLifecycle(m_server); try { - (MonitoredItemNotification initial, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(initial.ClientHandle, Is.EqualTo(1)); - Assert.That(initial.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(initial.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); - - NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle - .ReloadRuntimeNodeSetAsync(original, CreateGenerationOptions(generation: 2)) + Task addA = RunLifecycleCallbackRequestAsync( + server, + () => lifecycle.AddAsync(factoryA).AsTask()); + await firstFactoryEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Task addB = RunLifecycleCallbackRequestAsync( + server, + () => lifecycle.AddAsync(factoryB).AsTask(), + secondRequestEntered); + await secondRequestEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await server.RequestManager + .WaitForCurrentRequestsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) .ConfigureAwait(false); - IMonitoredItem reloadedItem = subscription - .GetMonitoredItemsSnapshot(reloaded.NodeManager) - .Single(); - Assert.That(ReferenceEquals(reloadedItem, originalItem), Is.True); - Assert.That(reloadedItem.Id, Is.EqualTo(monitoredItemId)); + Task shutdown = lifecycle.BeginShutdownAsync(server).AsTask(); + Assert.That(shutdown.IsCompleted, Is.False); + releaseFirstFactory.TrySetResult(true); - (MonitoredItemNotification current, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(current.ClientHandle, Is.EqualTo(1)); - Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(current.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + await shutdown + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await AssertLifecycleOperationStopsForShutdownAsync(addA) + .ConfigureAwait(false); + await AssertLifecycleOperationStopsForShutdownAsync(addB) + .ConfigureAwait(false); + Assert.That( + factoryB.CreateCount, + Is.Zero, + "The queued callback operation must observe shutdown before creating a manager."); + + await lifecycle.CompleteShutdownAsync(server).ConfigureAwait(false); + Assert.That(lifecycle.Registrations, Is.Empty); } finally { - await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + releaseFirstFactory.TrySetResult(true); + lifecycle.Dispose(); } } - /// - /// Reload waits for an in-flight monitored-item mutation before transferring ownership. - /// - - /// - /// Reload detaches a dropped NodeId, publishes BadNodeIdUnknown once, and recovers - /// the same monitored item when a later generation restores the compatible node. - /// [Test] - public async Task ReloadAsyncDroppedNodeRecoversSameMonitoredItemAsync() + public async Task RequestInitiatedShutdownIsExcludedFromActiveLifecycleDrainAsync() { - NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) - .ConfigureAwait(false); - + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RequestShutdownDrain"; IServerInternal server = m_server.CurrentInstance; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var valueNodeId = new NodeId(kValueNodeId, ns); + Mock nodeManager = CreateLifecycleNodeManager(NamespaceUri); + Mock disposable = nodeManager.As(); + var factoryEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseFactory = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var shutdownStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(async ( + IServerInternal _, + ApplicationConfiguration _, + CancellationToken ct) => + { + factoryEntered.TrySetResult(true); + await releaseFactory.Task.WaitAsync(ct).ConfigureAwait(false); + return nodeManager.Object; + }); + m_server.AfterNodeManagerLifecycleShutdownStartedForTest = () => + shutdownStarted.TrySetResult(true); - var services = new ServerTestServices(m_server, m_secureChannelContext); - (uint subscriptionId, uint monitoredItemId) = - await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) - .ConfigureAwait(false); - var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager - .GetSubscriptions() - .Single(candidate => candidate.Id == subscriptionId); - IMonitoredItem originalItem = subscription - .GetMonitoredItemsSnapshot(original.NodeManager) - .Single(); - ArrayOf acknowledgements = []; + Task addTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle.AddAsync(factory.Object).AsTask()); + await factoryEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + m_requestHeader = null; + Task shutdownTask = RunWithoutExecutionContext(async () => + { + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + await m_server.ShutdownInternalsAsync().ConfigureAwait(false); + }); try { - (_, acknowledgements) = await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - - NodeManagerRegistration dropped = await m_server.NodeManagerLifecycle - .ReloadRuntimeNodeSetAsync(original, CreateDroppedGenerationOptions()) + await shutdownStarted.Task + .WaitAsync(TimeSpan.FromSeconds(10)) .ConfigureAwait(false); + Assert.That(addTask.IsCompleted, Is.False); + Assert.That(shutdownTask.IsCompleted, Is.False); - IMonitoredItem detachedItem = subscription - .GetRecoverableMonitoredItemsSnapshot([valueNodeId]) - .Single(); - Assert.That(ReferenceEquals(detachedItem, originalItem), Is.True); - - (MonitoredItemNotification bad, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(bad.ClientHandle, Is.EqualTo(1)); - Assert.That(bad.Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); - - NodeManagerRegistration recovered = await m_server.NodeManagerLifecycle - .ReloadRuntimeNodeSetAsync(dropped, CreateGenerationOptions(generation: 2)) + releaseFactory.TrySetResult(true); + await AssertLifecycleOperationStopsForShutdownAsync(addTask) + .ConfigureAwait(false); + await shutdownTask + .WaitAsync(TimeSpan.FromSeconds(10)) .ConfigureAwait(false); - - IMonitoredItem recoveredItem = subscription - .GetMonitoredItemsSnapshot(recovered.NodeManager) - .Single(); - Assert.That(ReferenceEquals(recoveredItem, originalItem), Is.True); - - (MonitoredItemNotification current, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(current.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); } finally { - await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + releaseFactory.TrySetResult(true); + m_server.AfterNodeManagerLifecycleShutdownStartedForTest = null; } + + nodeManager.Verify( + value => value.DeleteAddressSpaceAsync(CancellationToken.None), + Times.Once); + disposable.Verify(value => value.Dispose(), Times.Once); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); } - /// - /// Remove preserves the subscription and monitored item, publishes BadNodeIdUnknown, - /// recovers on a later add, and permits client-side deletion of the same item id. - /// [Test] - public async Task RemoveAsyncPublishesBadRecoversAndClientDeletesSameItemAsync() + public async Task RequestShutdownJoinerIsExcludedFromSharedShutdownDrainAsync() { - NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) - .ConfigureAwait(false); - + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RequestShutdownJoiner"; IServerInternal server = m_server.CurrentInstance; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var valueNodeId = new NodeId(kValueNodeId, ns); - var services = new ServerTestServices(m_server, m_secureChannelContext); - (uint subscriptionId, uint monitoredItemId) = - await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) - .ConfigureAwait(false); - var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager - .GetSubscriptions() - .Single(candidate => candidate.Id == subscriptionId); - IMonitoredItem originalItem = subscription - .GetMonitoredItemsSnapshot(original.NodeManager) - .Single(); - ArrayOf acknowledgements = []; + INodeManagerLifecycle lifecycle = m_server.NodeManagerLifecycle; + Mock nodeManager = CreateLifecycleNodeManager(NamespaceUri); + Mock disposable = nodeManager.As(); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(nodeManager.Object); + await lifecycle.AddAsync(factory.Object).ConfigureAwait(false); - try + var requestDrainReached = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequestDrain = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var joinerRegistered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var joiningRequestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var startJoiningShutdown = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + int joinerRegistrations = 0; + m_server.BeforeServerRequestDrainForTest = async () => { - (_, acknowledgements) = await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - - await m_server.NodeManagerLifecycle.RemoveAsync(original).ConfigureAwait(false); - - IMonitoredItem detachedItem = subscription - .GetRecoverableMonitoredItemsSnapshot([valueNodeId]) - .Single(); - Assert.That(ReferenceEquals(detachedItem, originalItem), Is.True); + requestDrainReached.TrySetResult(true); + await releaseRequestDrain.Task.ConfigureAwait(false); + }; + m_server.AfterServerShutdownJoinerRegisteredForTest = () => + { + Interlocked.Increment(ref joinerRegistrations); + joinerRegistered.TrySetResult(true); + }; + m_requestHeader = null; - (MonitoredItemNotification bad, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(bad.Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + Task StartRequestShutdown() + { + return RunWithoutExecutionContext(async () => + { + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + await m_server.ShutdownInternalsAsync().ConfigureAwait(false); + }); + } - NodeManagerRegistration added = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 2)) + Task joiningShutdown = RunWithoutExecutionContext(async () => + { + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + joiningRequestEntered.TrySetResult(true); + await startJoiningShutdown.Task.ConfigureAwait(false); + await m_server.ShutdownInternalsAsync().ConfigureAwait(false); + }); + await joiningRequestEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Task initiatingShutdown = StartRequestShutdown(); + try + { + await requestDrainReached.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + startJoiningShutdown.TrySetResult(true); + await joinerRegistered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) .ConfigureAwait(false); - IMonitoredItem recoveredItem = subscription - .GetMonitoredItemsSnapshot(added.NodeManager) - .Single(); - Assert.That(ReferenceEquals(recoveredItem, originalItem), Is.True); - (MonitoredItemNotification current, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(current.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + Assert.Multiple(() => + { + Assert.That(initiatingShutdown.IsCompleted, Is.False); + Assert.That(joiningShutdown.IsCompleted, Is.False); + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(1)); + }); - RequestHeader requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - DeleteMonitoredItemsResponse deleteResponse = await m_server - .DeleteMonitoredItemsAsync( - m_secureChannelContext, - requestHeader, - subscriptionId, - [monitoredItemId], - RequestLifetime.None).ConfigureAwait(false); - Assert.That(deleteResponse.Results, Is.EqualTo(new[] { StatusCodes.Good })); - Assert.That( - subscription.GetMonitoredItemsSnapshot(added.NodeManager), - Is.Empty); + releaseRequestDrain.TrySetResult(true); + await Task.WhenAll(initiatingShutdown, joiningShutdown) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); } finally { - await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + startJoiningShutdown.TrySetResult(true); + releaseRequestDrain.TrySetResult(true); + m_server.BeforeServerRequestDrainForTest = null; + m_server.AfterServerShutdownJoinerRegisteredForTest = null; } + + Assert.Multiple(() => + { + Assert.That(joinerRegistrations, Is.EqualTo(1)); + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(1)); + Assert.That(lifecycle.Registrations, Is.Empty); + }); + nodeManager.Verify( + value => value.DeleteAddressSpaceAsync(CancellationToken.None), + Times.Once); + disposable.Verify(value => value.Dispose(), Times.Once); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); } - /// - /// DeleteNodes publishes BadNodeIdUnknown and AddNodes recovers the same item. - /// [Test] - public async Task DeleteNodesThenAddNodesRecoversSameMonitoredItemAsync() + public async Task ConcurrentShutdownCallersJoinReservedTaskStartedOutsideCoordinationLockAsync() { - var factory = new Mock(); - factory - .Setup(candidate => candidate.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(( - IServerInternal server, - ApplicationConfiguration configuration, - CancellationToken _) => new ValueTask( - new NodeManagementLifecycleNodeManager( - server, - configuration, - m_logger, - kModelNamespaceUri))); - NodeManagerRegistration registration = await m_server.NodeManagerLifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false); - - IServerInternal server = m_server.CurrentInstance; - ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); - var rootNodeId = new NodeId(kRootNodeId, ns); - var valueNodeId = new NodeId(kValueNodeId, ns); - var services = new ServerTestServices(m_server, m_secureChannelContext); - (uint subscriptionId, uint monitoredItemId) = - await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) - .ConfigureAwait(false); - var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager - .GetSubscriptions() - .Single(candidate => candidate.Id == subscriptionId); - IMonitoredItem originalItem = subscription - .GetMonitoredItemsSnapshot(registration.NodeManager) - .Single(); - ArrayOf acknowledgements = []; + var shutdownBodyEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseShutdownBody = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + int shutdownBodyEntries = 0; + m_server.AfterServerRequestAdmissionClosedForTest = async () => + { + Interlocked.Increment(ref shutdownBodyEntries); + _ = m_server.ServerShutdownAttemptCountForTest; + shutdownBodyEntered.TrySetResult(true); + await releaseShutdownBody.Task.ConfigureAwait(false); + }; + m_requestHeader = null; + Task firstShutdown = RunWithoutExecutionContext( + () => m_server.ShutdownInternalsAsync().AsTask()); try { - (_, acknowledgements) = await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - - RequestHeader requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - DeleteNodesResponse deleteResponse = await m_server.DeleteNodesAsync( - m_secureChannelContext, - requestHeader, - [new DeleteNodesItem - { - NodeId = valueNodeId, - DeleteTargetReferences = true - }], - RequestLifetime.None).ConfigureAwait(false); - Assert.That(deleteResponse.Results, Is.EqualTo(new[] { StatusCodes.Good })); + await shutdownBodyEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); - (MonitoredItemNotification bad, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(bad.Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + Task secondShutdown = RunWithoutExecutionContext( + () => m_server.ShutdownInternalsAsync().AsTask()); - var attributes = new VariableAttributes + Assert.Multiple(() => { - SpecifiedAttributes = - (uint)NodeAttributesMask.DisplayName | - (uint)NodeAttributesMask.Value | - (uint)NodeAttributesMask.DataType | - (uint)NodeAttributesMask.ValueRank | - (uint)NodeAttributesMask.AccessLevel, - DisplayName = new LocalizedText(kValueBrowseName), - Value = new Variant(kGeneration2Value), - DataType = DataTypeIds.Int32, - ValueRank = ValueRanks.Scalar, - AccessLevel = AccessLevels.CurrentRead - }; - requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - AddNodesResponse addResponse = await m_server.AddNodesAsync( - m_secureChannelContext, - requestHeader, - [new AddNodesItem - { - ParentNodeId = rootNodeId, - ReferenceTypeId = ReferenceTypeIds.HasComponent, - RequestedNewNodeId = valueNodeId, - BrowseName = new QualifiedName(kValueBrowseName, ns), - NodeClass = NodeClass.Variable, - NodeAttributes = new ExtensionObject(attributes) - }], - RequestLifetime.None).ConfigureAwait(false); - Assert.That(addResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); - Assert.That(addResponse.Results[0].AddedNodeId, Is.EqualTo(valueNodeId)); - - IMonitoredItem recoveredItem = subscription - .GetMonitoredItemsSnapshot(registration.NodeManager) - .Single(); - Assert.That(ReferenceEquals(recoveredItem, originalItem), Is.True); - Assert.That(recoveredItem.Id, Is.EqualTo(monitoredItemId)); + Assert.That(firstShutdown.IsCompleted, Is.False); + Assert.That(secondShutdown.IsCompleted, Is.False); + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(1)); + Assert.That(Volatile.Read(ref shutdownBodyEntries), Is.EqualTo(1)); + }); - (MonitoredItemNotification current, acknowledgements) = - await PublishForDataChangeAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); + releaseShutdownBody.TrySetResult(true); + await Task.WhenAll(firstShutdown, secondShutdown) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); } finally { - await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + releaseShutdownBody.TrySetResult(true); + m_server.AfterServerRequestAdmissionClosedForTest = null; } + + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(1)); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); } - /// - /// A failure from the first DeleteAddressSpaceAsync call occurs after the - /// NodeManager has been unpublished. The failure must not republish it, while the - /// registration remains current so a second Remove can retry deletion and complete - /// disposal. - /// - /// - /// Thrown by the injected address-space deletion failure. - /// [Test] - public async Task RemoveAsyncWhenDeleteAddressSpaceFailsKeepsRegistrationUnpublishedAndRetryableAsync() + public async Task ShutdownAdmissionGateRejectsLateReadAndDrainsAdmittedReadAsync() { - const string NamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DeleteFailure"; - const string ExpectedMessage = "DeleteAddressSpaceAsync failed."; - var deleteStarted = new TaskCompletionSource( + IServerInternal server = m_server.CurrentInstance; + TrackingLifecycleNodeManager manager = null; + await m_server.NodeManagerLifecycle.AddAsync( + CreateTrackingNodeManagementFactory( + kGeneration1Value, + created => manager = created)) + .ConfigureAwait(false); + ushort namespaceIndex = + (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, namespaceIndex); + + var admittedReadEntered = new TaskCompletionSource( TaskCreationOptions.RunContinuationsAsynchronously); - var releaseDelete = new TaskCompletionSource( + var releaseAdmittedRead = new TaskCompletionSource( TaskCreationOptions.RunContinuationsAsynchronously); - - async Task FailFirstDeleteAddressSpaceAsync() + var admissionClosed = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseAdmissionClosure = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var requestDrainStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + int readCallbackCount = 0; + manager.ReadCallback = async cancellationToken => { - deleteStarted.TrySetResult(true); - await releaseDelete.Task.ConfigureAwait(false); - throw new SentinelException(ExpectedMessage); - } - - var nodeManager = new Mock(); - Mock nodeManagerAsDisposable = nodeManager.As(); - var syncNodeManager = new Mock(); - nodeManager - .Setup(m => m.NamespaceUris) - .Returns([NamespaceUri]); - nodeManager - .Setup(m => m.SyncNodeManager) - .Returns(syncNodeManager.Object); - nodeManager - .Setup(m => m.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) - .Returns(new ValueTask()); - nodeManager - .SetupSequence(m => m.DeleteAddressSpaceAsync(It.IsAny())) - .Returns(() => new ValueTask(FailFirstDeleteAddressSpaceAsync())) - .Returns(new ValueTask()); - - var factory = new Mock(); - factory - .Setup(f => f.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(nodeManager.Object); + if (Interlocked.Increment(ref readCallbackCount) == 1) + { + admittedReadEntered.TrySetResult(true); + await releaseAdmittedRead.Task + .WaitAsync(cancellationToken) + .ConfigureAwait(false); + } + }; + m_server.AfterServerRequestAdmissionClosedForTest = async () => + { + admissionClosed.TrySetResult(true); + await releaseAdmissionClosure.Task.ConfigureAwait(false); + }; + m_server.AfterServerRequestDrainStartedForTest = () => + requestDrainStarted.TrySetResult(true); - NodeManagerRegistration registration = await m_server.NodeManagerLifecycle - .AddAsync(factory.Object) + RequestHeader admittedHeader = (RequestHeader)m_requestHeader.Clone(); + DataValue admittedValue = default; + Task admittedRead = RunWithoutExecutionContext(async () => + { + admittedValue = await ReadValueAsync(valueNodeId, admittedHeader) + .ConfigureAwait(false); + }); + await admittedReadEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) .ConfigureAwait(false); - IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - int namespaceIndex = server.NamespaceUris.GetIndex(NamespaceUri); - Assert.That(namespaceIndex, Is.GreaterThanOrEqualTo(0)); - Assert.That( - master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), - Is.EqualTo(1)); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.True); - Assert.That( - master.NamespaceManagers[namespaceIndex] - .Count(m => ReferenceEquals(m, nodeManager.Object)), - Is.EqualTo(1)); - - Task firstRemoval = m_server.NodeManagerLifecycle - .RemoveAsync(registration) - .AsTask(); + Task shutdown = m_server.ShutdownInternalsAsync().AsTask(); try { - Task deleteStartResult = await Task.WhenAny( - deleteStarted.Task, - Task.Delay(TimeSpan.FromSeconds(5))).ConfigureAwait(false); - Assert.That(deleteStartResult, Is.SameAs(deleteStarted.Task)); - await deleteStarted.Task.ConfigureAwait(false); + await admissionClosed.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); - Assert.That(firstRemoval.IsCompleted, Is.False); + RequestHeader lateHeader = (RequestHeader)m_requestHeader.Clone(); + ServiceResultException exception = + Assert.ThrowsAsync( + async () => await ReadValueAsync(valueNodeId, lateHeader) + .ConfigureAwait(false)); + Assert.Multiple(() => + { + Assert.That( + exception.StatusCode, + Is.EqualTo(StatusCodes.BadServerHalted)); + Assert.That( + manager.ReadCount, + Is.EqualTo(1), + "The late request must be rejected before NodeManager dispatch."); + Assert.That(shutdown.IsCompleted, Is.False); + }); + + releaseAdmissionClosure.TrySetResult(true); + await requestDrainStarted.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); Assert.That( - master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), - Is.Zero); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + shutdown.IsCompleted, + Is.False, + "Shutdown must wait for the request admitted before closure."); - ArrayOf registrations = - m_server.NodeManagerLifecycle.Registrations; - Assert.That(registrations.Count, Is.EqualTo(1)); - Assert.That(registrations[0], Is.SameAs(registration)); - Assert.That(registrations[0].Id, Is.EqualTo(registration.Id)); - Assert.That(registrations[0].Generation, Is.EqualTo(registration.Generation)); - Assert.That(registrations[0].NodeManager, Is.SameAs(nodeManager.Object)); + releaseAdmittedRead.TrySetResult(true); + await Task.WhenAll(admittedRead, shutdown) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); } finally { - releaseDelete.TrySetResult(true); + releaseAdmissionClosure.TrySetResult(true); + releaseAdmittedRead.TrySetResult(true); + m_server.AfterServerRequestAdmissionClosedForTest = null; + m_server.AfterServerRequestDrainStartedForTest = null; } - Assert.That( - async () => await firstRemoval.ConfigureAwait(false), - Throws.TypeOf().With.Message.EqualTo(ExpectedMessage)); - - Assert.That( - master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), - Is.Zero); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); - - ArrayOf registrationsAfterFailure = - m_server.NodeManagerLifecycle.Registrations; - Assert.That(registrationsAfterFailure.Count, Is.EqualTo(1)); - Assert.That(registrationsAfterFailure[0], Is.SameAs(registration)); - Assert.That(registrationsAfterFailure[0].Id, Is.EqualTo(registration.Id)); - Assert.That( - registrationsAfterFailure[0].Generation, - Is.EqualTo(registration.Generation)); - Assert.That( - registrationsAfterFailure[0].NodeManager, - Is.SameAs(nodeManager.Object)); - nodeManager.Verify( - m => m.DeleteAddressSpaceAsync(CancellationToken.None), - Times.Once); - nodeManagerAsDisposable.Verify(d => d.Dispose(), Times.Never); + Assert.Multiple(() => + { + Assert.That(admittedValue.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(admittedValue.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + Assert.That(manager.ReadCount, Is.EqualTo(1)); + Assert.That(manager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(manager.DisposeCount, Is.EqualTo(1)); + }); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); + } - await m_server.NodeManagerLifecycle - .RemoveAsync(registration) + /// + /// When the replacement factory throws during Reload, the sentinel exception must + /// propagate unchanged, the current generation's registration, routing, value, and + /// namespace state must be entirely unaffected, and no replacement is published. + /// + [Test] + public async Task ReloadAsyncWhenReplacementFactoryThrowsKeepsCurrentManagerAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) .ConfigureAwait(false); - nodeManager.Verify( - m => m.DeleteAddressSpaceAsync(CancellationToken.None), - Times.Exactly(2)); - factory.Verify( - f => f.CreateAsync( + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + int namespaceCountBefore = server.NamespaceUris.Count; + uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); + + var replacementFactory = new Mock(MockBehavior.Strict); + replacementFactory + .Setup(f => f.CreateAsync( It.IsAny(), It.IsAny(), - It.IsAny()), - Times.Once); - nodeManagerAsDisposable.Verify(d => d.Dispose(), Times.Once); + It.IsAny())) + .Throws(new SentinelException()); - ArrayOf registrationsAfterRetry = - m_server.NodeManagerLifecycle.Registrations; Assert.That( - CountMatches(registrationsAfterRetry, r => r.Id == registration.Id), - Is.Zero); + async () => await m_server.NodeManagerLifecycle + .ReloadAsync(original, replacementFactory.Object) + .ConfigureAwait(false), + Throws.TypeOf()); + + ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; + NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); + Assert.That(survivor, Is.Not.Null); + Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); + Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); + Assert.That( - master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), - Is.Zero); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), + Is.EqualTo(1)); + + DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); + uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); } + /// + /// When the replacement factory returns null during Reload, the provider + /// must reject it with its own diagnostic message after invoking the factory exactly + /// once, and the current generation's registration, routing, value, and namespace + /// state must be entirely unaffected. + /// [Test] - public Task AddAsyncWhenPreparationAndCleanupFailReportsEveryFailureAsync() + public async Task ReloadAsyncWhenReplacementFactoryReturnsNullKeepsCurrentManagerAsync() { - const string NamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:PreparationCleanupFailure"; - const string CreateFailure = "CreateAddressSpaceAsync failed."; - const string DeleteFailure = "DeleteAddressSpaceAsync failed."; - const string DisposeFailure = "Dispose failed."; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); - Mock nodeManager = CreateLifecycleNodeManager(NamespaceUri); - nodeManager - .Setup(manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) - .Throws(new SentinelException(CreateFailure)); - nodeManager - .Setup(manager => manager.DeleteAddressSpaceAsync( - It.IsAny())) - .Throws(new SentinelException(DeleteFailure)); - Mock disposable = nodeManager.As(); - disposable - .Setup(manager => manager.Dispose()) - .Throws(new SentinelException(DisposeFailure)); + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + int namespaceCountBefore = server.NamespaceUris.Count; + uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); - var factory = new Mock(); - factory - .Setup(value => value.CreateAsync( + var replacementFactory = new Mock(MockBehavior.Strict); + replacementFactory + .Setup(f => f.CreateAsync( It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(nodeManager.Object); + .ReturnsAsync((IAsyncNodeManager)null!); - AggregateException exception = Assert.ThrowsAsync( + Assert.That( async () => await m_server.NodeManagerLifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false)); - - string[] failureMessages = [.. exception - .Flatten() - .InnerExceptions - .Select(failure => failure.Message)]; - Assert.That(failureMessages, Does.Contain(CreateFailure)); - Assert.That(failureMessages, Does.Contain(DeleteFailure)); - Assert.That(failureMessages, Does.Contain(DisposeFailure)); - Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + .ReloadAsync(original, replacementFactory.Object) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "The replacement NodeManager factory returned null.")); - var master = (MasterNodeManager)m_server.CurrentInstance.NodeManager; - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, nodeManager.Object)), - Is.False); - nodeManager.Verify( - manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), + replacementFactory.Verify( + f => f.CreateAsync( + It.IsAny(), + It.IsAny(), It.IsAny()), Times.Once); - nodeManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); - disposable.Verify(manager => manager.Dispose(), Times.Once); - return Task.CompletedTask; + + ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; + NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); + Assert.That(survivor, Is.Not.Null); + Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); + Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); + + Assert.That( + master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), + Is.EqualTo(1)); + + DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); + uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); } + /// + /// When the replacement NodeManager's CreateAddressSpaceAsync fails during + /// Reload, the sentinel exception must propagate, the host's own cleanup path must + /// run exactly once (DeleteAddressSpaceAsync) followed by the lifecycle + /// provider's own disposal of the failed replacement (Dispose), the current + /// generation's registration/routing/value must be entirely unaffected, no + /// replacement is ever published or routed, and the namespace state is stable. + /// [Test] - public async Task RemoveAsyncWhenSessionUnbindingFailsRepublishesManagerAndAllowsRetryAsync() + public async Task ReloadAsyncWhenReplacementCreateAddressSpaceFailsKeepsCurrentManagerAsync() { - const string NamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:UnbindingFailure"; - const string ExpectedMessage = "SessionClosingAsync failed."; - bool failSessionClosing = false; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); - Mock nodeManager = CreateLifecycleNodeManager(NamespaceUri); - nodeManager - .Setup(manager => manager.SessionClosingAsync( - It.IsAny(), - It.IsAny(), - false, + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + int namespaceCountBefore = server.NamespaceUris.Count; + uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); + + var failingManager = new Mock(); + failingManager + .Setup(m => m.CreateAddressSpaceAsync( + It.IsAny>>(), It.IsAny())) - .Returns( - (_, _, _, _) => failSessionClosing - ? new ValueTask(Task.FromException( - new SentinelException(ExpectedMessage))) - : default); - Mock disposable = nodeManager.As(); + .Throws(new SentinelException()); + var cleanupOrder = new List(); + failingManager + .Setup(m => m.DeleteAddressSpaceAsync(It.IsAny())) + .Callback(() => cleanupOrder.Add("DeleteAddressSpaceAsync")) + .Returns(new ValueTask()); + Mock failingManagerAsDisposable = failingManager.As(); + failingManagerAsDisposable + .Setup(d => d.Dispose()) + .Callback(() => cleanupOrder.Add("Dispose")); - var factory = new Mock(); - factory - .Setup(value => value.CreateAsync( + var replacementFactory = new Mock(); + replacementFactory + .Setup(f => f.CreateAsync( It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(nodeManager.Object); - - NodeManagerRegistration registration = await m_server.NodeManagerLifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false); - - IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - int namespaceIndex = server.NamespaceUris.GetIndex(NamespaceUri); - failSessionClosing = true; + .ReturnsAsync(failingManager.Object); Assert.That( async () => await m_server.NodeManagerLifecycle - .RemoveAsync(registration) + .ReloadAsync(original, replacementFactory.Object) .ConfigureAwait(false), - Throws.TypeOf() - .With.Message.EqualTo(ExpectedMessage)); + Throws.TypeOf()); + + failingManager.Verify( + m => m.DeleteAddressSpaceAsync(It.IsAny()), + Times.Once); + failingManagerAsDisposable.Verify(d => d.Dispose(), Times.Once); + string[] expectedCleanupOrder = ["DeleteAddressSpaceAsync", "Dispose"]; + Assert.That(cleanupOrder, Is.EqualTo(expectedCleanupOrder)); + + ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; + NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); + Assert.That(survivor, Is.Not.Null); + Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); + Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); Assert.That( - m_server.NodeManagerLifecycle.Registrations, - Has.Count.EqualTo(1)); - Assert.That( - m_server.NodeManagerLifecycle.Registrations[0], - Is.SameAs(registration)); - Assert.That( - master.AsyncNodeManagers.Count(manager => - ReferenceEquals(manager, nodeManager.Object)), + master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), Is.EqualTo(1)); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.True); Assert.That( - master.NamespaceManagers[namespaceIndex].Count(manager => - ReferenceEquals(manager, nodeManager.Object)), - Is.EqualTo(1)); - nodeManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - It.IsAny()), - Times.Never); - disposable.Verify(manager => manager.Dispose(), Times.Never); - - failSessionClosing = false; - await m_server.NodeManagerLifecycle - .RemoveAsync(registration) - .ConfigureAwait(false); + master.AsyncNodeManagers.Count(m => ReferenceEquals(m, failingManager.Object)), + Is.Zero); - Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, nodeManager.Object)), - Is.False); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); - nodeManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); - disposable.Verify(manager => manager.Dispose(), Times.Once); + DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); + uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); } + /// + /// Reload transfers a compatible monitored item to the replacement generation + /// without changing its object identity or publishing a transient bad status. + /// [Test] - public async Task ReloadAsyncWhenRetiredManagerCleanupFailsKeepsReplacementAndRetriesCleanupAsync() + public async Task ReloadAsyncRetainsCompatibleMonitoredItemAsync() { - const string NamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RetiredCleanupFailure"; - const string ExpectedMessage = "Retired SessionClosingAsync failed."; - bool failRetiredSessionClosing = false; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); - Mock originalManager = - CreateLifecycleNodeManager(NamespaceUri); - originalManager - .As() - .Setup(participant => participant.PrepareReloadAsync( - It.IsAny(), - It.IsAny())) - .Returns(new ValueTask>([])); - originalManager - .Setup(manager => manager.SessionClosingAsync( - It.IsAny(), - It.IsAny(), - false, - It.IsAny())) - .Returns( - (_, _, _, _) => failRetiredSessionClosing - ? new ValueTask(Task.FromException( - new SentinelException(ExpectedMessage))) - : default); - Mock originalDisposable = originalManager.As(); + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); - var originalFactory = new Mock(); - originalFactory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(originalManager.Object); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) + .ConfigureAwait(false); + var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager + .GetSubscriptions() + .Single(candidate => candidate.Id == subscriptionId); + IMonitoredItem originalItem = subscription + .GetMonitoredItemsSnapshot(original.NodeManager) + .Single(); + ArrayOf acknowledgements = []; + + try + { + (MonitoredItemNotification initial, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(initial.ClientHandle, Is.EqualTo(1)); + Assert.That(initial.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(initial.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ReloadRuntimeNodeSetAsync(original, CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + IMonitoredItem reloadedItem = subscription + .GetMonitoredItemsSnapshot(reloaded.NodeManager) + .Single(); + Assert.That(ReferenceEquals(reloadedItem, originalItem), Is.True); + Assert.That(reloadedItem.Id, Is.EqualTo(monitoredItemId)); + + (MonitoredItemNotification current, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(current.ClientHandle, Is.EqualTo(1)); + Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(current.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + } + + /// + /// Reload waits for an in-flight monitored-item mutation before transferring ownership. + /// + /// + /// Reload detaches a dropped NodeId, publishes BadNodeIdUnknown once, and recovers + /// the same monitored item when a later generation restores the compatible node. + /// + [Test] + public async Task ReloadAsyncDroppedNodeRecoversSameMonitoredItemAsync() + { NodeManagerRegistration original = await m_server.NodeManagerLifecycle - .AddAsync(originalFactory.Object) + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) .ConfigureAwait(false); - Mock replacementManager = - CreateLifecycleNodeManager(NamespaceUri); - Mock replacementDisposable = - replacementManager.As(); - var replacementFactory = new Mock(); - replacementFactory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(replacementManager.Object); + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); - failRetiredSessionClosing = true; - InvalidOperationException exception = - Assert.ThrowsAsync( - async () => await m_server.NodeManagerLifecycle - .ReloadAsync(original, replacementFactory.Object) - .ConfigureAwait(false)); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) + .ConfigureAwait(false); + var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager + .GetSubscriptions() + .Single(candidate => candidate.Id == subscriptionId); + IMonitoredItem originalItem = subscription + .GetMonitoredItemsSnapshot(original.NodeManager) + .Single(); + ArrayOf acknowledgements = []; - Assert.That( - exception.Message, - Does.Contain("replacement NodeManager is live")); - Assert.That(exception.InnerException, Is.TypeOf()); - Assert.That(exception.InnerException!.Message, Is.EqualTo(ExpectedMessage)); + try + { + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); - ArrayOf registrations = - m_server.NodeManagerLifecycle.Registrations; - Assert.That(registrations, Has.Count.EqualTo(1)); - NodeManagerRegistration replacement = registrations[0]; - Assert.That(replacement.Id, Is.EqualTo(original.Id)); - Assert.That(replacement.Generation, Is.EqualTo(original.Generation + 1)); - Assert.That(replacement.NodeManager, Is.SameAs(replacementManager.Object)); + NodeManagerRegistration dropped = await m_server.NodeManagerLifecycle + .ReloadRuntimeNodeSetAsync(original, CreateDroppedGenerationOptions()) + .ConfigureAwait(false); - IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - int namespaceIndex = server.NamespaceUris.GetIndex(NamespaceUri); - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, originalManager.Object)), - Is.False); - Assert.That( - master.AsyncNodeManagers.Count(manager => - ReferenceEquals(manager, replacementManager.Object)), - Is.EqualTo(1)); - Assert.That( - master.NamespaceManagers[namespaceIndex].Any(manager => - ReferenceEquals(manager, replacementManager.Object)), - Is.True); - originalManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - It.IsAny()), - Times.Never); - originalDisposable.Verify(manager => manager.Dispose(), Times.Never); - replacementDisposable.Verify(manager => manager.Dispose(), Times.Never); + IMonitoredItem detachedItem = subscription + .GetRecoverableMonitoredItemsSnapshot([valueNodeId]) + .Single(); + Assert.That(ReferenceEquals(detachedItem, originalItem), Is.True); - failRetiredSessionClosing = false; - await m_server.NodeManagerLifecycle - .RemoveAsync(replacement) - .ConfigureAwait(false); + (MonitoredItemNotification bad, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(bad.ClientHandle, Is.EqualTo(1)); + Assert.That(bad.Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); - originalManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); - originalDisposable.Verify(manager => manager.Dispose(), Times.Once); - replacementManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); - replacementDisposable.Verify(manager => manager.Dispose(), Times.Once); - Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); - Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + NodeManagerRegistration recovered = await m_server.NodeManagerLifecycle + .ReloadRuntimeNodeSetAsync(dropped, CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + IMonitoredItem recoveredItem = subscription + .GetMonitoredItemsSnapshot(recovered.NodeManager) + .Single(); + Assert.That(ReferenceEquals(recoveredItem, originalItem), Is.True); + + (MonitoredItemNotification current, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(current.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } } + /// + /// Remove preserves the subscription and monitored item, publishes BadNodeIdUnknown, + /// recovers on a later add, and permits client-side deletion of the same item id. + /// [Test] - public async Task AddAsyncWhenPublicationRollbackFailsRetainsLiveRegistrationAsync() + public async Task RemoveAsyncPublishesBadRecoversAndClientDeletesSameItemAsync() { - const string OwnerNamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:AddRollbackOwner"; - const string RetainedNamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:AddRollbackRetained"; - const string AddReferencesFailure = "AddReferencesAsync failed."; - const string DeleteReferenceFailure = "DeleteReferenceAsync failed."; - - Mock ownerManager = - CreateLifecycleNodeManager(OwnerNamespaceUri); - Mock ownerDisposable = ownerManager.As(); - var ownerFactory = new Mock(); - ownerFactory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(ownerManager.Object); - NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle - .AddAsync(ownerFactory.Object) - .ConfigureAwait(false); + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( - OwnerNamespaceUri); - var ownerSourceId = new NodeId(1001, ownerNamespaceIndex); - object ownerHandle = new(); - bool failDeleteReference = true; - ownerManager - .Setup(manager => manager.GetManagerHandleAsync( - ownerSourceId, - It.IsAny())) - .Returns(new ValueTask(ownerHandle)); - ownerManager - .Setup(manager => manager.DeleteReferenceAsync( - ownerHandle, - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server, - false, - It.IsAny())) - .Returns(() => failDeleteReference - ? new ValueTask( - Task.FromException( - new SentinelException(DeleteReferenceFailure))) - : new ValueTask(ServiceResult.Good)); + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) + .ConfigureAwait(false); + var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager + .GetSubscriptions() + .Single(candidate => candidate.Id == subscriptionId); + IMonitoredItem originalItem = subscription + .GetMonitoredItemsSnapshot(original.NodeManager) + .Single(); + ArrayOf acknowledgements = []; - Mock retainedManager = - CreateLifecycleNodeManager(RetainedNamespaceUri); - Mock retainedDisposable = - retainedManager.As(); - retainedManager - .Setup(manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) - .Callback< - IDictionary>, - CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = - [ - new NodeStateReference( - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server) - ]) - .Returns(default(ValueTask)); - bool failAddReferences = true; - retainedManager - .Setup(manager => manager.AddReferencesAsync( - It.IsAny>>(), - It.IsAny())) - .Returns(() => failAddReferences - ? new ValueTask(Task.FromException( - new SentinelException(AddReferencesFailure))) - : default); + try + { + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); - var retainedFactory = new Mock(); - retainedFactory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(retainedManager.Object); + await m_server.NodeManagerLifecycle.RemoveAsync(original).ConfigureAwait(false); - InvalidOperationException exception = - Assert.ThrowsAsync( - async () => await m_server.NodeManagerLifecycle - .AddAsync(retainedFactory.Object) - .ConfigureAwait(false)); + IMonitoredItem detachedItem = subscription + .GetRecoverableMonitoredItemsSnapshot([valueNodeId]) + .Single(); + Assert.That(ReferenceEquals(detachedItem, originalItem), Is.True); - Assert.That( - exception.Message, - Does.Contain("published generation was retained")); - Assert.That(exception.InnerException, Is.TypeOf()); - string[] failureMessages = [.. ((AggregateException)exception.InnerException!) - .Flatten() - .InnerExceptions - .Select(failure => failure.Message)]; - Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); - Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); + (MonitoredItemNotification bad, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(bad.Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); - NodeManagerRegistration retainedRegistration = - m_server.NodeManagerLifecycle.Registrations.Find(registration => - ReferenceEquals(registration.NodeManager, retainedManager.Object)); - Assert.That(retainedRegistration, Is.Not.Null); - Assert.That(retainedRegistration.Generation, Is.EqualTo(1)); - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, retainedManager.Object)), - Is.True); - int retainedNamespaceIndex = - server.NamespaceUris.GetIndex(RetainedNamespaceUri); - Assert.That( - master.NamespaceManagers[retainedNamespaceIndex].Any(manager => - ReferenceEquals(manager, retainedManager.Object)), - Is.True); - retainedDisposable.Verify(manager => manager.Dispose(), Times.Never); + NodeManagerRegistration added = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + IMonitoredItem recoveredItem = subscription + .GetMonitoredItemsSnapshot(added.NodeManager) + .Single(); + Assert.That(ReferenceEquals(recoveredItem, originalItem), Is.True); - failAddReferences = false; - failDeleteReference = false; - await m_server.NodeManagerLifecycle - .RemoveAsync(retainedRegistration) - .ConfigureAwait(false); - await m_server.NodeManagerLifecycle - .RemoveAsync(ownerRegistration) - .ConfigureAwait(false); + (MonitoredItemNotification current, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(current.Value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); - retainedManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); - retainedDisposable.Verify(manager => manager.Dispose(), Times.Once); - ownerDisposable.Verify(manager => manager.Dispose(), Times.Once); - Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + DeleteMonitoredItemsResponse deleteResponse = await m_server + .DeleteMonitoredItemsAsync( + m_secureChannelContext, + requestHeader, + subscriptionId, + [monitoredItemId], + RequestLifetime.None).ConfigureAwait(false); + Assert.That(deleteResponse.Results, Is.EqualTo([StatusCodes.Good])); + Assert.That( + subscription.GetMonitoredItemsSnapshot(added.NodeManager), + Is.Empty); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } } + /// + /// DeleteNodes publishes BadNodeIdUnknown and AddNodes recovers the same item. + /// [Test] - public async Task ReloadAsyncWhenReplacementRollbackFailsRetainsReplacementGenerationAsync() + public async Task DeleteNodesThenAddNodesRecoversSameMonitoredItemAsync() { - const string OwnerNamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ReloadRollbackOwner"; - const string ReloadedNamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ReloadRollbackRetained"; - const string AddReferencesFailure = - "Replacement AddReferencesAsync failed."; - const string DeleteReferenceFailure = - "Replacement rollback DeleteReferenceAsync failed."; - - Mock ownerManager = - CreateLifecycleNodeManager(OwnerNamespaceUri); - Mock ownerDisposable = ownerManager.As(); - var ownerFactory = new Mock(); - ownerFactory - .Setup(value => value.CreateAsync( + var factory = new Mock(); + factory + .Setup(candidate => candidate.CreateAsync( It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(ownerManager.Object); - NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle - .AddAsync(ownerFactory.Object) + .Returns(( + IServerInternal server, + ApplicationConfiguration configuration, + CancellationToken _) => new ValueTask( + new NodeManagementLifecycleNodeManager( + server, + configuration, + m_logger, + kModelNamespaceUri))); + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddAsync(factory.Object) .ConfigureAwait(false); IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( - OwnerNamespaceUri); - var ownerSourceId = new NodeId(2001, ownerNamespaceIndex); - object ownerHandle = new(); - int deleteReferenceCalls = 0; - bool failRollbackDelete = true; - ownerManager - .Setup(manager => manager.GetManagerHandleAsync( - ownerSourceId, - It.IsAny())) - .Returns(new ValueTask(ownerHandle)); - ownerManager - .Setup(manager => manager.DeleteReferenceAsync( - ownerHandle, - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server, - false, - It.IsAny())) - .Returns(() => - { - deleteReferenceCalls++; - if (failRollbackDelete && deleteReferenceCalls >= 2) - { - return new ValueTask( - Task.FromException( - new SentinelException(DeleteReferenceFailure))); - } - return new ValueTask(ServiceResult.Good); - }); - - Mock originalManager = - CreateLifecycleNodeManager(ReloadedNamespaceUri); - Mock originalDisposable = - originalManager.As(); - originalManager - .Setup(manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var rootNodeId = new NodeId(kRootNodeId, ns); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) + .ConfigureAwait(false); + var subscription = (ISubscriptionMonitoredItemLifecycle)server.SubscriptionManager + .GetSubscriptions() + .Single(candidate => candidate.Id == subscriptionId); + IMonitoredItem originalItem = subscription + .GetMonitoredItemsSnapshot(registration.NodeManager) + .Single(); + ArrayOf acknowledgements = []; + + try + { + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + DeleteNodesResponse deleteResponse = await m_server.DeleteNodesAsync( + m_secureChannelContext, + requestHeader, + [new DeleteNodesItem + { + NodeId = valueNodeId, + DeleteTargetReferences = true + }], + RequestLifetime.None).ConfigureAwait(false); + Assert.That(deleteResponse.Results, Is.EqualTo([StatusCodes.Good])); + + (MonitoredItemNotification bad, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(bad.Value.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + + var attributes = new VariableAttributes + { + SpecifiedAttributes = + (uint)NodeAttributesMask.DisplayName | + (uint)NodeAttributesMask.Value | + (uint)NodeAttributesMask.DataType | + (uint)NodeAttributesMask.ValueRank | + (uint)NodeAttributesMask.AccessLevel, + DisplayName = new LocalizedText(kValueBrowseName), + Value = new Variant(kGeneration2Value), + DataType = DataTypeIds.Int32, + ValueRank = ValueRanks.Scalar, + AccessLevel = AccessLevels.CurrentRead + }; + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + AddNodesResponse addResponse = await m_server.AddNodesAsync( + m_secureChannelContext, + requestHeader, + [new AddNodesItem + { + ParentNodeId = rootNodeId, + ReferenceTypeId = ReferenceTypeIds.HasComponent, + RequestedNewNodeId = valueNodeId, + BrowseName = new QualifiedName(kValueBrowseName, ns), + NodeClass = NodeClass.Variable, + NodeAttributes = new ExtensionObject(attributes) + }], + RequestLifetime.None).ConfigureAwait(false); + Assert.That(addResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(addResponse.Results[0].AddedNodeId, Is.EqualTo(valueNodeId)); + + IMonitoredItem recoveredItem = subscription + .GetMonitoredItemsSnapshot(registration.NodeManager) + .Single(); + Assert.That(ReferenceEquals(recoveredItem, originalItem), Is.True); + Assert.That(recoveredItem.Id, Is.EqualTo(monitoredItemId)); + + (MonitoredItemNotification current, acknowledgements) = + await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + Assert.That(current.Value.StatusCode, Is.EqualTo(StatusCodes.Good)); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + } + + /// + /// Unlike Reload and Remove, ShadowReload must succeed while the current + /// generation owns an active reporting monitored item: the switch is committed + /// and every new service request (here, Read) is atomically routed to the + /// replacement generation, while the existing monitored item keeps being serviced + /// by the retired (but not yet destroyed) current generation, including for a + /// fresh value pushed directly on that retired generation's own node after the + /// switch. Once the owning subscription is deleted, a later lifecycle operation + /// opportunistically completes retired-generation cleanup and disposes the old + /// generation's address space, without the lifecycle provider ever deleting the + /// client's subscription itself. + /// + [Test] + public async Task ShadowReloadAsyncKeepsActiveMonitoredItemAliveThenDisposesRetiredGenerationAfterDrainAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var originalManager = (AsyncCustomNodeManager)original.NodeManager; + const uint clientHandle = 1; + + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, _) = await CreateSubscriptionWithMonitoredItemAsync( + services, + valueNodeId).ConfigureAwait(false); + + // Drain the initial data-change sample delivered on monitored-item creation so + // the later publish loop only observes the value pushed after the switch. + ArrayOf acknowledgements = default; + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + + try + { + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync(original, CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + Assert.That(reloaded.Id, Is.EqualTo(original.Id)); + Assert.That(reloaded.Generation, Is.EqualTo(original.Generation + 1)); + Assert.That(ReferenceEquals(reloaded.NodeManager, original.NodeManager), Is.False); + + // New service requests must be atomically routed to the replacement; the + // retired generation must no longer be reachable through routing. + Assert.That( + master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, reloaded.NodeManager)), + Is.EqualTo(1)); + Assert.That( + master.NamespaceManagers[ns].Any(m => ReferenceEquals(m, original.NodeManager)), + Is.False); + + DataValue valueAfterSwitch = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(valueAfterSwitch.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(valueAfterSwitch.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + + // The retired generation's own node must still be present, still owned by + // the original manager instance, and unaffected by the switch. + var originalValueState = (BaseVariableState)originalManager.Find(valueNodeId)!; + Assert.That(originalValueState, Is.Not.Null); + Assert.That(originalValueState.Value, Is.EqualTo(kGeneration1Value)); + + ISubscription subscription = server.SubscriptionManager + .GetSubscriptions() + .Single(s => s.Id == subscriptionId); + var tracker = (ISubscriptionMonitoredItemLifecycle)subscription; + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.True); + Assert.That(tracker.HasMonitoredItems(reloaded.NodeManager), Is.False); + + // Simulate an internal (device-driven) value push directly on the retired + // generation's own node: it must still reach the existing monitored item. + const int pushedValue = 777; + originalValueState.Value = pushedValue; + originalValueState.Timestamp = DateTimeUtc.Now; + originalValueState.StatusCode = StatusCodes.Good; + originalValueState.UpdateChangeMasks(NodeStateChangeMasks.Value); + await originalValueState + .ClearChangeMasksAsync(server.DefaultSystemContext, includeChildren: false) + .ConfigureAwait(false); + + DataValue? pushedNotification; + (pushedNotification, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + Assert.That(pushedNotification, Is.Not.Null); + Assert.That(pushedNotification!.Value.WrappedValue.GetInt32(), Is.EqualTo(pushedValue)); + + // The replacement generation's own value must remain unaffected by the + // push made directly on the retired generation. + DataValue valueAfterPush = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(valueAfterPush.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + // With the owning subscription gone, a later lifecycle operation + // opportunistically finishes retired-generation cleanup: the old generation's + // own address space is torn down (DeleteAddressSpaceAsync empties its + // PredefinedNodes) without the lifecycle provider ever deleting the client's + // (already independently deleted) subscription itself. + NodeManagerRegistration current = m_server.NodeManagerLifecycle.Registrations + .Find(r => r.Id == original.Id); + Assert.That(current, Is.Not.Null); + await m_server.NodeManagerLifecycle.RemoveAsync(current).ConfigureAwait(false); + + Assert.That(originalManager.Find(valueNodeId), Is.Null); + Assert.That( + CountMatches(m_server.NodeManagerLifecycle.Registrations, r => r.Id == original.Id), + Is.Zero); + } + + /// + /// Immediate reload switches new service requests to the replacement, queues + /// BadNodeIdUnknown for every data monitored item owned by the prior generation, + /// and disposes that generation without waiting for the subscription to drain. + /// + [Test] + public async Task ImmediateReloadAsyncReportsBadNodeIdUnknownAndDisposesPriorGenerationAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var originalManager = (AsyncCustomNodeManager)original.NodeManager; + const uint clientHandle = 1; + + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle).ConfigureAwait(false); + ArrayOf acknowledgements = default; + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + + RequestHeader queueHeader = m_requestHeader; + queueHeader.Timestamp = DateTimeUtc.Now; + ModifyMonitoredItemsResponse queueResponse = await services + .ModifyMonitoredItemsAsync( + queueHeader, + subscriptionId, + TimestampsToReturn.Both, + [ + new MonitoredItemModifyRequest + { + MonitoredItemId = monitoredItemId, + RequestedParameters = new MonitoringParameters + { + ClientHandle = clientHandle, + SamplingInterval = 0, + QueueSize = 5, + DiscardOldest = true + } + } + ]) + .ConfigureAwait(false); + Assert.That(queueResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + + RequestHeader samplingHeader = m_requestHeader; + samplingHeader.Timestamp = DateTimeUtc.Now; + SetMonitoringModeResponse samplingResponse = await services + .SetMonitoringModeAsync( + samplingHeader, + subscriptionId, + MonitoringMode.Sampling, + [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(samplingResponse.Results[0], Is.EqualTo(StatusCodes.Good)); + + try + { + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ImmediateReloadRuntimeNodeSetAsync( + original, + CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + DataValue current = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(current.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(current.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + + ISubscription subscription = server.SubscriptionManager + .GetSubscriptions() + .Single(s => s.Id == subscriptionId); + var tracker = (ISubscriptionMonitoredItemLifecycle)subscription; + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.False); + Assert.That(originalManager.Find(valueNodeId), Is.Null, + "The prior generation must be disposed before immediate reload returns."); + + DataValue? retiredNotification; + (retiredNotification, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + Assert.That(retiredNotification, Is.Not.Null); + Assert.That( + retiredNotification!.Value.StatusCode, + Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + Assert.That(reloaded.Generation, Is.EqualTo(original.Generation + 1)); + + RequestHeader header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + ModifyMonitoredItemsResponse modifyResponse = await services + .ModifyMonitoredItemsAsync( + header, + subscriptionId, + TimestampsToReturn.Both, + [ + new MonitoredItemModifyRequest + { + MonitoredItemId = monitoredItemId, + RequestedParameters = new MonitoringParameters + { + ClientHandle = clientHandle, + SamplingInterval = 0, + QueueSize = 2, + DiscardOldest = true + } + } + ]) + .ConfigureAwait(false); + Assert.That( + modifyResponse.Results[0].StatusCode, + Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + + header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + SetMonitoringModeResponse modeResponse = await services + .SetMonitoringModeAsync( + header, + subscriptionId, + MonitoringMode.Reporting, + [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(modeResponse.Results[0], Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + + header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + DeleteMonitoredItemsResponse deleteResponse = await services + .DeleteMonitoredItemsAsync(header, subscriptionId, [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(deleteResponse.Results[0], Is.EqualTo(StatusCodes.Good)); + Assert.That(subscription.MonitoredItemCount, Is.Zero); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + } + + /// + /// After a ShadowReload, an ownership-sensitive data monitored item still owned by + /// the retired generation must be dispatched to that generation for Modify, + /// SetMonitoringMode (disable/re-enable), and Delete - not to the visible + /// replacement generation that now serves the same namespace. Each operation must + /// succeed (a BadMonitoredItemIdInvalid would prove the ownership defect, + /// where the same-namespace replacement claims but cannot service the retired item), + /// new Reads must be routed to the replacement, notifications pushed on the retired + /// generation's own node must keep flowing, and once the final item drains via Delete + /// the retired generation must be disposed promptly - without any further lifecycle + /// operation. + /// + [Test] + public async Task ShadowReloadedDataMonitoredItemIsModifiableToggleableAndDeletableOnRetiredGenerationThenDrainDisposesItAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var originalManager = (AsyncCustomNodeManager)original.NodeManager; + const uint clientHandle = 1; + + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync(services, valueNodeId, clientHandle) + .ConfigureAwait(false); + + // Drain the initial data-change sample delivered on monitored-item creation. + ArrayOf acknowledgements = default; + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync(original, CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + // The existing item stays owned by the retired generation; the replacement owns none. + ISubscription subscription = server.SubscriptionManager + .GetSubscriptions() + .Single(s => s.Id == subscriptionId); + var tracker = (ISubscriptionMonitoredItemLifecycle)subscription; + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.True); + Assert.That(tracker.HasMonitoredItems(reloaded.NodeManager), Is.False); + + // New Reads are routed to the replacement generation. + DataValue afterSwitch = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(afterSwitch.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(afterSwitch.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + + // Old notifications continue: a value pushed on the retired node still arrives. + await PushRetiredValueAsync(server, originalManager, valueNodeId, 4242).ConfigureAwait(false); + DataValue? pushed; + (pushed, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + Assert.That(pushed!.Value.WrappedValue.GetInt32(), Is.EqualTo(4242)); + + // (1) Modify the retired-owned item - must be routed to the retired generation. + RequestHeader header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + ArrayOf itemsToModify = + [ + new MonitoredItemModifyRequest + { + MonitoredItemId = monitoredItemId, + RequestedParameters = new MonitoringParameters + { + ClientHandle = clientHandle, + SamplingInterval = 0, + QueueSize = 5, + DiscardOldest = true + } + } + ]; + ModifyMonitoredItemsResponse modifyResponse = await services + .ModifyMonitoredItemsAsync(header, subscriptionId, TimestampsToReturn.Both, itemsToModify) + .ConfigureAwait(false); + Assert.That(modifyResponse.Results.Count, Is.EqualTo(1)); + Assert.That(modifyResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good), + "Modify of a shadow-retired data monitored item must be routed to its owning " + + "(retired) generation and succeed."); + + // (2) Disable then re-enable the retired-owned item. + header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + SetMonitoringModeResponse disableResponse = await services + .SetMonitoringModeAsync(header, subscriptionId, MonitoringMode.Disabled, [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(disableResponse.Results.Count, Is.EqualTo(1)); + Assert.That(disableResponse.Results[0], Is.EqualTo(StatusCodes.Good), + "Disabling a shadow-retired data monitored item must be routed to its owning generation."); + + header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + SetMonitoringModeResponse enableResponse = await services + .SetMonitoringModeAsync(header, subscriptionId, MonitoringMode.Reporting, [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(enableResponse.Results[0], Is.EqualTo(StatusCodes.Good), + "Re-enabling a shadow-retired data monitored item must be routed to its owning generation."); + + // The re-enabled item still delivers a fresh value pushed on the retired node. + await PushRetiredValueAsync(server, originalManager, valueNodeId, 5353).ConfigureAwait(false); + (pushed, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + Assert.That(pushed!.Value.WrappedValue.GetInt32(), Is.EqualTo(5353)); + + // (3) Delete the retired-owned item - must be routed to the retired generation, + // draining it. Without owner-based routing the same-namespace replacement claims + // the item and returns BadMonitoredItemIdInvalid, so the retired item never drains. + header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + DeleteMonitoredItemsResponse deleteResponse = await services + .DeleteMonitoredItemsAsync(header, subscriptionId, [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(deleteResponse.Results.Count, Is.EqualTo(1)); + Assert.That(deleteResponse.Results[0], Is.EqualTo(StatusCodes.Good), + "Delete of a shadow-retired data monitored item must be routed to its owning generation."); + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.False); + + // The replacement generation is unaffected and still serves Reads. + DataValue afterDrain = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(afterDrain.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + + // Prompt cleanup: with the final item drained, the retired generation is disposed + // WITHOUT any further lifecycle operation - its own address space is torn down. + await AssertRetiredGenerationDisposedAsync(originalManager, valueNodeId).ConfigureAwait(false); + + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + /// + /// Deleting the final event monitored item owned by a shadow-retired generation must + /// promptly dispose that generation without requiring another lifecycle operation. + /// + [Test] + public async Task ShadowReloadedEventMonitoredItemDeletionDrainsRetiredGenerationAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateEventGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var rootNodeId = new NodeId(kRootNodeId, ns); + var originalManager = (AsyncCustomNodeManager)original.NodeManager; + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync(services, rootNodeId) + .ConfigureAwait(false); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync( + original, + CreateEventGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + ISubscription subscription = server.SubscriptionManager + .GetSubscriptions() + .Single(s => s.Id == subscriptionId); + var tracker = (ISubscriptionMonitoredItemLifecycle)subscription; + Assert.That(subscription.MonitoredItemCount, Is.EqualTo(1)); + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.True); + Assert.That(tracker.HasMonitoredItems(reloaded.NodeManager), Is.False); + Assert.That(originalManager.Find(rootNodeId), Is.Not.Null); + + RequestHeader header = m_requestHeader; + header.Timestamp = DateTimeUtc.Now; + DeleteMonitoredItemsResponse deleteResponse = await services + .DeleteMonitoredItemsAsync(header, subscriptionId, [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(deleteResponse.Results.Count, Is.EqualTo(1)); + Assert.That(deleteResponse.Results[0], Is.EqualTo(StatusCodes.Good)); + Assert.That(subscription.MonitoredItemCount, Is.Zero); + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.False); + + await AssertRetiredGenerationDisposedAsync(originalManager, rootNodeId) + .ConfigureAwait(false); + + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + /// + /// The background pass triggered by deleting a shadow generation's final item must + /// not hold the lifecycle semaphore while waiting for an active request. Otherwise + /// an opted-in lifecycle call made by that request waits for the semaphore while the + /// drain waits for the request, forming a circular wait. + /// + [Test] + public async Task ShadowDrainDoesNotDeadlockCallbackSafeLifecycleCallAsync() + { + const string DrainProbeNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DrainProbe"; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync( + original, + CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + NodeManagerRegistration probeRegistration = null; + IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + IDisposable requestScope = + server.RequestManager.EnterRequestScope(callbackContext); + try + { + await DeleteMonitoredItemAsync( + services, + subscriptionId, + monitoredItemId).ConfigureAwait(false); + + // Give the queued background pass a deterministic opportunity to reach its + // request drain before this request enters the lifecycle API. + await Task.Delay(TimeSpan.FromMilliseconds(250)).ConfigureAwait(false); + + RuntimeNodeSetOptions probeOptions = CreateOptions( + DrainProbeNamespaceUri, + value: 303); + probeOptions.AllowLifecycleFromRequestCallback = true; + using var timeout = new CancellationTokenSource( + TimeSpan.FromSeconds(10)); + try + { + probeRegistration = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(probeOptions, timeout.Token) + .ConfigureAwait(false); + } + catch (OperationCanceledException) + { + Assert.Fail( + "The callback-safe lifecycle call deadlocked with the background " + + "retired-generation request drain."); + } + } + finally + { + requestScope.Dispose(); + dispatchScope.Dispose(); + } + + Assert.That(probeRegistration, Is.Not.Null); + await m_server.NodeManagerLifecycle + .RemoveAsync(probeRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(reloaded) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + /// + /// A shadow-retired manager that still owns a data monitored item remains in the + /// session identity-change fan-out and receives the unsubscribe for all-events + /// monitored items that existed when it was retired. It is not routed for new + /// all-events subscriptions or ordinary services. + /// + [Test] + public async Task ShadowRetiredManagerKeepsLifecycleNotificationsUntilDrainedAsync() + { + TrackingLifecycleNodeManager originalManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => originalManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint existingEventSubscriptionId, uint existingEventMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + Assert.That(originalManager.AllEventsSubscribeCount, Is.EqualTo(1)); + + TrackingLifecycleNodeManager replacementManager = null; + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + kGeneration2Value, + manager => replacementManager = manager)) + .ConfigureAwait(false); + + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, originalManager)), + Is.False); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, replacementManager)), + Is.True); + + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + int activationCount = originalManager.SessionActivatedCount; + await master + .SessionActivatedAsync( + new OperationContext(session, DiagnosticsMasks.None), + session.Id, + CancellationToken.None) + .ConfigureAwait(false); + Assert.That( + originalManager.SessionActivatedCount, + Is.EqualTo(activationCount + 1), + "Identity-change notification must invalidate the retired manager's " + + "monitored-item permission cache."); + + (uint newEventSubscriptionId, uint newEventMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + Assert.That( + originalManager.AllEventsSubscribeCount, + Is.EqualTo(1), + "A shadow-retired manager must not receive new all-events subscriptions."); + + await DeleteMonitoredItemAsync( + services, + existingEventSubscriptionId, + existingEventMonitoredItemId).ConfigureAwait(false); + Assert.That(originalManager.AllEventsUnsubscribeCount, Is.EqualTo(1)); + + await DeleteMonitoredItemAsync( + services, + newEventSubscriptionId, + newEventMonitoredItemId).ConfigureAwait(false); + Assert.That( + originalManager.AllEventsUnsubscribeCount, + Is.EqualTo(1), + "The retired manager was never subscribed to the post-reload item."); + + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync( + originalManager, + valueNodeId).ConfigureAwait(false); + + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, existingEventSubscriptionId) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, newEventSubscriptionId) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(reloaded) + .ConfigureAwait(false); + } + + /// + /// If prompt cleanup suspends a graceful retiree and its request drain fails, a + /// monitored item that appears during the drain keeps the retiree alive. Its session + /// and retained all-events notifications must be restored until the item drains. + /// + [Test] + public async Task FailedRetiredDrainRestoresNotificationsForLateMonitoredItemAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, uint eventMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + Assert.That(retiredManager.AllEventsSubscribeCount, Is.EqualTo(1)); + + NodeManagerRegistration replacement = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + + ISubscription dataSubscription = server.SubscriptionManager + .GetSubscriptions() + .Single(subscription => subscription.Id == dataSubscriptionId); + var lateItem = new Mock(); + lateItem.SetupGet(item => item.Id).Returns(uint.MaxValue - 1); + lateItem.SetupGet(item => item.NodeManager).Returns(original.NodeManager); + lateItem.SetupGet(item => item.IsDurable).Returns(false); + + var requestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequest = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Task heldRequest = HoldRequestAsync(server, requestEntered, releaseRequest); + await requestEntered.Task.ConfigureAwait(false); + + TimeSpan originalDrainTimeout = server.RequestManager.RequestDrainTimeout; + bool lateItemAdded = false; + try + { + server.RequestManager.RequestDrainTimeout = TimeSpan.FromSeconds(2); + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + AddSyntheticMonitoredItem( + (Subscription)dataSubscription, + lateItem.Object); + lateItemAdded = true; + + await WaitForRetiredNotificationsResumedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + int unsubscribeCount = retiredManager.AllEventsUnsubscribeCount; + await DeleteMonitoredItemAsync( + services, + eventSubscriptionId, + eventMonitoredItemId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsUnsubscribeCount, + Is.EqualTo(unsubscribeCount + 1), + "The retained all-events snapshot must resume deletion fan-out."); + } + finally + { + if (lateItemAdded) + { + RemoveSyntheticMonitoredItem( + (Subscription)dataSubscription, + lateItem.Object); + } + server.RequestManager.RequestDrainTimeout = originalDrainTimeout; + releaseRequest.TrySetResult(true); + await heldRequest.ConfigureAwait(false); + } + + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId).ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(replacement).ConfigureAwait(false); + + await AssertRetiredGenerationDisposedAsync( + retiredManager, + valueNodeId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsUnsubscribeCount, + Is.EqualTo(1), + "Successful final retirement must not unsubscribe the deleted item twice."); + } + + /// + /// A direct retired-generation cleanup must release the lifecycle semaphore for its + /// request drain. A callback-safe reload can then win while that drain waits for the + /// callback request; the original Remove must revalidate its stale handle rather than + /// destroying the winning generation. + /// + [Test] + public async Task DirectRetiredDrainAllowsCallbackReloadAndRejectsStaleRemoveAsync() + { + const string TargetNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DrainReloadWinner"; + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration retiree = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort retireeNs = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var retireeValueId = new NodeId(kValueNodeId, retireeNs); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + retireeValueId, + clientHandle: 1).ConfigureAwait(false); + NodeManagerRegistration retireeReplacement = + await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + retiree, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + ((IDynamicNodeManagerHost)master) + .SetRetiredGenerationDrainObserver(null); + + RuntimeNodeSetOptions targetOptions = CreateOptions( + TargetNamespaceUri, + value: 401); + targetOptions.AllowLifecycleFromRequestCallback = true; + NodeManagerRegistration target = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(targetOptions) + .ConfigureAwait(false); + ushort targetNs = (ushort)server.NamespaceUris.GetIndex(TargetNamespaceUri); + var targetValueId = new NodeId(kValueNodeId, targetNs); + + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + Task removeTask = null; + NodeManagerRegistration winner = null; + IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + IDisposable requestScope = + server.RequestManager.EnterRequestScope(callbackContext); + try + { + await DeleteMonitoredItemAsync( + services, + subscriptionId, + monitoredItemId).ConfigureAwait(false); + + removeTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle + .RemoveAsync(target) + .AsTask()); + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + RuntimeNodeSetOptions replacementOptions = CreateOptions( + TargetNamespaceUri, + value: 402); + replacementOptions.AllowLifecycleFromRequestCallback = true; + using var timeout = new CancellationTokenSource( + TimeSpan.FromSeconds(10)); + winner = await m_server.NodeManagerLifecycle + .ReloadRuntimeNodeSetAsync( + target, + replacementOptions, + timeout.Token) + .ConfigureAwait(false); + } + finally + { + requestScope.Dispose(); + dispatchScope.Dispose(); + } + + InvalidOperationException exception = + Assert.ThrowsAsync( + async () => await removeTask.ConfigureAwait(false)); + Assert.That( + exception.Message, + Is.EqualTo( + "The registration is stale or is not owned by this lifecycle provider.")); + NodeManagerRegistration currentWinner = + m_server.NodeManagerLifecycle.Registrations.Find( + registration => registration.Id == target.Id); + Assert.That(currentWinner, Is.SameAs(winner)); + Assert.That( + ((AsyncCustomNodeManager)winner.NodeManager).Find(targetValueId), + Is.Not.Null, + "The stale Remove must not destroy the reload winner."); + DataValue winnerValue = await ReadValueAsync(targetValueId).ConfigureAwait(false); + Assert.That(winnerValue.WrappedValue.GetInt32(), Is.EqualTo(402)); + + await AssertRetiredGenerationDisposedAsync( + retiredManager, + retireeValueId).ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(winner).ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(retireeReplacement) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + /// + /// A reload waiting for direct retired cleanup must resolve its registration only + /// after that drain. If a callback-safe Remove wins meanwhile, the stale reload must + /// not invoke its replacement factory or resurrect the removed registration. + /// + [Test] + public async Task RetiredDrainRevalidatesBeforeReloadAfterCallbackRemoveAsync() + { + const string TargetNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DrainRemoveWinner"; + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration retiree = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort retireeNs = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var retireeValueId = new NodeId(kValueNodeId, retireeNs); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + retireeValueId, + clientHandle: 1).ConfigureAwait(false); + NodeManagerRegistration retireeReplacement = + await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + retiree, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + ((IDynamicNodeManagerHost)master) + .SetRetiredGenerationDrainObserver(null); + + RuntimeNodeSetOptions targetOptions = CreateOptions( + TargetNamespaceUri, + value: 501); + targetOptions.AllowLifecycleFromRequestCallback = true; + NodeManagerRegistration target = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(targetOptions) + .ConfigureAwait(false); + var replacementFactory = new Mock(); + int factoryCalls = 0; + replacementFactory + .Setup(candidate => candidate.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Callback(() => Interlocked.Increment(ref factoryCalls)) + .Throws(new InvalidOperationException( + "A stale reload must not invoke its replacement factory.")); + + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + Task reloadTask = null; + IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + IDisposable requestScope = + server.RequestManager.EnterRequestScope(callbackContext); + try + { + await DeleteMonitoredItemAsync( + services, + subscriptionId, + monitoredItemId).ConfigureAwait(false); + + reloadTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle + .ReloadAsync(target, replacementFactory.Object) + .AsTask()); + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + using var timeout = new CancellationTokenSource( + TimeSpan.FromSeconds(10)); + await m_server.NodeManagerLifecycle + .RemoveAsync(target, timeout.Token) + .ConfigureAwait(false); + } + finally + { + requestScope.Dispose(); + dispatchScope.Dispose(); + } + + InvalidOperationException exception = + Assert.ThrowsAsync( + async () => await reloadTask.ConfigureAwait(false)); + Assert.That( + exception.Message, + Is.EqualTo( + "The registration is stale or is not owned by this lifecycle provider.")); + Assert.That(factoryCalls, Is.Zero); + Assert.That( + m_server.NodeManagerLifecycle.Registrations.Find( + registration => registration.Id == target.Id), + Is.Null); + + await AssertRetiredGenerationDisposedAsync( + retiredManager, + retireeValueId).ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(retireeReplacement) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + /// + /// Once final cleanup suspends event-delete fan-out, deletion of a pre-retirement + /// all-events item remains recorded in the retired manager's snapshot and is + /// unsubscribed during finalization. A post-retirement item is never added to that + /// snapshot and therefore receives neither subscribe nor unsubscribe callbacks. + /// + [Test] + public async Task SuspendedRetiredEventSnapshotFinalizesDeletedExistingItemOnlyAsync() + { + const string ProbeNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:SnapshotProbe"; + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint existingSubscriptionId, uint existingMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + ((IDynamicNodeManagerHost)master) + .SetRetiredGenerationDrainObserver(null); + (uint postSubscriptionId, uint postMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + Assert.That(retiredManager.AllEventsSubscribeCount, Is.EqualTo(1)); + + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + Task probeTask = null; + IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + IDisposable requestScope = + server.RequestManager.EnterRequestScope(callbackContext); + try + { + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + + RuntimeNodeSetOptions probeOptions = CreateOptions( + ProbeNamespaceUri, + value: 601); + probeTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(probeOptions) + .AsTask()); + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + await DeleteMonitoredItemAsync( + services, + existingSubscriptionId, + existingMonitoredItemId).ConfigureAwait(false); + await DeleteMonitoredItemAsync( + services, + postSubscriptionId, + postMonitoredItemId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsUnsubscribeCount, + Is.Zero, + "Suspended delete fan-out must leave finalization to the retained snapshot."); + } + finally + { + requestScope.Dispose(); + dispatchScope.Dispose(); + } + + NodeManagerRegistration probe = await probeTask.ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync( + retiredManager, + valueNodeId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsUnsubscribeCount, + Is.EqualTo(1), + "Only the pre-retirement subscription belongs to the retained snapshot."); + + await m_server.NodeManagerLifecycle.RemoveAsync(probe).ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, existingSubscriptionId) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, postSubscriptionId) + .ConfigureAwait(false); + } + + /// + /// An all-events deletion that already owns the monitored-item mutation gate completes + /// before shadow retirement snapshots subscriptions. The retired manager receives that + /// unsubscribe exactly once and final disposal does not replay it. + /// + [Test] + public async Task InFlightAllEventsDeleteIsNotRetainedOrUnsubscribedTwiceAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, uint eventMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + + var unsubscribeEntered = + new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var allowUnsubscribe = + new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + retiredManager.AllEventsCallback = async ( + IEventMonitoredItem monitoredItem, + bool unsubscribe, + CancellationToken cancellationToken) => + { + if (unsubscribe && monitoredItem.Id == eventMonitoredItemId) + { + unsubscribeEntered.TrySetResult(true); + await allowUnsubscribe.Task + .WaitAsync(cancellationToken) + .ConfigureAwait(false); + } + }; + + Task deleteTask = DeleteMonitoredItemAsync( + services, + eventSubscriptionId, + eventMonitoredItemId); + await unsubscribeEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + var replacementBound = + new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Task reloadTask = m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + kGeneration2Value, + manager => + { + manager.AllEventsCallback = ( + IEventMonitoredItem monitoredItem, + bool unsubscribe, + CancellationToken _) => + { + if (!unsubscribe && + monitoredItem.Id == eventMonitoredItemId) + { + replacementBound.TrySetResult(true); + } + return default; + }; + })) + .AsTask(); + try + { + await replacementBound.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That( + reloadTask.IsCompleted, + Is.False, + "Retirement must wait for the in-flight monitored-item mutation."); + } + finally + { + allowUnsubscribe.TrySetResult(true); + } + await deleteTask.ConfigureAwait(false); + NodeManagerRegistration reloaded = await reloadTask.ConfigureAwait(false); + Assert.That(retiredManager.AllEventsUnsubscribeCount, Is.EqualTo(1)); + + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync( + retiredManager, + valueNodeId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsUnsubscribeCount, + Is.EqualTo(1), + "Finalization must not replay an unsubscribe completed before retirement."); + + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId) + .ConfigureAwait(false); + } + + /// + /// Filter modification and ConditionRefresh keep reaching a shadow-retired manager + /// only for all-events items in its retirement snapshot. Post-retirement items are + /// excluded, and final cleanup removes the retired manager from both fan-outs. + /// + [Test] + public async Task RetiredAllEventsSnapshotReceivesModifyAndConditionRefreshUntilCleanupAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint existingSubscriptionId, uint existingMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + (uint postSubscriptionId, uint postMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + + Assert.That(retiredManager.AllEventsSubscribeCount, Is.EqualTo(1)); + await ModifyEventMonitoredItemAsync( + services, + existingSubscriptionId, + existingMonitoredItemId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsSubscribeCount, + Is.EqualTo(2), + "The retained manager must receive filter changes for its snapshotted item."); + await ModifyEventMonitoredItemAsync( + services, + postSubscriptionId, + postMonitoredItemId).ConfigureAwait(false); + Assert.That( + retiredManager.AllEventsSubscribeCount, + Is.EqualTo(2), + "A post-retirement item must not be added to the retained snapshot."); + + IList eventItems = + server.EventManager.GetMonitoredItems(); + IEventMonitoredItem existingItem = eventItems.Single( + monitoredItem => monitoredItem.Id == existingMonitoredItemId); + IEventMonitoredItem postItem = eventItems.Single( + monitoredItem => monitoredItem.Id == postMonitoredItemId); + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + await master + .ConditionRefreshAsync( + new OperationContext(session, DiagnosticsMasks.None), + [existingItem, postItem], + CancellationToken.None) + .ConfigureAwait(false); + Assert.That(retiredManager.ConditionRefreshCount, Is.EqualTo(1)); + Assert.That( + retiredManager.LastConditionRefreshMonitoredItemIds, + Is.EqualTo(new[] { existingMonitoredItemId }), + "ConditionRefresh must use the retired manager's exact item snapshot."); + + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync( + retiredManager, + valueNodeId).ConfigureAwait(false); + Assert.That(retiredManager.AllEventsUnsubscribeCount, Is.EqualTo(1)); + + await ModifyEventMonitoredItemAsync( + services, + existingSubscriptionId, + existingMonitoredItemId).ConfigureAwait(false); + await ModifyEventMonitoredItemAsync( + services, + postSubscriptionId, + postMonitoredItemId).ConfigureAwait(false); + await master + .ConditionRefreshAsync( + new OperationContext(session, DiagnosticsMasks.None), + [existingItem, postItem], + CancellationToken.None) + .ConfigureAwait(false); + Assert.That(retiredManager.AllEventsSubscribeCount, Is.EqualTo(2)); + Assert.That( + retiredManager.ConditionRefreshCount, + Is.EqualTo(1), + "A finalized retired manager must receive no further condition refresh."); + + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, existingSubscriptionId) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, postSubscriptionId) + .ConfigureAwait(false); + } + + [Test] + public async Task ConditionRefreshSnapshotLeasesLaterManagersBeforeDispatchAsync() + { + const string BlockingNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RefreshBlocking"; + const string ReloadedNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RefreshReloaded"; + TrackingLifecycleNodeManager blockingManager = null; + TrackingLifecycleNodeManager reloadedManager = null; + NodeManagerRegistration blockingRegistration = + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 701, + manager => blockingManager = manager, + BlockingNamespaceUri)) + .ConfigureAwait(false); + NodeManagerRegistration originalReloaded = + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 702, + manager => reloadedManager = manager, + ReloadedNamespaceUri)) + .ConfigureAwait(false); + + var dispatchEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseDispatch = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + blockingManager.ConditionRefreshCallback = async (_, ct) => + { + dispatchEntered.TrySetResult(true); + await releaseDispatch.Task.WaitAsync(ct).ConfigureAwait(false); + }; + bool callbackAfterDispose = false; + reloadedManager.ConditionRefreshCallback = (_, _) => + { + callbackAfterDispose = reloadedManager.DisposeCount > 0; + return default; + }; + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + Task refreshTask = master + .ConditionRefreshAsync( + new OperationContext(session, DiagnosticsMasks.None), + [], + CancellationToken.None) + .AsTask(); + await dispatchEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Task reloadTask = m_server.NodeManagerLifecycle + .ReloadAsync( + originalReloaded, + CreateTrackingNodeManagementFactory( + 703, + _ => { }, + ReloadedNamespaceUri)) + .AsTask(); + try + { + await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false); + Assert.That( + reloadTask.IsCompleted, + Is.False, + "Reload must wait for the lease captured for a later refresh target."); + Assert.That(reloadedManager.DisposeCount, Is.Zero); + } + finally + { + releaseDispatch.TrySetResult(true); + } + + await refreshTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + NodeManagerRegistration replacement = await reloadTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That(reloadedManager.ConditionRefreshCount, Is.EqualTo(1)); + Assert.That(callbackAfterDispose, Is.False); + Assert.That(reloadedManager.DisposeCount, Is.EqualTo(1)); + + await m_server.NodeManagerLifecycle.RemoveAsync(blockingRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(replacement) + .ConfigureAwait(false); + } + + [Test] + public async Task ConditionRefreshWorkerLeaseDelaysRetiredGenerationCleanupAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, _) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + var refreshEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRefresh = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + retiredManager.ConditionRefreshCallback = async (_, ct) => + { + refreshEntered.TrySetResult(true); + await releaseRefresh.Task.WaitAsync(ct).ConfigureAwait(false); + }; + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + server.SubscriptionManager.ConditionRefresh( + new OperationContext(session, DiagnosticsMasks.None), + eventSubscriptionId); + await refreshEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + NodeManagerRegistration reloaded = null; + try + { + reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + Assert.That( + retiredManager.DeleteAddressSpaceCount, + Is.Zero, + "Final cleanup must wait for the worker's retained dispatch lease."); + Assert.That( + retiredManager.Find(valueNodeId), + Is.Not.Null, + "The retired address space must remain alive while refresh dispatch is active."); + } + finally + { + releaseRefresh.TrySetResult(true); + } + + await AssertRetiredGenerationDisposedAsync(retiredManager, valueNodeId) + .ConfigureAwait(false); + Assert.That(retiredManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(retiredManager.AllEventsUnsubscribeCount, Is.EqualTo(1)); + + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId).ConfigureAwait(false); + if (reloaded is not null) + { + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + } + } + + [Test] + public async Task ConditionRefreshWorkerLifecycleCallDoesNotDeadlockFinalizationAsync() + { + const string ProbeNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RefreshLifecycleProbe"; + const string TriggerNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RefreshCleanupTrigger"; + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, _) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + ((IDynamicNodeManagerHost)master) + .SetRetiredGenerationDrainObserver(null); + + var dispatchEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var startLifecycle = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var lifecycleCallStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var probeFactoryEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var lifecycleCompleted = + new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Mock probeManager = + CreateLifecycleNodeManager(ProbeNamespaceUri); + var probeFactory = new CallbackSafeNodeManagerFactory( + [ProbeNamespaceUri], + (_, _, _) => + { + probeFactoryEntered.TrySetResult(true); + return new ValueTask(probeManager.Object); + }); + retiredManager.ConditionRefreshCallback = async (_, ct) => + { + dispatchEntered.TrySetResult(true); + await startLifecycle.Task.WaitAsync(ct).ConfigureAwait(false); + lifecycleCallStarted.TrySetResult(true); + try + { + NodeManagerRegistration probe = await m_server.NodeManagerLifecycle + .AddAsync(probeFactory, ct) + .ConfigureAwait(false); + lifecycleCompleted.TrySetResult(probe); + } + catch (Exception ex) + { + lifecycleCompleted.TrySetException(ex); + throw; + } + }; + + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + server.SubscriptionManager.ConditionRefresh( + new OperationContext(session, DiagnosticsMasks.None), + eventSubscriptionId); + await dispatchEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + Task cleanupTrigger = + RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 705, + _ => { }, + TriggerNamespaceUri)) + .AsTask()); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + startLifecycle.TrySetResult(true); + await lifecycleCallStarted.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await probeFactoryEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + NodeManagerRegistration probeRegistration = await lifecycleCompleted.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync(retiredManager, valueNodeId) + .ConfigureAwait(false); + NodeManagerRegistration triggerRegistration = await cleanupTrigger + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + await m_server.NodeManagerLifecycle.RemoveAsync(probeRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(triggerRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId).ConfigureAwait(false); + } + + [TestCase( + false, + TestName = "ConditionRefreshWorkerShutdownWakeupIsLosslessForShutdownAsync")] + [TestCase( + true, + TestName = "ConditionRefreshWorkerShutdownWakeupIsLosslessForDispose")] + public async Task ConditionRefreshWorkerShutdownWakeupIsLosslessAsync( + bool dispose) + { + IServerInternal server = m_server.CurrentInstance; + var manager = new SubscriptionManager( + server, + m_server.CurrentConfiguration); + var resetEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseReset = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var shutdownSignalStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + bool managerDisposed = false; + manager.BeforeConditionRefreshResetForTest = () => + { + resetEntered.TrySetResult(true); + releaseReset.Task.GetAwaiter().GetResult(); + }; + manager.BeforeConditionRefreshShutdownSignalForTest = () => + shutdownSignalStarted.TrySetResult(true); + + try + { + manager.StartConditionRefreshWorkerForTest(); + manager.WakeConditionRefreshWorkerForTest(); + await resetEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Task stopTask = RunWithoutExecutionContext(() => + { + if (dispose) + { + manager.Dispose(); + return Task.CompletedTask; + } + return manager.ShutdownAsync().AsTask(); + }); + await shutdownSignalStarted.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That( + stopTask.IsCompleted, + Is.False, + "Shutdown must be serialized with the worker's final reset."); + + releaseReset.TrySetResult(true); + await stopTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + managerDisposed = dispose; + if (!managerDisposed) + { + manager.Dispose(); + managerDisposed = true; + } + } + finally + { + releaseReset.TrySetResult(true); + manager.BeforeConditionRefreshResetForTest = null; + manager.BeforeConditionRefreshShutdownSignalForTest = null; + if (!managerDisposed) + { + manager.Dispose(); + } + } + } + + [Test] + public async Task CompleteShutdownWaitsForRetiredConditionRefreshDispatchAsync() + { + var lifecycle = new NodeManagerLifecycle(m_server); + var releaseRefresh = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + try + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await lifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, _) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + await lifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + + var refreshEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + retiredManager.ConditionRefreshCallback = async (_, ct) => + { + refreshEntered.TrySetResult(true); + await releaseRefresh.Task.WaitAsync(ct).ConfigureAwait(false); + }; + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + server.SubscriptionManager.ConditionRefresh( + new OperationContext(session, DiagnosticsMasks.None), + eventSubscriptionId); + await refreshEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + await lifecycle.BeginShutdownAsync(server).ConfigureAwait(false); + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + Task completeShutdown = lifecycle + .CompleteShutdownAsync(server) + .AsTask(); + try + { + Assert.That( + completeShutdown.IsCompleted, + Is.False, + "Shutdown teardown must wait for the retained worker dispatch."); + Assert.That(retiredManager.DisposeCount, Is.Zero); + } + finally + { + releaseRefresh.TrySetResult(true); + } + + await completeShutdown + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That(retiredManager.DisposeCount, Is.EqualTo(1)); + Assert.That(lifecycle.Registrations, Is.Empty); + + await DeleteSubscriptionAsync(services, dataSubscriptionId) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId) + .ConfigureAwait(false); + } + finally + { + releaseRefresh.TrySetResult(true); + lifecycle.Dispose(); + } + } + + [Test] + public async Task CancelledCompleteShutdownRemainsRetryableAfterDisposeAsync() + { + var lifecycle = new NodeManagerLifecycle(m_server); + var releaseRefresh = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + try + { + TrackingLifecycleNodeManager retiredManager = null; + TrackingLifecycleNodeManager replacementManager = null; + NodeManagerRegistration original = await lifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var services = new ServerTestServices(m_server, m_secureChannelContext); + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, _) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + await lifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + kGeneration2Value, + manager => replacementManager = manager)) + .ConfigureAwait(false); + + var refreshEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + retiredManager.ConditionRefreshCallback = async (_, ct) => + { + refreshEntered.TrySetResult(true); + await releaseRefresh.Task.WaitAsync(ct).ConfigureAwait(false); + }; + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + server.SubscriptionManager.ConditionRefresh( + new OperationContext(session, DiagnosticsMasks.None), + eventSubscriptionId); + await refreshEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + await lifecycle.BeginShutdownAsync(server).ConfigureAwait(false); + using (var cts = new CancellationTokenSource()) + { + Task cancelledShutdown = lifecycle + .CompleteShutdownAsync(server, cts.Token) + .AsTask(); + await Task.Delay(TimeSpan.FromMilliseconds(100)) + .ConfigureAwait(false); + Assert.That( + cancelledShutdown.IsCompleted, + Is.False, + "Shutdown must be waiting for the in-flight refresh dispatch."); + cts.Cancel(); + Assert.That( + async () => await cancelledShutdown.ConfigureAwait(false), + Throws.InstanceOf()); + } + + lifecycle.Dispose(); + releaseRefresh.TrySetResult(true); + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + await lifecycle + .CompleteShutdownAsync(server) + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Assert.That(lifecycle.Registrations, Is.Empty); + Assert.That(retiredManager.DisposeCount, Is.EqualTo(1)); + Assert.That(replacementManager.DisposeCount, Is.EqualTo(1)); + + await DeleteSubscriptionAsync(services, dataSubscriptionId) + .ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId) + .ConfigureAwait(false); + } + finally + { + releaseRefresh.TrySetResult(true); + lifecycle.Dispose(); + } + } + + [TestCase(RetainedNotificationDispatchKind.Session)] + [TestCase(RetainedNotificationDispatchKind.Modify)] + [TestCase(RetainedNotificationDispatchKind.EventDelete)] + public async Task RetiredNotificationFinalizationWaitsForInFlightDispatchAsync( + RetainedNotificationDispatchKind dispatchKind) + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint dataSubscriptionId, uint dataMonitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + (uint eventSubscriptionId, uint eventMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + + var dispatchEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseDispatch = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + Task dispatchTask; + switch (dispatchKind) + { + case RetainedNotificationDispatchKind.Session: + retiredManager.SessionActivatedCallback = async ct => + { + dispatchEntered.TrySetResult(true); + await releaseDispatch.Task.WaitAsync(ct).ConfigureAwait(false); + }; + dispatchTask = master + .SessionActivatedAsync( + new OperationContext(session, DiagnosticsMasks.None), + session.Id, + CancellationToken.None) + .AsTask(); + break; + case RetainedNotificationDispatchKind.Modify: + retiredManager.AllEventsCallback = async ( + monitoredItem, + unsubscribe, + ct) => + { + if (!unsubscribe && + monitoredItem.Id == eventMonitoredItemId) + { + dispatchEntered.TrySetResult(true); + await releaseDispatch.Task.WaitAsync(ct).ConfigureAwait(false); + } + }; + dispatchTask = ModifyEventMonitoredItemAsync( + services, + eventSubscriptionId, + eventMonitoredItemId); + break; + case RetainedNotificationDispatchKind.EventDelete: + retiredManager.AllEventsCallback = async ( + monitoredItem, + unsubscribe, + ct) => + { + if (unsubscribe && + monitoredItem.Id == eventMonitoredItemId) + { + dispatchEntered.TrySetResult(true); + await releaseDispatch.Task.WaitAsync(ct).ConfigureAwait(false); + } + }; + dispatchTask = DeleteMonitoredItemAsync( + services, + eventSubscriptionId, + eventMonitoredItemId); + break; + default: + throw new ArgumentOutOfRangeException(nameof(dispatchKind)); + } + + await dispatchEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Task finalizeTask = ((IDynamicNodeManagerHost)master) + .FinalizeRetiredGenerationNotificationsAsync( + retiredManager, + CancellationToken.None) + .AsTask(); + try + { + Assert.That( + finalizeTask.IsCompleted, + Is.False, + "Finalization must wait for the captured retained dispatch lease."); + } + finally + { + releaseDispatch.TrySetResult(true); + } + await dispatchTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await finalizeTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + await DeleteMonitoredItemAsync( + services, + dataSubscriptionId, + dataMonitoredItemId).ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync(retiredManager, valueNodeId) + .ConfigureAwait(false); + if (dispatchKind != RetainedNotificationDispatchKind.EventDelete) + { + await DeleteMonitoredItemAsync( + services, + eventSubscriptionId, + eventMonitoredItemId).ConfigureAwait(false); + } + await DeleteSubscriptionAsync(services, dataSubscriptionId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, eventSubscriptionId).ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + } + + [Test] + public async Task RetiredOwnedEventConditionRefreshExcludesReplacementItemAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var rootNodeId = new NodeId(kRootNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint retiredMonitoredItemId) = + await CreateSubscriptionAndEventMonitoredItemAsync( + services, + rootNodeId).ConfigureAwait(false); + TrackingLifecycleNodeManager replacementManager = null; + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + kGeneration2Value, + manager => replacementManager = manager)) + .ConfigureAwait(false); + uint replacementMonitoredItemId = await CreateEventMonitoredItemAsync( + services, + subscriptionId, + rootNodeId, + clientHandle: 2).ConfigureAwait(false); + + IList eventItems = + server.EventManager.GetMonitoredItems(); + IEventMonitoredItem retiredItem = eventItems.Single( + monitoredItem => monitoredItem.Id == retiredMonitoredItemId); + IEventMonitoredItem replacementItem = eventItems.Single( + monitoredItem => monitoredItem.Id == replacementMonitoredItemId); + Assert.That(retiredItem.NodeManager, Is.SameAs(retiredManager)); + Assert.That(replacementItem.NodeManager, Is.SameAs(replacementManager)); + + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + server.SubscriptionManager.ConditionRefresh( + new OperationContext(session, DiagnosticsMasks.None), + subscriptionId); + await WaitForConditionRefreshCountAsync(retiredManager, 1) + .ConfigureAwait(false); + + Assert.That( + retiredManager.LastConditionRefreshMonitoredItemIds, + Is.EqualTo(new[] { retiredMonitoredItemId }), + "The retired generation must receive its owned item, but not the " + + "replacement generation's post-retirement item."); + + await DeleteMonitoredItemAsync( + services, + subscriptionId, + retiredMonitoredItemId).ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync(retiredManager, rootNodeId) + .ConfigureAwait(false); + await DeleteMonitoredItemAsync( + services, + subscriptionId, + replacementMonitoredItemId).ConfigureAwait(false); + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + await m_server.NodeManagerLifecycle.RemoveAsync(reloaded).ConfigureAwait(false); + } + + [Test] + [SuppressMessage( + "Reliability", + "CA2025:Ensure tasks using IDisposable instances complete before the instances are disposed", + Justification = "The test deliberately keeps a CreateSession request alive across disposal.")] + public async Task DisposeDefersBaseResourcesUntilAdmittedCreateSessionCompletesAsync() + { + var requestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequest = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var requestDrainStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Certificate requestCertificate = null; + m_server.BeforeCreateSessionServerSignatureForTest = certificate => + { + requestCertificate = certificate; + requestEntered.TrySetResult(true); + releaseRequest.Task.GetAwaiter().GetResult(); + }; + m_server.AfterServerRequestDrainStartedForTest = () => + requestDrainStarted.TrySetResult(true); + + var trackingListener = new Mock(); + trackingListener + .Setup(listener => listener.DisposeAsync()) + .Returns(default(ValueTask)); + int originalTransportCount = m_server.TransportListenerCountForTest; + Assert.That(originalTransportCount, Is.GreaterThan(0)); + m_server.AddTransportListenerForTest(trackingListener.Object); + + CreateSessionResponse response = default; + Task createSession = RunWithoutExecutionContext(async () => + { + response = await m_server.CreateSessionAsync( + m_secureChannelContext, + new RequestHeader(), + null, + null, + null, + "DisposeCreateSessionRace", + default, + default, + ServerFixtureUtils.DefaultSessionTimeout, + ServerFixtureUtils.DefaultMaxResponseMessageSize, + RequestLifetime.None) + .ConfigureAwait(false); + }); + await requestEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + m_requestHeader = null; + Task shutdown = m_server.ShutdownInternalsAsync().AsTask(); + try + { + await requestDrainStarted.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Task firstDispose = RunWithoutExecutionContext(() => + { + m_server.Dispose(); + return Task.CompletedTask; + }); + Task secondDispose = RunWithoutExecutionContext(() => + { + m_server.Dispose(); + return Task.CompletedTask; + }); + await Task.WhenAll(firstDispose, secondDispose) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(createSession.IsCompleted, Is.False); + Assert.That(shutdown.IsCompleted, Is.False); + Assert.That(m_server.BaseResourcesDisposedForTest, Is.False); + Assert.That(m_server.BaseResourceDisposalCountForTest, Is.Zero); + Assert.That( + m_server.TransportListenerCountForTest, + Is.EqualTo(originalTransportCount + 1)); + Assert.That(m_server.CertificateManager, Is.Not.Null); + Assert.That(requestCertificate, Is.Not.Null); + }); + using var certificateEntry = m_server.CertificateManager + .AcquireApplicationCertificateBySecurityPolicy(SecurityPolicies.None); + Assert.That(certificateEntry, Is.Not.Null); + + releaseRequest.TrySetResult(true); + await Task.WhenAll(createSession, shutdown) + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await WaitForConditionAsync( + () => m_server.BaseResourcesDisposedForTest) + .ConfigureAwait(false); + } + finally + { + releaseRequest.TrySetResult(true); + m_server.BeforeCreateSessionServerSignatureForTest = null; + m_server.AfterServerRequestDrainStartedForTest = null; + } + + ServerFixtureUtils.ValidateResponse(response.ResponseHeader); + Assert.Multiple(() => + { + Assert.That(m_server.BaseResourceDisposalCountForTest, Is.EqualTo(1)); + Assert.That(m_server.TransportListenerCountForTest, Is.Zero); + Assert.That(m_server.ServerSemaphoreDisposedForTest, Is.True); + Assert.That( + m_server.DeferredServerShutdownTerminalErrorForTest, + Is.Null); + }); + trackingListener.Verify(listener => listener.DisposeAsync(), Times.Once); + + m_server.Dispose(); + Assert.That(m_server.BaseResourceDisposalCountForTest, Is.EqualTo(1)); + trackingListener.Verify(listener => listener.DisposeAsync(), Times.Once); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task DisposeWaitsForAddRequestDrainBeforeDisposingInternalsAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DisposeAddDrain"; + Mock manager = CreateLifecycleNodeManager(NamespaceUri); + int disposeCount = 0; + manager.As() + .Setup(disposable => disposable.Dispose()) + .Callback(() => Interlocked.Increment(ref disposeCount)); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(manager.Object); + + IServerInternal server = m_server.CurrentInstance; + var requestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequest = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Task requestTask = HoldRequestAsync( + server, + requestEntered, + releaseRequest); + await requestEntered.Task.ConfigureAwait(false); + Task addTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle.AddAsync(factory.Object).AsTask()); + await WaitForRegistrationAsync( + m_server.NodeManagerLifecycle, + manager.Object).ConfigureAwait(false); + + m_requestHeader = null; + m_server.Dispose(); + await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false); + Assert.That(addTask.IsCompleted, Is.False); + Assert.That( + Volatile.Read(ref disposeCount), + Is.Zero, + "Dispose must not tear down a manager while Add is draining requests."); + + releaseRequest.TrySetResult(true); + await requestTask.ConfigureAwait(false); + await AssertLifecycleOperationDidNotUseDisposedServicesAsync(addTask) + .ConfigureAwait(false); + await WaitForConditionAsync(() => Volatile.Read(ref disposeCount) == 1) + .ConfigureAwait(false); + + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task DisposeWaitsForReloadRequestDrainBeforeDisposingInternalsAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DisposeReloadDrainServer"; + Mock originalManager = + CreateLifecycleNodeManager(NamespaceUri); + int originalDisposeCount = 0; + originalManager.As() + .Setup(disposable => disposable.Dispose()) + .Callback(() => Interlocked.Increment(ref originalDisposeCount)); + originalManager + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask>([])); + Mock replacementManager = + CreateLifecycleNodeManager(NamespaceUri); + int replacementDisposeCount = 0; + replacementManager.As() + .Setup(disposable => disposable.Dispose()) + .Callback(() => Interlocked.Increment(ref replacementDisposeCount)); + var originalFactory = new Mock(); + originalFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(originalManager.Object); + var replacementFactory = new Mock(); + replacementFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(replacementManager.Object); + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(originalFactory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var requestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequest = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Task requestTask = HoldRequestAsync( + server, + requestEntered, + releaseRequest); + await requestEntered.Task.ConfigureAwait(false); + Task reloadTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle + .ReloadAsync(original, replacementFactory.Object) + .AsTask()); + await WaitForRegistrationAsync( + m_server.NodeManagerLifecycle, + original.Id, + replacementManager.Object).ConfigureAwait(false); + + m_requestHeader = null; + m_server.Dispose(); + await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false); + Assert.That(reloadTask.IsCompleted, Is.False); + Assert.That(Volatile.Read(ref originalDisposeCount), Is.Zero); + Assert.That( + Volatile.Read(ref replacementDisposeCount), + Is.Zero, + "Dispose must not tear down either reload generation during the drain."); + + releaseRequest.TrySetResult(true); + await requestTask.ConfigureAwait(false); + await AssertLifecycleOperationDidNotUseDisposedServicesAsync(reloadTask) + .ConfigureAwait(false); + await WaitForConditionAsync( + () => Volatile.Read(ref originalDisposeCount) == 1 && + Volatile.Read(ref replacementDisposeCount) == 1) + .ConfigureAwait(false); + + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task DisposeWaitsForRemoveRequestDrainBeforeDisposingInternalsAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DisposeRemoveDrainServer"; + Mock manager = CreateLifecycleNodeManager(NamespaceUri); + int disposeCount = 0; + manager.As() + .Setup(disposable => disposable.Dispose()) + .Callback(() => Interlocked.Increment(ref disposeCount)); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(manager.Object); + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + var requestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequest = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Task requestTask = HoldRequestAsync( + server, + requestEntered, + releaseRequest); + await requestEntered.Task.ConfigureAwait(false); + Task removeTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle.RemoveAsync(registration).AsTask()); + await WaitForNodeManagerVisibilityAsync( + master, + manager.Object, + visible: false).ConfigureAwait(false); + + m_requestHeader = null; + m_server.Dispose(); + await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false); + Assert.That(removeTask.IsCompleted, Is.False); + Assert.That( + Volatile.Read(ref disposeCount), + Is.Zero, + "Dispose must not tear down the removed manager during its request drain."); + + releaseRequest.TrySetResult(true); + await requestTask.ConfigureAwait(false); + await AssertLifecycleOperationDidNotUseDisposedServicesAsync(removeTask) + .ConfigureAwait(false); + await WaitForConditionAsync(() => Volatile.Read(ref disposeCount) == 1) + .ConfigureAwait(false); + + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + [SuppressMessage( + "Reliability", + "CA2025:Ensure tasks using IDisposable instances complete before the instances are disposed", + Justification = "The test deliberately keeps a request alive across server disposal.")] + public async Task CancelledServerShutdownRetainsInternalsAndRetriesAfterAddDrainAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:CancelledServerShutdown"; + Mock manager = CreateLifecycleNodeManager(NamespaceUri); + int disposeCount = 0; + manager.As() + .Setup(disposable => disposable.Dispose()) + .Callback(() => Interlocked.Increment(ref disposeCount)); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(manager.Object); + + IServerInternal server = m_server.CurrentInstance; + var requestEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRequest = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + Task requestTask = HoldRequestAsync( + server, + requestEntered, + releaseRequest); + await requestEntered.Task.ConfigureAwait(false); + Task addTask = RunWithoutExecutionContext( + () => m_server.NodeManagerLifecycle.AddAsync(factory.Object).AsTask()); + await WaitForRegistrationAsync( + m_server.NodeManagerLifecycle, + manager.Object).ConfigureAwait(false); + + using (var cts = new CancellationTokenSource()) + { + Task shutdownTask = m_server + .ShutdownInternalsAsync(cts.Token) + .AsTask(); + await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false); + Assert.That(shutdownTask.IsCompleted, Is.False); + cts.Cancel(); + Assert.That( + async () => await shutdownTask.ConfigureAwait(false), + Throws.InstanceOf()); + } + + Assert.That(m_server.CurrentInstance, Is.SameAs(server)); + Assert.That(Volatile.Read(ref disposeCount), Is.Zero); + Assert.That(addTask.IsCompleted, Is.False); + + releaseRequest.TrySetResult(true); + await requestTask.ConfigureAwait(false); + await AssertLifecycleOperationDidNotUseDisposedServicesAsync(addTask) + .ConfigureAwait(false); + m_requestHeader = null; + await m_server.ShutdownInternalsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Assert.That(Volatile.Read(ref disposeCount), Is.EqualTo(1)); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task ConditionRefreshWorkerCompletesBeforeServerDeletesAddressSpacesAsync() + { + TrackingLifecycleNodeManager manager = null; + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + created => manager = created)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, _) = await CreateSubscriptionAndEventMonitoredItemAsync( + services, + ObjectIds.Server).ConfigureAwait(false); + var refreshEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRefresh = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + manager.ConditionRefreshCallback = async (_, ct) => + { + refreshEntered.TrySetResult(true); + await releaseRefresh.Task.WaitAsync(ct).ConfigureAwait(false); + }; + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + server.SubscriptionManager.ConditionRefresh( + new OperationContext(session, DiagnosticsMasks.None), + subscriptionId); + await refreshEntered.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Task shutdownTask = m_server.ShutdownInternalsAsync().AsTask(); + try + { + await Task.Delay(TimeSpan.FromMilliseconds(100)).ConfigureAwait(false); + Assert.That(shutdownTask.IsCompleted, Is.False); + Assert.That( + manager.DeleteAddressSpaceCount, + Is.Zero, + "The real ConditionRefresh worker must exit before address-space deletion."); + Assert.That(manager.DisposeCount, Is.Zero); + } + finally + { + releaseRefresh.TrySetResult(true); + } + + m_requestHeader = null; + await shutdownTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That(manager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(manager.DisposeCount, Is.EqualTo(1)); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task FailedServerShutdownAggregatesManagersAndRetriesRetainedCleanupAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + TrackingLifecycleNodeManager replacementManager = null; + TrackingLifecycleNodeManager successfulManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + created => retiredManager = created)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var services = new ServerTestServices(m_server, m_secureChannelContext); + await CreateSubscriptionAndMonitoredItemAsync( + services, + new NodeId(kValueNodeId, ns), + clientHandle: 1).ConfigureAwait(false); + NodeManagerRegistration replacement = await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + kGeneration2Value, + created => replacementManager = created)) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 803, + created => successfulManager = created, + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownSuccess")) + .ConfigureAwait(false); + + replacementManager.DisposeFailuresRemaining = 1; + retiredManager.DeleteAddressSpaceFailuresRemaining = 1; + m_requestHeader = null; + AggregateException failure = Assert.ThrowsAsync( + async () => await m_server.ShutdownInternalsAsync().ConfigureAwait(false)); + + Assert.That(failure.Flatten().InnerExceptions, Has.Count.EqualTo(2)); + Assert.That(m_server.CurrentInstance, Is.SameAs(server)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations, + Has.Count.EqualTo(1)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations[0].Id, + Is.EqualTo(replacement.Id)); + Assert.That(replacementManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(replacementManager.DisposeCount, Is.EqualTo(1)); + Assert.That(retiredManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(retiredManager.DisposeCount, Is.Zero); + Assert.That(successfulManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(successfulManager.DisposeCount, Is.EqualTo(1)); + + await m_server.ShutdownInternalsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + Assert.That( + replacementManager.DeleteAddressSpaceCount, + Is.EqualTo(1), + "A successful destroy stage must not be repeated after Dispose fails."); + Assert.That(replacementManager.DisposeCount, Is.EqualTo(2)); + Assert.That(retiredManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + Assert.That(retiredManager.DisposeCount, Is.EqualTo(1)); + Assert.That(successfulManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(successfulManager.DisposeCount, Is.EqualTo(1)); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task RetiredCleanupCheckpointsDestroyAcrossDisposeRetryAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + TrackingLifecycleNodeManager replacementManager = null; + var lifecycle = (NodeManagerLifecycle)m_server.NodeManagerLifecycle; + NodeManagerRegistration original = await lifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 805, + created => retiredManager = created)) + .ConfigureAwait(false); + retiredManager.DisposeFailuresRemaining = 1; + + NodeManagerReloadCommittedException reloadFailure = + Assert.ThrowsAsync( + async () => await lifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + 806, + created => replacementManager = created)) + .ConfigureAwait(false)); + + Assert.That( + reloadFailure.Registration.NodeManager, + Is.SameAs(replacementManager)); + Assert.That(reloadFailure.InnerException, Is.TypeOf()); + Assert.That(lifecycle.RetiredNodeManagerCount, Is.EqualTo(1)); + Assert.That(retiredManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(retiredManager.DisposeCount, Is.EqualTo(1)); + long progressAfterDisposeFailure = lifecycle.ShutdownCleanupProgress; + Assert.That( + progressAfterDisposeFailure, + Is.GreaterThan(0), + "Completed retired cleanup stages must be observable as shutdown progress."); + + m_requestHeader = null; + m_server.Dispose(); + await WaitForConditionAsync( + () => m_server.ServerSemaphoreDisposedForTest) + .ConfigureAwait(false); + + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(1)); + Assert.That( + retiredManager.DeleteAddressSpaceCount, + Is.EqualTo(1), + "A successful retired destroy stage must not be repeated after Dispose fails."); + Assert.That(retiredManager.DisposeCount, Is.EqualTo(2)); + Assert.That(lifecycle.RetiredNodeManagerCount, Is.Zero); + Assert.That( + lifecycle.ShutdownCleanupProgress, + Is.GreaterThan(progressAfterDisposeFailure), + "Successful disposal and retired-record removal must report retry progress."); + Assert.That( + m_server.DeferredServerShutdownTerminalErrorForTest, + Is.Null); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task MasterNodeManagerShutdownAggregatesAndCheckpointsPerManagerAsync() + { + TrackingLifecycleNodeManager firstManager = null; + TrackingLifecycleNodeManager successfulManager = null; + TrackingLifecycleNodeManager lastManager = null; + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 811, + created => firstManager = created, + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownCheckpoint1")) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 812, + created => successfulManager = created, + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownCheckpoint2")) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 813, + created => lastManager = created, + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownCheckpoint3")) + .ConfigureAwait(false); + + firstManager.DeleteAddressSpaceFailuresRemaining = 1; + lastManager.DeleteAddressSpaceFailuresRemaining = 1; + IServerInternal server = m_server.CurrentInstance; + AggregateException failure = Assert.ThrowsAsync( + async () => await server.NodeManager.ShutdownAsync().ConfigureAwait(false)); + + Assert.That(failure.Flatten().InnerExceptions, Has.Count.EqualTo(2)); + Assert.That(firstManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(successfulManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(lastManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + + await server.NodeManager.ShutdownAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Assert.That(firstManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + Assert.That( + successfulManager.DeleteAddressSpaceCount, + Is.EqualTo(1), + "A manager that completed cleanup must not be called again."); + Assert.That(lastManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + + m_requestHeader = null; + await m_server.ShutdownInternalsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That(firstManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + Assert.That(successfulManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(lastManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + AssertServerInternalsDisposed(); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task DeferredDisposeRetriesUntilRetainedCleanupCompletesAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + TrackingLifecycleNodeManager replacementManager = null; + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 821, + created => retiredManager = created)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var services = new ServerTestServices(m_server, m_secureChannelContext); + await CreateSubscriptionAndMonitoredItemAsync( + services, + new NodeId(kValueNodeId, ns), + clientHandle: 1).ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + original, + CreateTrackingNodeManagementFactory( + 822, + created => replacementManager = created)) + .ConfigureAwait(false); + + replacementManager.DeleteAddressSpaceFailuresRemaining = 1; + retiredManager.DeleteAddressSpaceFailuresRemaining = 1; + m_requestHeader = null; + m_server.Dispose(); + + await WaitForConditionAsync( + () => m_server.ServerSemaphoreDisposedForTest) + .ConfigureAwait(false); + + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(3)); + Assert.That(replacementManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + Assert.That(replacementManager.DisposeCount, Is.EqualTo(1)); + Assert.That(retiredManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + Assert.That(retiredManager.DisposeCount, Is.EqualTo(1)); + Assert.That( + m_server.DeferredServerShutdownTerminalErrorForTest, + Is.Null); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task DeferredDisposeStopsRetryingWhenCleanupMakesNoProgressAsync() + { + TrackingLifecycleNodeManager failingManager = null; + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 831, + created => failingManager = created, + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownPermanentFailure")) + .ConfigureAwait(false); + failingManager.DeleteAddressSpaceFailuresRemaining = int.MaxValue; + IServerInternal server = m_server.CurrentInstance; + int transportCountBeforeDispose = m_server.TransportListenerCountForTest; + + m_requestHeader = null; + m_server.Dispose(); + await WaitForConditionAsync( + () => m_server.DeferredServerShutdownTerminalErrorForTest is not null) + .ConfigureAwait(false); + + Exception terminalError = + m_server.DeferredServerShutdownTerminalErrorForTest; + Assert.That( + terminalError.Message, + Does.Contain("latest attempt made no cleanup progress")); + Assert.That(ServiceResult.IsBad(m_server.ServerError), Is.True); + Assert.That(m_server.CurrentInstance, Is.SameAs(server)); + Assert.That(m_server.ServerSemaphoreDisposedForTest, Is.False); + Assert.That(m_server.BaseResourcesDisposedForTest, Is.False); + Assert.That(m_server.BaseResourceDisposalCountForTest, Is.Zero); + Assert.That( + m_server.TransportListenerCountForTest, + Is.EqualTo(transportCountBeforeDispose)); + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(2)); + Assert.That(failingManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + + await Task.Delay(TimeSpan.FromMilliseconds(250)).ConfigureAwait(false); + Assert.That( + m_server.ServerShutdownAttemptCountForTest, + Is.EqualTo(2), + "A permanent failure must not cause an unbounded retry loop."); + Assert.That(failingManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + + failingManager.DeleteAddressSpaceFailuresRemaining = 0; + await m_server.ShutdownInternalsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await WaitForConditionAsync( + () => m_server.BaseResourcesDisposedForTest) + .ConfigureAwait(false); + + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(3)); + Assert.That(m_server.BaseResourceDisposalCountForTest, Is.EqualTo(1)); + Assert.That(m_server.TransportListenerCountForTest, Is.Zero); + Assert.That(m_server.ServerSemaphoreDisposedForTest, Is.True); + Assert.That(failingManager.DeleteAddressSpaceCount, Is.EqualTo(3)); + Assert.That( + m_server.DeferredServerShutdownTerminalErrorForTest, + Is.Null); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task DeferredDisposeStopsRetryingAtBoundDespiteCleanupProgressAsync() + { + TrackingLifecycleNodeManager failingManager = null; + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 832, + created => failingManager = created, + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownBoundedFailure")) + .ConfigureAwait(false); + failingManager.DeleteAddressSpaceFailuresRemaining = int.MaxValue; + m_server.DeferredServerShutdownMaxRetryCount = 1; + int progressTicks = 0; + m_server.AdditionalServerShutdownProgressForTest = + () => Interlocked.Increment(ref progressTicks); + + bool unobservedTaskException = false; + EventHandler handler = (_, args) => + { + unobservedTaskException = true; + args.SetObserved(); + }; + TaskScheduler.UnobservedTaskException += handler; + + try + { + m_requestHeader = null; + m_server.Dispose(); + await WaitForConditionAsync( + () => m_server.DeferredServerShutdownTerminalErrorForTest is not null) + .ConfigureAwait(false); + + Exception terminalError = + m_server.DeferredServerShutdownTerminalErrorForTest; + Assert.Multiple(() => + { + Assert.That( + terminalError.Message, + Does.Contain("exceeded the deferred retry limit")); + Assert.That(ServiceResult.IsBad(m_server.ServerError), Is.True); + Assert.That(m_server.ServerShutdownAttemptCountForTest, Is.EqualTo(2)); + Assert.That(failingManager.DeleteAddressSpaceCount, Is.EqualTo(2)); + Assert.That(Volatile.Read(ref progressTicks), Is.GreaterThan(2)); + }); + + for (int collection = 0; collection < 3; collection++) + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + await Task.Yield(); + } + + Assert.That( + unobservedTaskException, + Is.False, + "Deferred shutdown failures must be awaited by the observer."); + } + finally + { + TaskScheduler.UnobservedTaskException -= handler; + m_server.AdditionalServerShutdownProgressForTest = null; + } + + failingManager.DeleteAddressSpaceFailuresRemaining = 0; + await m_server.ShutdownInternalsAsync() + .AsTask() + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await WaitForConditionAsync( + () => m_server.BaseResourcesDisposedForTest) + .ConfigureAwait(false); + + Assert.That( + m_server.DeferredServerShutdownTerminalErrorForTest, + Is.Null); + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + [Test] + public async Task ConcurrentShutdownAndDisposeDefersSemaphoreDisposalAsync() + { + var shutdownHoldingSemaphore = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseShutdown = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + m_server.BeforeServerShutdownSemaphoreReleaseForTest = async () => + { + shutdownHoldingSemaphore.TrySetResult(true); + await releaseShutdown.Task.ConfigureAwait(false); + }; + + try + { + m_requestHeader = null; + Task shutdownTask = m_server.ShutdownInternalsAsync().AsTask(); + await shutdownHoldingSemaphore.Task + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Task disposeTask = RunWithoutExecutionContext(() => + { + m_server.Dispose(); + return Task.CompletedTask; + }); + await disposeTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + + Assert.That(shutdownTask.IsCompleted, Is.False); + Assert.That( + m_server.ServerSemaphoreDisposedForTest, + Is.False, + "Dispose must join the active shutdown instead of disposing its held semaphore."); + + releaseShutdown.TrySetResult(true); + await shutdownTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await WaitForConditionAsync( + () => m_server.ServerSemaphoreDisposedForTest) + .ConfigureAwait(false); + } + finally + { + releaseShutdown.TrySetResult(true); + m_server.BeforeServerShutdownSemaphoreReleaseForTest = null; + } + + await FinishShutdownTestAsync().ConfigureAwait(false); + } + + /// + /// Shutdown intent acquired while Remove is draining waits for that operation, rejects + /// new work, and prevents removal rollback from republishing the manager. Disposing + /// after shutdown intent defers semaphore disposal through CompleteShutdown. + /// + [Test] + public async Task ShutdownThenDisposeDuringRemoveDrainDoesNotRepublishAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShutdownRemoveDrain"; + Mock nodeManager = + CreateLifecycleNodeManager(NamespaceUri); + Mock disposable = nodeManager.As(); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(nodeManager.Object); + var lifecycle = new NodeManagerLifecycle(m_server); + IDisposable dispatchScope = null; + IDisposable requestScope = null; + try + { + NodeManagerRegistration registration = await lifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false); + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + dispatchScope = server.RequestManager.EnterServiceDispatchScope(); + requestScope = server.RequestManager.EnterRequestScope(callbackContext); + Task removeTask = RunWithoutExecutionContext( + () => lifecycle.RemoveAsync(registration).AsTask()); + await WaitForNodeManagerVisibilityAsync( + master, + nodeManager.Object, + visible: false).ConfigureAwait(false); + + Task shutdownTask = lifecycle.BeginShutdownAsync(server).AsTask(); + Assert.That( + async () => await lifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "shutting down")); + Assert.That( + shutdownTask.IsCompleted, + Is.False, + "BeginShutdown must wait for the active Remove across its drain window."); + + lifecycle.Dispose(); + requestScope.Dispose(); + requestScope = null; + dispatchScope.Dispose(); + dispatchScope = null; + + Assert.ThrowsAsync( + async () => await removeTask.ConfigureAwait(false)); + await shutdownTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That( + master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, nodeManager.Object)), + Is.False, + "Shutdown-aware removal recovery must not republish the manager."); + + await lifecycle.CompleteShutdownAsync(server).ConfigureAwait(false); + Assert.That(lifecycle.Registrations, Is.Empty); + nodeManager.Verify( + value => value.DeleteAddressSpaceAsync(CancellationToken.None), + Times.Once); + disposable.Verify(value => value.Dispose(), Times.Once); + } + finally + { + requestScope?.Dispose(); + dispatchScope?.Dispose(); + lifecycle.Dispose(); + } + } + + /// + /// Dispose acquired first while Reload is draining marks shutdown intent but defers + /// semaphore disposal. BeginShutdown can join the in-flight operation, and Reload + /// reports its already committed generation without failing on a disposed semaphore. + /// + [Test] + public async Task DisposeThenShutdownDuringReloadDrainDefersSemaphoreDisposalAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DisposeReloadDrain"; + Mock originalManager = + CreateLifecycleNodeManager(NamespaceUri); + Mock originalDisposable = + originalManager.As(); + originalManager + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask>([])); + Mock replacementManager = + CreateLifecycleNodeManager(NamespaceUri); + Mock replacementDisposable = + replacementManager.As(); + var originalFactory = new Mock(); + originalFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(originalManager.Object); + var replacementFactory = new Mock(); + replacementFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(replacementManager.Object); + var lifecycle = new NodeManagerLifecycle(m_server); + IDisposable dispatchScope = null; + IDisposable requestScope = null; + try + { + NodeManagerRegistration original = await lifecycle + .AddAsync(originalFactory.Object) + .ConfigureAwait(false); + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + dispatchScope = server.RequestManager.EnterServiceDispatchScope(); + requestScope = server.RequestManager.EnterRequestScope(callbackContext); + Task reloadTask = RunWithoutExecutionContext( + () => lifecycle + .ReloadAsync(original, replacementFactory.Object) + .AsTask()); + await WaitForRegistrationAsync( + lifecycle, + original.Id, + replacementManager.Object).ConfigureAwait(false); + + lifecycle.Dispose(); + Task shutdownTask = lifecycle.BeginShutdownAsync(server).AsTask(); + Assert.That( + shutdownTask.IsCompleted, + Is.False, + "BeginShutdown must join a Reload that was active when Dispose ran."); + + requestScope.Dispose(); + requestScope = null; + dispatchScope.Dispose(); + dispatchScope = null; + NodeManagerReloadCommittedException exception = + Assert.ThrowsAsync( + async () => await reloadTask.ConfigureAwait(false)); + Assert.That(exception.InnerException, Is.TypeOf()); + await shutdownTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + Assert.That( + master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, originalManager.Object)), + Is.False); + Assert.That( + master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, replacementManager.Object)), + Is.True); + + await lifecycle.CompleteShutdownAsync(server).ConfigureAwait(false); + Assert.That(lifecycle.Registrations, Is.Empty); + originalDisposable.Verify(value => value.Dispose(), Times.Once); + replacementDisposable.Verify(value => value.Dispose(), Times.Once); + } + finally + { + requestScope?.Dispose(); + dispatchScope?.Dispose(); + lifecycle.Dispose(); + } + } + + /// + /// A background retired-generation drain is part of the operation-lifetime barrier. + /// BeginShutdown rejects new lifecycle work and waits until that drain leaves its + /// request window before final retired-generation cleanup. + /// + [Test] + public async Task BeginShutdownWaitsForBackgroundRetiredDrainAsync() + { + TrackingLifecycleNodeManager retiredManager = null; + var lifecycle = new NodeManagerLifecycle(m_server); + IDisposable dispatchScope = null; + IDisposable requestScope = null; + try + { + NodeManagerRegistration original = await lifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + kGeneration1Value, + manager => retiredManager = manager)) + .ConfigureAwait(false); + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var services = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, uint monitoredItemId) = + await CreateSubscriptionAndMonitoredItemAsync( + services, + valueNodeId, + clientHandle: 1).ConfigureAwait(false); + await lifecycle + .ShadowReloadAsync( + original, + CreateNodeManagementFactory( + kGeneration2Value, + includeEuRange: false)) + .ConfigureAwait(false); + + var callbackContext = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + dispatchScope = server.RequestManager.EnterServiceDispatchScope(); + requestScope = server.RequestManager.EnterRequestScope(callbackContext); + await DeleteMonitoredItemAsync( + services, + subscriptionId, + monitoredItemId).ConfigureAwait(false); + ISession session = server.SessionManager + .GetSession(m_requestHeader.AuthenticationToken); + await WaitForRetiredNotificationsSuspendedAsync( + master, + retiredManager, + session).ConfigureAwait(false); + + Task shutdownTask = lifecycle.BeginShutdownAsync(server).AsTask(); + Assert.That( + async () => await lifecycle + .AddAsync(CreateNodeManagementFactory( + value: 3, + includeEuRange: false)) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "shutting down")); + Assert.That( + shutdownTask.IsCompleted, + Is.False, + "BeginShutdown must wait for the claimed background drain."); + + requestScope.Dispose(); + requestScope = null; + dispatchScope.Dispose(); + dispatchScope = null; + await shutdownTask + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + await AssertRetiredGenerationDisposedAsync( + retiredManager, + valueNodeId).ConfigureAwait(false); + + await DeleteSubscriptionAsync(services, subscriptionId) + .ConfigureAwait(false); + await lifecycle.CompleteShutdownAsync(server).ConfigureAwait(false); + Assert.That(lifecycle.Registrations, Is.Empty); + } + finally + { + requestScope?.Dispose(); + dispatchScope?.Dispose(); + lifecycle.Dispose(); + } + } + + /// + /// After a ShadowReload, a subscription that still owns a data monitored item created + /// on the retired generation must transfer to another session with that item routed to + /// the retired generation. The item remains owned by the retired generation after the + /// transfer and keeps delivering values pushed on the retired generation's own node. + /// + [Test] + public async Task ShadowReloadedDataMonitoredItemSurvivesSubscriptionTransferOnRetiredGenerationAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + var originalManager = (AsyncCustomNodeManager)original.NodeManager; + const uint clientHandle = 1; + + var servicesA = new ServerTestServices(m_server, m_secureChannelContext); + (uint subscriptionId, _) = + await CreateSubscriptionAndMonitoredItemAsync(servicesA, valueNodeId, clientHandle) + .ConfigureAwait(false); + + ArrayOf acknowledgements = default; + (_, acknowledgements) = await PublishForDataChangeAsync( + servicesA, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync(original, CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); + + ISubscription subscription = server.SubscriptionManager + .GetSubscriptions() + .Single(s => s.Id == subscriptionId); + var tracker = (ISubscriptionMonitoredItemLifecycle)subscription; + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.True); + + // Session B activates on a secured channel so the subscription (owned by an + // anonymous identity) can be transferred to it: the server only permits an + // anonymous-identity transfer over a Sign/SignAndEncrypt channel, and only + // when both Sessions report the same client ApplicationUri. + (RequestHeader headerB, SecureChannelContext channelB) = await m_server + .CreateAndActivateSessionAsync( + $"{TestContext.CurrentContext.Test.Name}_SessionB", + useSecurity: true, + clientApplicationUri: kClientApplicationUri) + .ConfigureAwait(false); + try + { + var servicesB = new ServerTestServices(m_server, channelB); + + headerB.Timestamp = DateTimeUtc.Now; + TransferSubscriptionsResponse transferResponse = await servicesB + .TransferSubscriptionsAsync(headerB, [subscriptionId], sendInitialValues: false) + .ConfigureAwait(false); + Assert.That(transferResponse.Results.Count, Is.EqualTo(1)); + Assert.That(StatusCode.IsGood(transferResponse.Results[0].StatusCode), Is.True, + "Transfer of a subscription owning a shadow-retired data monitored item must succeed."); + + // The item remains owned by the retired generation after the transfer. + Assert.That(tracker.HasMonitoredItems(original.NodeManager), Is.True); + Assert.That(tracker.HasMonitoredItems(reloaded.NodeManager), Is.False); + + // The transferred item keeps delivering values pushed on the retired node, + // proving the transfer was routed to the retired generation that owns it. + await PushRetiredValueAsync(server, originalManager, valueNodeId, 6464).ConfigureAwait(false); + (DataValue? pushed, _) = await PublishForDataChangeOnSessionAsync( + servicesB, + headerB, + subscriptionId, + default, + clientHandle).ConfigureAwait(false); + Assert.That(pushed!.Value.WrappedValue.GetInt32(), Is.EqualTo(6464)); + + headerB.Timestamp = DateTimeUtc.Now; + ArrayOf subscriptionIds = [subscriptionId]; + DeleteSubscriptionsResponse deleteResponse = await servicesB + .DeleteSubscriptionsAsync(headerB, subscriptionIds) + .ConfigureAwait(false); + Assert.That(deleteResponse.Results[0], Is.EqualTo(StatusCodes.Good)); + } + finally + { + headerB.Timestamp = DateTimeUtc.Now; + await m_server + .CloseSessionAsync(channelB, headerB, true, RequestLifetime.None) + .ConfigureAwait(false); + } + + // The retired generation drains once its subscription is gone; prompt cleanup tears + // down its address space without any further lifecycle operation. + await AssertRetiredGenerationDisposedAsync(originalManager, valueNodeId).ConfigureAwait(false); + } + + /// + /// When the replacement factory throws during ShadowReload's preparation phase + /// (before the routing switch is ever committed), the sentinel exception must + /// propagate unchanged and the current generation must remain fully active: + /// registration, routing, and value state are entirely unaffected, exactly as for + /// a fail-closed Reload failure. + /// + [Test] + public async Task ShadowReloadAsyncWhenReplacementFactoryThrowsKeepsCurrentManagerAsync() + { + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var valueNodeId = new NodeId(kValueNodeId, ns); + int namespaceCountBefore = server.NamespaceUris.Count; + uint urisVersionBefore = await ReadUrisVersionAsync().ConfigureAwait(false); + + var replacementFactory = new Mock(MockBehavior.Strict); + replacementFactory + .Setup(f => f.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Throws(new SentinelException()); + + Assert.That( + async () => await m_server.NodeManagerLifecycle + .ShadowReloadAsync(original, replacementFactory.Object) + .ConfigureAwait(false), + Throws.TypeOf()); + + ArrayOf registrations = m_server.NodeManagerLifecycle.Registrations; + NodeManagerRegistration survivor = registrations.Find(r => r.Id == original.Id); + Assert.That(survivor, Is.Not.Null); + Assert.That(survivor.Generation, Is.EqualTo(original.Generation)); + Assert.That(ReferenceEquals(survivor.NodeManager, original.NodeManager), Is.True); + + Assert.That( + master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, original.NodeManager)), + Is.EqualTo(1)); + + DataValue value = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(value.WrappedValue.GetInt32(), Is.EqualTo(kGeneration1Value)); + + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBefore)); + uint urisVersionAfter = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfter, Is.EqualTo(urisVersionBefore)); + } + + /// + /// When the replacement's structural commit succeeds but a subsequent rollback + /// attempt during a later, unrelated failure also fails, ShadowReload must behave + /// exactly like Reload: the replacement generation is retained live and reported + /// from for retry or removal, + /// both underlying failures are reported, and once the transient failures are + /// cleared a subsequent Remove of the retained registration (and its owner) + /// completes cleanly. + /// + [Test] + public async Task ShadowReloadAsyncWhenReplacementRollbackFailsRetainsReplacementGenerationAsync() + { + const string OwnerNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShadowReloadRollbackOwner"; + const string ReloadedNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ShadowReloadRollbackRetained"; + const string AddReferencesFailure = + "Replacement AddReferencesAsync failed."; + const string DeleteReferenceFailure = + "Replacement rollback DeleteReferenceAsync failed."; + + Mock ownerManager = + CreateLifecycleNodeManager(OwnerNamespaceUri); + Mock ownerDisposable = ownerManager.As(); + var ownerFactory = new Mock(); + ownerFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(ownerManager.Object); + NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle + .AddAsync(ownerFactory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( + OwnerNamespaceUri); + var ownerSourceId = new NodeId(2101, ownerNamespaceIndex); + object ownerHandle = new(); + int deleteReferenceCalls = 0; + bool failRollbackDelete = true; + ownerManager + .Setup(manager => manager.GetManagerHandleAsync( + ownerSourceId, + It.IsAny())) + .Returns(new ValueTask(ownerHandle)); + ownerManager + .Setup(manager => manager.DeleteReferenceAsync( + ownerHandle, + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server, + false, + It.IsAny())) + .Returns(() => + { + deleteReferenceCalls++; + if (failRollbackDelete && deleteReferenceCalls >= 2) + { + return new ValueTask( + Task.FromException( + new SentinelException(DeleteReferenceFailure))); + } + return new ValueTask(ServiceResult.Good); + }); + + Mock originalManager = + CreateLifecycleNodeManager(ReloadedNamespaceUri); + Mock originalDisposable = + originalManager.As(); + originalManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Callback< + IDictionary>, + CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = + [ + new NodeStateReference( + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server) + ]) + .Returns(default(ValueTask)); + originalManager + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask>([])); + var originalFactory = new Mock(); + originalFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(originalManager.Object); + NodeManagerRegistration originalRegistration = + await m_server.NodeManagerLifecycle + .AddAsync(originalFactory.Object) + .ConfigureAwait(false); + + Mock replacementManager = + CreateLifecycleNodeManager(ReloadedNamespaceUri); + Mock replacementDisposable = + replacementManager.As(); + replacementManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Callback< + IDictionary>, + CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = + [ + new NodeStateReference( + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server) + ]) + .Returns(default(ValueTask)); + bool failReplacementAddReferences = true; + replacementManager + .Setup(manager => manager.AddReferencesAsync( + It.IsAny>>(), + It.IsAny())) + .Returns(() => failReplacementAddReferences + ? new ValueTask(Task.FromException( + new SentinelException(AddReferencesFailure))) + : default); + var replacementFactory = new Mock(); + replacementFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(replacementManager.Object); + + NodeManagerReloadCommittedException exception = + Assert.ThrowsAsync( + async () => await m_server.NodeManagerLifecycle + .ShadowReloadAsync( + originalRegistration, + replacementFactory.Object) + .ConfigureAwait(false)); + + Assert.That( + exception.Message, + Does.Contain("replacement generation was retained")); + Assert.That(exception.InnerException, Is.TypeOf()); + string[] failureMessages = [.. ((AggregateException)exception.InnerException!) + .Flatten() + .InnerExceptions + .Select(failure => failure.Message)]; + Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); + Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); + + NodeManagerRegistration retainedRegistration = + m_server.NodeManagerLifecycle.Registrations.Find(registration => + ReferenceEquals(registration.NodeManager, replacementManager.Object)); + Assert.That(retainedRegistration, Is.Not.Null); + Assert.That(retainedRegistration.Id, Is.EqualTo(originalRegistration.Id)); + Assert.That( + retainedRegistration.Generation, + Is.EqualTo(originalRegistration.Generation + 1)); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, originalManager.Object)), + Is.False); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, replacementManager.Object)), + Is.True); + originalDisposable.Verify(manager => manager.Dispose(), Times.Never); + replacementDisposable.Verify(manager => manager.Dispose(), Times.Never); + + failReplacementAddReferences = false; + failRollbackDelete = false; + await m_server.NodeManagerLifecycle + .RemoveAsync(retainedRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(ownerRegistration) + .ConfigureAwait(false); + + originalManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + originalDisposable.Verify(manager => manager.Dispose(), Times.Once); + replacementManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + replacementDisposable.Verify(manager => manager.Dispose(), Times.Once); + ownerDisposable.Verify(manager => manager.Dispose(), Times.Once); + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + } + + /// + /// A failure from the first DeleteAddressSpaceAsync call occurs after the + /// NodeManager has been unpublished. The failure must not republish it, while the + /// registration remains current so a second Remove can retry deletion and complete + /// disposal. + /// + /// + /// Thrown by the injected address-space deletion failure. + /// + [Test] + public async Task RemoveAsyncWhenDeleteAddressSpaceFailsKeepsRegistrationUnpublishedAndRetryableAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:DeleteFailure"; + const string ExpectedMessage = "DeleteAddressSpaceAsync failed."; + var deleteStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseDelete = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + + async Task FailFirstDeleteAddressSpaceAsync() + { + deleteStarted.TrySetResult(true); + await releaseDelete.Task.ConfigureAwait(false); + throw new SentinelException(ExpectedMessage); + } + + var nodeManager = new Mock(); + Mock nodeManagerAsDisposable = nodeManager.As(); + var syncNodeManager = new Mock(); + nodeManager + .Setup(m => m.NamespaceUris) + .Returns([NamespaceUri]); + nodeManager + .Setup(m => m.SyncNodeManager) + .Returns(syncNodeManager.Object); + nodeManager + .Setup(m => m.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Returns(new ValueTask()); + nodeManager + .SetupSequence(m => m.DeleteAddressSpaceAsync(It.IsAny())) + .Returns(() => new ValueTask(FailFirstDeleteAddressSpaceAsync())) + .Returns(new ValueTask()); + + var factory = new Mock(); + factory + .Setup(f => f.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(nodeManager.Object); + + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + int namespaceIndex = server.NamespaceUris.GetIndex(NamespaceUri); + Assert.That(namespaceIndex, Is.GreaterThanOrEqualTo(0)); + Assert.That( + master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), + Is.EqualTo(1)); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.True); + Assert.That( + master.NamespaceManagers[namespaceIndex] + .Count(m => ReferenceEquals(m, nodeManager.Object)), + Is.EqualTo(1)); + + Task firstRemoval = m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .AsTask(); + try + { + Task deleteStartResult = await Task.WhenAny( + deleteStarted.Task, + Task.Delay(TimeSpan.FromSeconds(5))).ConfigureAwait(false); + Assert.That(deleteStartResult, Is.SameAs(deleteStarted.Task)); + await deleteStarted.Task.ConfigureAwait(false); + + Assert.That(firstRemoval.IsCompleted, Is.False); + Assert.That( + master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), + Is.Zero); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + + ArrayOf registrations = + m_server.NodeManagerLifecycle.Registrations; + Assert.That(registrations.Count, Is.EqualTo(1)); + Assert.That(registrations[0], Is.SameAs(registration)); + Assert.That(registrations[0].Id, Is.EqualTo(registration.Id)); + Assert.That(registrations[0].Generation, Is.EqualTo(registration.Generation)); + Assert.That(registrations[0].NodeManager, Is.SameAs(nodeManager.Object)); + } + finally + { + releaseDelete.TrySetResult(true); + } + + Assert.That( + async () => await firstRemoval.ConfigureAwait(false), + Throws.TypeOf().With.Message.EqualTo(ExpectedMessage)); + + Assert.That( + master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), + Is.Zero); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + + ArrayOf registrationsAfterFailure = + m_server.NodeManagerLifecycle.Registrations; + Assert.That(registrationsAfterFailure.Count, Is.EqualTo(1)); + Assert.That(registrationsAfterFailure[0], Is.SameAs(registration)); + Assert.That(registrationsAfterFailure[0].Id, Is.EqualTo(registration.Id)); + Assert.That( + registrationsAfterFailure[0].Generation, + Is.EqualTo(registration.Generation)); + Assert.That( + registrationsAfterFailure[0].NodeManager, + Is.SameAs(nodeManager.Object)); + nodeManager.Verify( + m => m.DeleteAddressSpaceAsync(CancellationToken.None), + Times.Once); + nodeManagerAsDisposable.Verify(d => d.Dispose(), Times.Never); + + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + + nodeManager.Verify( + m => m.DeleteAddressSpaceAsync(CancellationToken.None), + Times.Exactly(2)); + factory.Verify( + f => f.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Once); + nodeManagerAsDisposable.Verify(d => d.Dispose(), Times.Once); + + ArrayOf registrationsAfterRetry = + m_server.NodeManagerLifecycle.Registrations; + Assert.That( + CountMatches(registrationsAfterRetry, r => r.Id == registration.Id), + Is.Zero); + Assert.That( + master.AsyncNodeManagers.Count(m => ReferenceEquals(m, nodeManager.Object)), + Is.Zero); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + } + + [Test] + public async Task RemoveAsyncDoesNotRepeatDestroyedAddressSpaceWhenReferenceCleanupRetriesAsync() + { + const string OwnerNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RemoveReferenceOwner"; + const string RemovedNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RemoveReferenceRetry"; + const string ExpectedMessage = "Post-destroy reference removal failed."; + Mock ownerManager = + CreateLifecycleNodeManager(OwnerNamespaceUri); + Mock ownerDisposable = ownerManager.As(); + var ownerFactory = new Mock(); + ownerFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(ownerManager.Object); + NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle + .AddAsync(ownerFactory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( + OwnerNamespaceUri); + var ownerSourceId = new NodeId(2001, ownerNamespaceIndex); + object ownerHandle = new(); + int deleteReferenceCalls = 0; + ownerManager + .Setup(manager => manager.GetManagerHandleAsync( + ownerSourceId, + It.IsAny())) + .Returns(new ValueTask(ownerHandle)); + ownerManager + .Setup(manager => manager.DeleteReferenceAsync( + ownerHandle, + ReferenceTypeIds.HasComponent, + false, + It.IsAny(), + false, + It.IsAny())) + .Returns(() => + { + int call = Interlocked.Increment(ref deleteReferenceCalls); + return call == 2 + ? new ValueTask( + Task.FromException( + new SentinelException(ExpectedMessage))) + : new ValueTask(ServiceResult.Good); + }); + + TrackingLifecycleNodeManager removedManager = null; + NodeManagerRegistration removedRegistration = + await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 808, + created => removedManager = created, + RemovedNamespaceUri, + ownerSourceId)) + .ConfigureAwait(false); + + Assert.That( + async () => await m_server.NodeManagerLifecycle + .RemoveAsync(removedRegistration) + .ConfigureAwait(false), + Throws.TypeOf().With.Message.EqualTo(ExpectedMessage)); + Assert.That(removedManager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(removedManager.DisposeCount, Is.Zero); + Assert.That(deleteReferenceCalls, Is.EqualTo(2)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations.Find(candidate => + ReferenceEquals(candidate, removedRegistration)), + Is.SameAs(removedRegistration)); + + await m_server.NodeManagerLifecycle + .RemoveAsync(removedRegistration) + .ConfigureAwait(false); + + Assert.That( + removedManager.DeleteAddressSpaceCount, + Is.EqualTo(1), + "Retrying post-destroy reference cleanup must not delete the address space again."); + Assert.That(removedManager.DisposeCount, Is.EqualTo(1)); + Assert.That(deleteReferenceCalls, Is.EqualTo(3)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations.Find(candidate => + ReferenceEquals(candidate, removedRegistration)), + Is.Null); + + await m_server.NodeManagerLifecycle + .RemoveAsync(ownerRegistration) + .ConfigureAwait(false); + ownerDisposable.Verify(value => value.Dispose(), Times.Once); + } + + [Test] + [Category("NodeManagerLifecycleEvents")] + public async Task RemoveAsyncCheckpointsDestroyWhenDisposeRetriesAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RemoveDisposeRetry"; + TrackingLifecycleNodeManager manager = null; + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddAsync(CreateTrackingNodeManagementFactory( + 807, + created => manager = created, + NamespaceUri)) + .ConfigureAwait(false); + manager.DisposeFailuresRemaining = 1; + + var services = new ServerTestServices(m_server, m_secureChannelContext); + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscriptionResponse = await services + .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0) + .ConfigureAwait(false); + uint subscriptionId = subscriptionResponse.SubscriptionId; + + ArrayOf monitoredItems = + [CreateModelChangeEventMonitoredItem(clientHandle: 1, queueSize: 10)]; + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse createItemsResponse = await services + .CreateMonitoredItemsAsync( + requestHeader, + subscriptionId, + TimestampsToReturn.Both, + monitoredItems) + .ConfigureAwait(false); + Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); + Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + + ArrayOf acknowledgements = default; + try + { + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + + Assert.That( + async () => await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false), + Throws.TypeOf() + .With.Message.EqualTo("Dispose failed.")); + + Assert.That(manager.DeleteAddressSpaceCount, Is.EqualTo(1)); + Assert.That(manager.DisposeCount, Is.EqualTo(1)); + int unsubscribeCountAfterFailure = + manager.AllEventsUnsubscribeCount; + Assert.That(unsubscribeCountAfterFailure, Is.EqualTo(1)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations, + Has.Count.EqualTo(1)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations[0], + Is.SameAs(registration)); + Assert.That( + master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, manager)), + Is.False, + "A failed disposal must not republish the removed NodeManager."); + + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + + Assert.That( + manager.DeleteAddressSpaceCount, + Is.EqualTo(1), + "A completed destroy stage must not run again on Remove retry."); + Assert.That(manager.DisposeCount, Is.EqualTo(2)); + Assert.That( + manager.AllEventsUnsubscribeCount, + Is.EqualTo(unsubscribeCountAfterFailure), + "A removal retry must not repeat all-events unsubscription."); + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + Assert.That( + master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, manager)), + Is.False); + + EventFieldList removeEvent; + (removeEvent, acknowledgements) = await PublishForModelChangeEventAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + AssertModelChangeEvent(removeEvent, "A live NodeManager was removed."); + } + finally + { + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + await services + .DeleteSubscriptionsAsync(requestHeader, [subscriptionId]) + .ConfigureAwait(false); + } + } + + [Test] + public Task AddAsyncWhenPreparationAndCleanupFailReportsEveryFailureAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:PreparationCleanupFailure"; + const string CreateFailure = "CreateAddressSpaceAsync failed."; + const string DeleteFailure = "DeleteAddressSpaceAsync failed."; + const string DisposeFailure = "Dispose failed."; + + Mock nodeManager = CreateLifecycleNodeManager(NamespaceUri); + nodeManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Throws(new SentinelException(CreateFailure)); + nodeManager + .Setup(manager => manager.DeleteAddressSpaceAsync( + It.IsAny())) + .Throws(new SentinelException(DeleteFailure)); + Mock disposable = nodeManager.As(); + disposable + .Setup(manager => manager.Dispose()) + .Throws(new SentinelException(DisposeFailure)); + + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(nodeManager.Object); + + AggregateException exception = Assert.ThrowsAsync( + async () => await m_server.NodeManagerLifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false)); + + string[] failureMessages = [.. exception + .Flatten() + .InnerExceptions + .Select(failure => failure.Message)]; + Assert.That(failureMessages, Does.Contain(CreateFailure)); + Assert.That(failureMessages, Does.Contain(DeleteFailure)); + Assert.That(failureMessages, Does.Contain(DisposeFailure)); + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + + var master = (MasterNodeManager)m_server.CurrentInstance.NodeManager; + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, nodeManager.Object)), + Is.False); + nodeManager.Verify( + manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny()), + Times.Once); + nodeManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + disposable.Verify(manager => manager.Dispose(), Times.Once); + return Task.CompletedTask; + } + + [Test] + public async Task RemoveAsyncWhenSessionUnbindingFailsRepublishesManagerAndAllowsRetryAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:UnbindingFailure"; + const string ExpectedMessage = "SessionClosingAsync failed."; + bool failSessionClosing = false; + + Mock nodeManager = CreateLifecycleNodeManager(NamespaceUri); + nodeManager + .Setup(manager => manager.SessionClosingAsync( + It.IsAny(), + It.IsAny(), + false, + It.IsAny())) + .Returns( + (_, _, _, _) => failSessionClosing + ? new ValueTask(Task.FromException( + new SentinelException(ExpectedMessage))) + : default); + Mock disposable = nodeManager.As(); + + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(nodeManager.Object); + + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + int namespaceIndex = server.NamespaceUris.GetIndex(NamespaceUri); + failSessionClosing = true; + + Assert.That( + async () => await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false), + Throws.TypeOf() + .With.Message.EqualTo(ExpectedMessage)); + + Assert.That( + m_server.NodeManagerLifecycle.Registrations, + Has.Count.EqualTo(1)); + Assert.That( + m_server.NodeManagerLifecycle.Registrations[0], + Is.SameAs(registration)); + Assert.That( + master.AsyncNodeManagers.Count(manager => + ReferenceEquals(manager, nodeManager.Object)), + Is.EqualTo(1)); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.True); + Assert.That( + master.NamespaceManagers[namespaceIndex].Count(manager => + ReferenceEquals(manager, nodeManager.Object)), + Is.EqualTo(1)); + nodeManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + It.IsAny()), + Times.Never); + disposable.Verify(manager => manager.Dispose(), Times.Never); + + failSessionClosing = false; + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, nodeManager.Object)), + Is.False); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + nodeManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + disposable.Verify(manager => manager.Dispose(), Times.Once); + } + + [Test] + public async Task ReloadAsyncWhenRetiredManagerCleanupFailsKeepsReplacementAndRetriesCleanupAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RetiredCleanupFailure"; + const string ExpectedMessage = "Retired SessionClosingAsync failed."; + bool failRetiredSessionClosing = false; + + Mock originalManager = + CreateLifecycleNodeManager(NamespaceUri); + originalManager + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask>([])); + originalManager + .Setup(manager => manager.SessionClosingAsync( + It.IsAny(), + It.IsAny(), + false, + It.IsAny())) + .Returns( + (_, _, _, _) => failRetiredSessionClosing + ? new ValueTask(Task.FromException( + new SentinelException(ExpectedMessage))) + : default); + Mock originalDisposable = originalManager.As(); + + var originalFactory = new Mock(); + originalFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(originalManager.Object); + + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddAsync(originalFactory.Object) + .ConfigureAwait(false); + + Mock replacementManager = + CreateLifecycleNodeManager(NamespaceUri); + Mock replacementDisposable = + replacementManager.As(); + var replacementFactory = new Mock(); + replacementFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(replacementManager.Object); + + failRetiredSessionClosing = true; + NodeManagerReloadCommittedException exception = + Assert.ThrowsAsync( + async () => await m_server.NodeManagerLifecycle + .ReloadAsync(original, replacementFactory.Object) + .ConfigureAwait(false)); + + Assert.That( + exception.Message, + Does.Contain("replacement NodeManager is live")); + Assert.That(exception.InnerException, Is.TypeOf()); + Assert.That(exception.InnerException!.Message, Is.EqualTo(ExpectedMessage)); + Assert.That(exception.Registration.Id, Is.EqualTo(original.Id)); + Assert.That(exception.Registration.Generation, Is.EqualTo(original.Generation + 1)); + + ArrayOf registrations = + m_server.NodeManagerLifecycle.Registrations; + Assert.That(registrations, Has.Count.EqualTo(1)); + NodeManagerRegistration replacement = registrations[0]; + Assert.That(replacement.Id, Is.EqualTo(original.Id)); + Assert.That(replacement.Generation, Is.EqualTo(original.Generation + 1)); + Assert.That(replacement.NodeManager, Is.SameAs(replacementManager.Object)); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + int namespaceIndex = server.NamespaceUris.GetIndex(NamespaceUri); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, originalManager.Object)), + Is.False); + Assert.That( + master.AsyncNodeManagers.Count(manager => + ReferenceEquals(manager, replacementManager.Object)), + Is.EqualTo(1)); + Assert.That( + master.NamespaceManagers[namespaceIndex].Any(manager => + ReferenceEquals(manager, replacementManager.Object)), + Is.True); + originalManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + It.IsAny()), + Times.Never); + originalDisposable.Verify(manager => manager.Dispose(), Times.Never); + replacementDisposable.Verify(manager => manager.Dispose(), Times.Never); + + failRetiredSessionClosing = false; + await m_server.NodeManagerLifecycle + .RemoveAsync(replacement) + .ConfigureAwait(false); + + originalManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + originalDisposable.Verify(manager => manager.Dispose(), Times.Once); + replacementManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + replacementDisposable.Verify(manager => manager.Dispose(), Times.Once); + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + Assert.That(master.NamespaceManagers.ContainsKey(namespaceIndex), Is.False); + } + + [Test] + public async Task AddAsyncWhenPublicationRollbackFailsRetainsLiveRegistrationAsync() + { + const string OwnerNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:AddRollbackOwner"; + const string RetainedNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:AddRollbackRetained"; + const string AddReferencesFailure = "AddReferencesAsync failed."; + const string DeleteReferenceFailure = "DeleteReferenceAsync failed."; + + Mock ownerManager = + CreateLifecycleNodeManager(OwnerNamespaceUri); + Mock ownerDisposable = ownerManager.As(); + var ownerFactory = new Mock(); + ownerFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(ownerManager.Object); + NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle + .AddAsync(ownerFactory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( + OwnerNamespaceUri); + var ownerSourceId = new NodeId(1001, ownerNamespaceIndex); + object ownerHandle = new(); + bool failDeleteReference = true; + ownerManager + .Setup(manager => manager.GetManagerHandleAsync( + ownerSourceId, + It.IsAny())) + .Returns(new ValueTask(ownerHandle)); + ownerManager + .Setup(manager => manager.DeleteReferenceAsync( + ownerHandle, + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server, + false, + It.IsAny())) + .Returns(() => failDeleteReference + ? new ValueTask( + Task.FromException( + new SentinelException(DeleteReferenceFailure))) + : new ValueTask(ServiceResult.Good)); + + Mock retainedManager = + CreateLifecycleNodeManager(RetainedNamespaceUri); + Mock retainedDisposable = + retainedManager.As(); + retainedManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Callback< + IDictionary>, + CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = + [ + new NodeStateReference( + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server) + ]) + .Returns(default(ValueTask)); + bool failAddReferences = true; + retainedManager + .Setup(manager => manager.AddReferencesAsync( + It.IsAny>>(), + It.IsAny())) + .Returns(() => failAddReferences + ? new ValueTask(Task.FromException( + new SentinelException(AddReferencesFailure))) + : default); + + var retainedFactory = new Mock(); + retainedFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(retainedManager.Object); + + InvalidOperationException exception = + Assert.ThrowsAsync( + async () => await m_server.NodeManagerLifecycle + .AddAsync(retainedFactory.Object) + .ConfigureAwait(false)); + + Assert.That( + exception.Message, + Does.Contain("published generation was retained")); + Assert.That(exception.InnerException, Is.TypeOf()); + string[] failureMessages = [.. ((AggregateException)exception.InnerException!) + .Flatten() + .InnerExceptions + .Select(failure => failure.Message)]; + Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); + Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); + + NodeManagerRegistration retainedRegistration = + m_server.NodeManagerLifecycle.Registrations.Find(registration => + ReferenceEquals(registration.NodeManager, retainedManager.Object)); + Assert.That(retainedRegistration, Is.Not.Null); + Assert.That(retainedRegistration.Generation, Is.EqualTo(1)); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, retainedManager.Object)), + Is.True); + int retainedNamespaceIndex = + server.NamespaceUris.GetIndex(RetainedNamespaceUri); + Assert.That( + master.NamespaceManagers[retainedNamespaceIndex].Any(manager => + ReferenceEquals(manager, retainedManager.Object)), + Is.True); + retainedDisposable.Verify(manager => manager.Dispose(), Times.Never); + + failAddReferences = false; + failDeleteReference = false; + await m_server.NodeManagerLifecycle + .RemoveAsync(retainedRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(ownerRegistration) + .ConfigureAwait(false); + + retainedManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + retainedDisposable.Verify(manager => manager.Dispose(), Times.Once); + ownerDisposable.Verify(manager => manager.Dispose(), Times.Once); + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + } + + [Test] + public async Task ReloadAsyncWhenReplacementRollbackFailsRetainsReplacementGenerationAsync() + { + const string OwnerNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ReloadRollbackOwner"; + const string ReloadedNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ReloadRollbackRetained"; + const string AddReferencesFailure = + "Replacement AddReferencesAsync failed."; + const string DeleteReferenceFailure = + "Replacement rollback DeleteReferenceAsync failed."; + + Mock ownerManager = + CreateLifecycleNodeManager(OwnerNamespaceUri); + Mock ownerDisposable = ownerManager.As(); + var ownerFactory = new Mock(); + ownerFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(ownerManager.Object); + NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle + .AddAsync(ownerFactory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( + OwnerNamespaceUri); + var ownerSourceId = new NodeId(2001, ownerNamespaceIndex); + object ownerHandle = new(); + int deleteReferenceCalls = 0; + bool failRollbackDelete = true; + ownerManager + .Setup(manager => manager.GetManagerHandleAsync( + ownerSourceId, + It.IsAny())) + .Returns(new ValueTask(ownerHandle)); + ownerManager + .Setup(manager => manager.DeleteReferenceAsync( + ownerHandle, + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server, + false, + It.IsAny())) + .Returns(() => + { + deleteReferenceCalls++; + if (failRollbackDelete && deleteReferenceCalls >= 2) + { + return new ValueTask( + Task.FromException( + new SentinelException(DeleteReferenceFailure))); + } + return new ValueTask(ServiceResult.Good); + }); + + Mock originalManager = + CreateLifecycleNodeManager(ReloadedNamespaceUri); + Mock originalDisposable = + originalManager.As(); + originalManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Callback< + IDictionary>, + CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = + [ + new NodeStateReference( + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server) + ]) + .Returns(default(ValueTask)); + originalManager + .As() + .Setup(participant => participant.PrepareReloadAsync( + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask>([])); + var originalFactory = new Mock(); + originalFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(originalManager.Object); + NodeManagerRegistration originalRegistration = + await m_server.NodeManagerLifecycle + .AddAsync(originalFactory.Object) + .ConfigureAwait(false); + + Mock replacementManager = + CreateLifecycleNodeManager(ReloadedNamespaceUri); + Mock replacementDisposable = + replacementManager.As(); + replacementManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Callback< + IDictionary>, + CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = + [ + new NodeStateReference( + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server) + ]) + .Returns(default(ValueTask)); + bool failReplacementAddReferences = true; + replacementManager + .Setup(manager => manager.AddReferencesAsync( + It.IsAny>>(), + It.IsAny())) + .Returns(() => failReplacementAddReferences + ? new ValueTask(Task.FromException( + new SentinelException(AddReferencesFailure))) + : default); + var replacementFactory = new Mock(); + replacementFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(replacementManager.Object); + + NodeManagerReloadCommittedException exception = + Assert.ThrowsAsync( + async () => await m_server.NodeManagerLifecycle + .ReloadAsync( + originalRegistration, + replacementFactory.Object) + .ConfigureAwait(false)); + + Assert.That( + exception.Message, + Does.Contain("replacement generation was retained")); + Assert.That(exception.InnerException, Is.TypeOf()); + string[] failureMessages = [.. ((AggregateException)exception.InnerException!) + .Flatten() + .InnerExceptions + .Select(failure => failure.Message)]; + Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); + Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); + + NodeManagerRegistration retainedRegistration = + m_server.NodeManagerLifecycle.Registrations.Find(registration => + ReferenceEquals(registration.NodeManager, replacementManager.Object)); + Assert.That(retainedRegistration, Is.Not.Null); + Assert.That(retainedRegistration.Id, Is.EqualTo(originalRegistration.Id)); + Assert.That( + retainedRegistration.Generation, + Is.EqualTo(originalRegistration.Generation + 1)); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, originalManager.Object)), + Is.False); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, replacementManager.Object)), + Is.True); + originalDisposable.Verify(manager => manager.Dispose(), Times.Never); + replacementDisposable.Verify(manager => manager.Dispose(), Times.Never); + + failReplacementAddReferences = false; + failRollbackDelete = false; + await m_server.NodeManagerLifecycle + .RemoveAsync(retainedRegistration) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(ownerRegistration) + .ConfigureAwait(false); + + originalManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + originalDisposable.Verify(manager => manager.Dispose(), Times.Once); + replacementManager.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + replacementDisposable.Verify(manager => manager.Dispose(), Times.Once); + ownerDisposable.Verify(manager => manager.Dispose(), Times.Once); + Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + } + + [Test] + public async Task RetainedReplacementRunsPostCommitRepairInsteadOfRollbackAsync() + { + const string OwnerNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RetainedRepairOwner"; + const string ReplacedNamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RetainedRepair"; + const string AddReferencesFailure = "Retained replacement publication failed."; + const string DeleteReferenceFailure = "Retained replacement rollback failed."; + const string RepairFailure = "Retained replacement monitored-item repair failed."; + + Mock ownerManager = + CreateLifecycleNodeManager(OwnerNamespaceUri); + var ownerFactory = new Mock(); + ownerFactory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(ownerManager.Object); + NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle + .AddAsync(ownerFactory.Object) + .ConfigureAwait(false); + + IServerInternal server = m_server.CurrentInstance; + var host = (IDynamicNodeManagerHost)server.NodeManager; + ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( + OwnerNamespaceUri); + var ownerSourceId = new NodeId(3001, ownerNamespaceIndex); + object ownerHandle = new(); + int deleteReferenceCalls = 0; + bool failRollbackDelete = true; + ownerManager + .Setup(manager => manager.GetManagerHandleAsync( + ownerSourceId, + It.IsAny())) + .Returns(new ValueTask(ownerHandle)); + ownerManager + .Setup(manager => manager.DeleteReferenceAsync( + ownerHandle, + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server, + false, + It.IsAny())) + .Returns(() => + { + deleteReferenceCalls++; + if (failRollbackDelete && deleteReferenceCalls >= 2) + { + return new ValueTask( + Task.FromException( + new SentinelException(DeleteReferenceFailure))); + } + return new ValueTask(ServiceResult.Good); + }); + + Mock currentManager = + CreateLifecycleNodeManager(ReplacedNamespaceUri); + currentManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) .Callback< IDictionary>, CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = @@ -1592,675 +6385,1084 @@ public async Task ReloadAsyncWhenReplacementRollbackFailsRetainsReplacementGener ObjectIds.Server) ]) .Returns(default(ValueTask)); - originalManager - .As() - .Setup(participant => participant.PrepareReloadAsync( - It.IsAny(), + PreparedNodeManager current = await host + .PrepareAsync(currentManager.Object) + .ConfigureAwait(false); + await host.PublishAsync(current).ConfigureAwait(false); + await host.CommitAsync(current).ConfigureAwait(false); + + Mock replacementManager = + CreateLifecycleNodeManager(ReplacedNamespaceUri); + replacementManager + .Setup(manager => manager.CreateAddressSpaceAsync( + It.IsAny>>(), + It.IsAny())) + .Callback< + IDictionary>, + CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = + [ + new NodeStateReference( + ReferenceTypeIds.HasComponent, + false, + ObjectIds.Server) + ]) + .Returns(default(ValueTask)); + bool failReplacementAddReferences = true; + replacementManager + .Setup(manager => manager.AddReferencesAsync( + It.IsAny>>(), + It.IsAny())) + .Returns(() => failReplacementAddReferences + ? new ValueTask(Task.FromException( + new SentinelException(AddReferencesFailure))) + : default); + PreparedNodeManager replacement = await host + .PrepareAsync(replacementManager.Object) + .ConfigureAwait(false); + await host + .ReplaceAsync(currentManager.Object, replacement) + .ConfigureAwait(false); + + using var monitoredItem = new MonitoredItem( + server, + currentManager.Object, + new object(), + subscriptionId: 1, + id: 3001, + itemToMonitor: new ReadValueId + { + NodeId = new NodeId("RetainedRepair", ownerNamespaceIndex), + AttributeId = Attributes.Value + }, + diagnosticsMasks: DiagnosticsMasks.None, + timestampsToReturn: TimestampsToReturn.Both, + monitoringMode: MonitoringMode.Reporting, + clientHandle: 1, + originalFilter: null, + filterToUse: null, + range: null, + samplingInterval: 1000, + queueSize: 1, + discardOldest: true, + sourceSamplingInterval: 1000); + var itemLifecycle = (IDetachableMonitoredItem)monitoredItem; + int repairCalls = 0; + int rollbackCalls = 0; + + try + { + AggregateException exception = Assert.ThrowsAsync( + async () => await host + .CommitAsync( + replacement, + beforeCommit: () => + { + itemLifecycle.Detach(server); + return default; + }, + afterCommit: () => + { + repairCalls++; + itemLifecycle.Rebind(replacementManager.Object, new object()); + return new ValueTask(Task.FromException( + new SentinelException(RepairFailure))); + }, + rollbackCommit: () => + { + rollbackCalls++; + itemLifecycle.Rebind(currentManager.Object, new object()); + return default; + }) + .ConfigureAwait(false)); + + string[] failureMessages = [.. exception + .Flatten() + .InnerExceptions + .Select(failure => failure.Message)]; + Assert.Multiple(() => + { + Assert.That(replacement.Published, Is.True); + Assert.That(repairCalls, Is.EqualTo(1)); + Assert.That(rollbackCalls, Is.Zero); + Assert.That(monitoredItem.NodeManager, Is.SameAs(replacementManager.Object)); + Assert.That(itemLifecycle.IsDetached, Is.False); + Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); + Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); + Assert.That(failureMessages, Does.Contain(RepairFailure)); + }); + } + finally + { + failReplacementAddReferences = false; + failRollbackDelete = false; + if (replacement.Published) + { + await host + .UnpublishAsync(replacementManager.Object) + .ConfigureAwait(false); + } + await host + .DestroyAddressSpaceAsync(replacementManager.Object) + .ConfigureAwait(false); + await host + .DestroyAddressSpaceAsync(currentManager.Object) + .ConfigureAwait(false); + await m_server.NodeManagerLifecycle + .RemoveAsync(ownerRegistration) + .ConfigureAwait(false); + } + } + + [Test] + public Task LifecycleArgumentGuardsRejectNullInputsAsync() + { + var lifecycle = (NodeManagerLifecycle)m_server.NodeManagerLifecycle; + IAsyncNodeManagerFactory asyncFactory = + Mock.Of(); + INodeManagerFactory syncFactory = Mock.Of(); + + ArgumentNullException exception = + Assert.ThrowsAsync( + async () => await lifecycle + .AddAsync((IAsyncNodeManagerFactory)null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("factory")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .AddAsync((INodeManagerFactory)null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("factory")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ReloadAsync( + null!, + (IAsyncNodeManagerFactory)null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ReloadAsync( + null!, + (INodeManagerFactory)null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ReloadAsync(null!, asyncFactory) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("registration")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ReloadAsync(null!, syncFactory) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("registration")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ShadowReloadAsync( + null!, + (IAsyncNodeManagerFactory)null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ShadowReloadAsync( + null!, + (INodeManagerFactory)null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ShadowReloadAsync(null!, asyncFactory) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("registration")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .ShadowReloadAsync(null!, syncFactory) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("registration")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .RemoveAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("registration")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .BeginShutdownAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("server")); + + exception = Assert.ThrowsAsync( + async () => await lifecycle + .CompleteShutdownAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("server")); + return Task.CompletedTask; + } + + [Test] + public async Task DynamicHostGuardsRejectInvalidArgumentsAndStateAsync() + { + var host = (IDynamicNodeManagerHost)m_server.CurrentInstance.NodeManager; + var coordinator = + (IDynamicNodeManagerHost)m_server.CurrentInstance.NodeManager; + Mock candidate = CreateLifecycleNodeManager( + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:HostGuards"); + var prepared = new PreparedNodeManager( + candidate.Object, + []); + + ArgumentNullException exception = + Assert.ThrowsAsync( + async () => await host + .PrepareAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + + exception = Assert.ThrowsAsync( + async () => await host + .PublishAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("prepared")); + + exception = Assert.ThrowsAsync( + async () => await host + .ReplaceAsync(null!, prepared) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("current")); + + exception = Assert.ThrowsAsync( + async () => await host + .UnpublishAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + + exception = Assert.ThrowsAsync( + async () => await host + .DestroyAddressSpaceAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + + exception = Assert.ThrowsAsync( + async () => await host + .RemoveDestroyedExternalReferencesAsync(null!) + .ConfigureAwait(false)); + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + + exception = Assert.Throws( + () => host.Release(null!)); + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + + + Assert.That( + async () => await host + .CommitAsync(prepared) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "has not been staged")); + + Mock unowned = CreateLifecycleNodeManager( + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:Unowned"); + Assert.That( + async () => await host + .ReplaceAsync(unowned.Object, prepared) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "not owned")); + Assert.That( + async () => await host + .UnpublishAsync(unowned.Object) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "not owned")); + Assert.DoesNotThrow(() => host.Release(unowned.Object)); + + Mock destroyCandidate = + CreateLifecycleNodeManager( + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:Destroy"); + await host + .DestroyAddressSpaceAsync(destroyCandidate.Object) + .ConfigureAwait(false); + await host + .RemoveDestroyedExternalReferencesAsync(destroyCandidate.Object) + .ConfigureAwait(false); + destroyCandidate.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + + await host.PublishAsync(prepared).ConfigureAwait(false); + Assert.That( + async () => await host + .PublishAsync(prepared) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "already been staged")); + + await host.RollbackAsync(prepared).ConfigureAwait(false); + candidate.Verify( + manager => manager.DeleteAddressSpaceAsync( + CancellationToken.None), + Times.Once); + + Mock owned = CreateLifecycleNodeManager( + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:Owned"); + var factory = new Mock(); + factory + .Setup(value => value.CreateAsync( + It.IsAny(), + It.IsAny(), It.IsAny())) - .Returns(new ValueTask>([])); - var originalFactory = new Mock(); - originalFactory + .ReturnsAsync(owned.Object); + NodeManagerRegistration registration = await m_server + .NodeManagerLifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false); + var duplicate = new PreparedNodeManager(owned.Object, []); + Assert.That( + async () => await host + .PublishAsync(duplicate) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "already registered")); + + Mock replacement = CreateLifecycleNodeManager( + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:StagedReplacement"); + var stagedReplacement = new PreparedNodeManager( + replacement.Object, + []) + { + Staged = true + }; + Assert.That( + async () => await host + .ReplaceAsync(owned.Object, stagedReplacement) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "already been staged")); + + await m_server.NodeManagerLifecycle + .RemoveAsync(registration) + .ConfigureAwait(false); + } + + [Test] + public async Task IndependentLifecycleShutdownReleasesRegistrationsAndRejectsNewOperationsAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:IndependentShutdown"; + Mock nodeManager = + CreateLifecycleNodeManager(NamespaceUri); + Mock disposable = nodeManager.As(); + var factory = new Mock(); + factory .Setup(value => value.CreateAsync( It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(originalManager.Object); - NodeManagerRegistration originalRegistration = - await m_server.NodeManagerLifecycle - .AddAsync(originalFactory.Object) - .ConfigureAwait(false); + .ReturnsAsync(nodeManager.Object); + using var lifecycle = new NodeManagerLifecycle(m_server); - Mock replacementManager = - CreateLifecycleNodeManager(ReloadedNamespaceUri); - Mock replacementDisposable = - replacementManager.As(); - replacementManager + NodeManagerRegistration registration = await lifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false); + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, registration.NodeManager)), + Is.True); + + await lifecycle + .BeginShutdownAsync(server) + .ConfigureAwait(false); + + Assert.That( + async () => await lifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false), + Throws.InvalidOperationException.With.Message.Contains( + "shutting down")); + + await lifecycle + .CompleteShutdownAsync(server) + .ConfigureAwait(false); + + Assert.That(lifecycle.Registrations, Is.Empty); + Assert.That( + master.AsyncNodeManagers.Any(manager => + ReferenceEquals(manager, registration.NodeManager)), + Is.False); + disposable.Verify(value => value.Dispose(), Times.Once); + } + + + [Test] + public Task AddAsyncCleansFailedSessionActivationAsync() + { + const string NamespaceUri = + "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ActivationFailure"; + const string ExpectedMessage = "SessionActivatedAsync failed."; + var nodeManager = new Mock(); + var syncNodeManager = new Mock(); + nodeManager + .Setup(manager => manager.NamespaceUris) + .Returns([NamespaceUri]); + nodeManager + .Setup(manager => manager.SyncNodeManager) + .Returns(syncNodeManager.Object); + nodeManager .Setup(manager => manager.CreateAddressSpaceAsync( It.IsAny>>(), It.IsAny())) - .Callback< - IDictionary>, - CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = - [ - new NodeStateReference( - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server) - ]) .Returns(default(ValueTask)); - bool failReplacementAddReferences = true; - replacementManager - .Setup(manager => manager.AddReferencesAsync( - It.IsAny>>(), + nodeManager + .Setup(manager => manager.DeleteAddressSpaceAsync( It.IsAny())) - .Returns(() => failReplacementAddReferences - ? new ValueTask(Task.FromException( - new SentinelException(AddReferencesFailure))) - : default); - var replacementFactory = new Mock(); - replacementFactory + .Returns(default(ValueTask)); + nodeManager + .Setup(manager => manager.SessionActivatedAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(() => new ValueTask( + Task.FromException( + new SentinelException(ExpectedMessage)))); + nodeManager + .Setup(manager => manager.SessionClosingAsync( + It.IsAny(), + It.IsAny(), + false, + It.IsAny())) + .Returns(default(ValueTask)); + + var factory = new Mock(); + factory .Setup(value => value.CreateAsync( It.IsAny(), It.IsAny(), It.IsAny())) - .ReturnsAsync(replacementManager.Object); - - InvalidOperationException exception = - Assert.ThrowsAsync( - async () => await m_server.NodeManagerLifecycle - .ReloadAsync( - originalRegistration, - replacementFactory.Object) - .ConfigureAwait(false)); - - Assert.That( - exception.Message, - Does.Contain("replacement generation was retained")); - Assert.That(exception.InnerException, Is.TypeOf()); - string[] failureMessages = [.. ((AggregateException)exception.InnerException!) - .Flatten() - .InnerExceptions - .Select(failure => failure.Message)]; - Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); - Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); + .ReturnsAsync(nodeManager.Object); - NodeManagerRegistration retainedRegistration = - m_server.NodeManagerLifecycle.Registrations.Find(registration => - ReferenceEquals(registration.NodeManager, replacementManager.Object)); - Assert.That(retainedRegistration, Is.Not.Null); - Assert.That(retainedRegistration.Id, Is.EqualTo(originalRegistration.Id)); - Assert.That( - retainedRegistration.Generation, - Is.EqualTo(originalRegistration.Generation + 1)); - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, originalManager.Object)), - Is.False); Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, replacementManager.Object)), - Is.True); - originalDisposable.Verify(manager => manager.Dispose(), Times.Never); - replacementDisposable.Verify(manager => manager.Dispose(), Times.Never); - - failReplacementAddReferences = false; - failRollbackDelete = false; - await m_server.NodeManagerLifecycle - .RemoveAsync(retainedRegistration) - .ConfigureAwait(false); - await m_server.NodeManagerLifecycle - .RemoveAsync(ownerRegistration) - .ConfigureAwait(false); + async () => await m_server.NodeManagerLifecycle + .AddAsync(factory.Object) + .ConfigureAwait(false), + Throws.TypeOf() + .With.Message.EqualTo(ExpectedMessage)); - originalManager.Verify( - manager => manager.DeleteAddressSpaceAsync( + nodeManager.Verify( + manager => manager.SessionClosingAsync( + It.IsAny(), + It.IsAny(), + false, CancellationToken.None), - Times.Once); - originalDisposable.Verify(manager => manager.Dispose(), Times.Once); - replacementManager.Verify( + Times.AtLeastOnce); + nodeManager.Verify( manager => manager.DeleteAddressSpaceAsync( CancellationToken.None), Times.Once); - replacementDisposable.Verify(manager => manager.Dispose(), Times.Once); - ownerDisposable.Verify(manager => manager.Dispose(), Times.Once); - Assert.That(m_server.NodeManagerLifecycle.Registrations, Is.Empty); + Assert.That( + m_server.NodeManagerLifecycle.Registrations, + Is.Empty); + return Task.CompletedTask; } + /// + /// An event subscription and monitored item on , + /// created before the live NodeManager is ever added, must receive one + /// BaseModelChangeEventState-shaped notification per lifecycle operation + /// (add, same-URI reload, remove), each carrying the provider's exact + /// SourceNode/SourceName/Message values (no Changes + /// field is expected, since that only exists on the separate + /// GeneralModelChangeEventState/SemanticChangeEventState shapes). Add + /// must also change the server's namespace table + /// (NamespaceArray/UrisVersion), while a same-URI reload and a + /// subsequent remove must both leave it unchanged. + /// [Test] - public async Task RetainedReplacementRunsPostCommitRepairInsteadOfRollbackAsync() + [Category("NodeManagerLifecycleEvents")] + public async Task ExistingServerEventSubscriptionReceivesLifecycleModelChangeEventsAsync() { - const string OwnerNamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RetainedRepairOwner"; - const string ReplacedNamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:RetainedRepair"; - const string AddReferencesFailure = "Retained replacement publication failed."; - const string DeleteReferenceFailure = "Retained replacement rollback failed."; - const string RepairFailure = "Retained replacement monitored-item repair failed."; + var services = new ServerTestServices(m_server, m_secureChannelContext); - Mock ownerManager = - CreateLifecycleNodeManager(OwnerNamespaceUri); - var ownerFactory = new Mock(); - ownerFactory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(ownerManager.Object); - NodeManagerRegistration ownerRegistration = await m_server.NodeManagerLifecycle - .AddAsync(ownerFactory.Object) + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscriptionResponse = await services + .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0) .ConfigureAwait(false); + uint subscriptionId = subscriptionResponse.SubscriptionId; - IServerInternal server = m_server.CurrentInstance; - var host = (IDynamicNodeManagerHost)server.NodeManager; - ushort ownerNamespaceIndex = (ushort)server.NamespaceUris.GetIndex( - OwnerNamespaceUri); - var ownerSourceId = new NodeId(3001, ownerNamespaceIndex); - object ownerHandle = new(); - int deleteReferenceCalls = 0; - bool failRollbackDelete = true; - ownerManager - .Setup(manager => manager.GetManagerHandleAsync( - ownerSourceId, - It.IsAny())) - .Returns(new ValueTask(ownerHandle)); - ownerManager - .Setup(manager => manager.DeleteReferenceAsync( - ownerHandle, - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server, - false, - It.IsAny())) - .Returns(() => - { - deleteReferenceCalls++; - if (failRollbackDelete && deleteReferenceCalls >= 2) - { - return new ValueTask( - Task.FromException( - new SentinelException(DeleteReferenceFailure))); - } - return new ValueTask(ServiceResult.Good); - }); + ArrayOf monitoredItems = + [CreateModelChangeEventMonitoredItem(clientHandle: 1, queueSize: 10)]; - Mock currentManager = - CreateLifecycleNodeManager(ReplacedNamespaceUri); - currentManager - .Setup(manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) - .Callback< - IDictionary>, - CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = - [ - new NodeStateReference( - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server) - ]) - .Returns(default(ValueTask)); - PreparedNodeManager current = await host - .PrepareAsync(currentManager.Object) + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse createItemsResponse = await services + .CreateMonitoredItemsAsync(requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) .ConfigureAwait(false); - await host.PublishAsync(current).ConfigureAwait(false); - await host.CommitAsync(current).ConfigureAwait(false); + Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); + Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); - Mock replacementManager = - CreateLifecycleNodeManager(ReplacedNamespaceUri); - replacementManager - .Setup(manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) - .Callback< - IDictionary>, - CancellationToken>((externalReferences, _) => externalReferences[ownerSourceId] = - [ - new NodeStateReference( - ReferenceTypeIds.HasComponent, - false, - ObjectIds.Server) - ]) - .Returns(default(ValueTask)); - bool failReplacementAddReferences = true; - replacementManager - .Setup(manager => manager.AddReferencesAsync( - It.IsAny>>(), - It.IsAny())) - .Returns(() => failReplacementAddReferences - ? new ValueTask(Task.FromException( - new SentinelException(AddReferencesFailure))) - : default); - PreparedNodeManager replacement = await host - .PrepareAsync(replacementManager.Object) - .ConfigureAwait(false); - await host - .ReplaceAsync(currentManager.Object, replacement) - .ConfigureAwait(false); + ArrayOf acknowledgements = default; + try + { + IServerInternal server = m_server.CurrentInstance; - using var monitoredItem = new MonitoredItem( - server, - currentManager.Object, - new object(), - subscriptionId: 1, - id: 3001, - itemToMonitor: new ReadValueId - { - NodeId = new NodeId("RetainedRepair", ownerNamespaceIndex), - AttributeId = Attributes.Value - }, - diagnosticsMasks: DiagnosticsMasks.None, - timestampsToReturn: TimestampsToReturn.Both, - monitoringMode: MonitoringMode.Reporting, - clientHandle: 1, - originalFilter: null, - filterToUse: null, - range: null, - samplingInterval: 1000, - queueSize: 1, - discardOldest: true, - sourceSamplingInterval: 1000); - var itemLifecycle = (IDetachableMonitoredItem)monitoredItem; - int repairCalls = 0; - int rollbackCalls = 0; + // Add: registers a brand-new namespace URI. + int namespaceCountBeforeAdd = server.NamespaceUris.Count; + uint urisVersionBeforeAdd = await ReadUrisVersionAsync().ConfigureAwait(false); + + NodeManagerRegistration registration = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) + .ConfigureAwait(false); + + EventFieldList addEvent; + (addEvent, acknowledgements) = await PublishForModelChangeEventAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + AssertModelChangeEvent(addEvent, "A live NodeManager was added."); + + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBeforeAdd + 1)); + uint urisVersionAfterAdd = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfterAdd, Is.Not.EqualTo(urisVersionBeforeAdd)); + + // Reload (same URI): must not change the namespace table. + int namespaceCountBeforeReload = server.NamespaceUris.Count; + uint urisVersionBeforeReload = urisVersionAfterAdd; + + registration = await m_server.NodeManagerLifecycle + .ReloadRuntimeNodeSetAsync(registration, CreateGenerationOptions(generation: 2)) + .ConfigureAwait(false); - try - { - AggregateException exception = Assert.ThrowsAsync( - async () => await host - .CommitAsync( - replacement, - beforeCommit: () => - { - itemLifecycle.Detach(server); - return default; - }, - afterCommit: () => - { - repairCalls++; - itemLifecycle.Rebind(replacementManager.Object, new object()); - return new ValueTask(Task.FromException( - new SentinelException(RepairFailure))); - }, - rollbackCommit: () => - { - rollbackCalls++; - itemLifecycle.Rebind(currentManager.Object, new object()); - return default; - }) - .ConfigureAwait(false)); + EventFieldList reloadEvent; + (reloadEvent, acknowledgements) = await PublishForModelChangeEventAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + AssertModelChangeEvent(reloadEvent, "A live NodeManager was reloaded."); - string[] failureMessages = [.. exception - .Flatten() - .InnerExceptions - .Select(failure => failure.Message)]; - Assert.Multiple(() => - { - Assert.That(replacement.Published, Is.True); - Assert.That(repairCalls, Is.EqualTo(1)); - Assert.That(rollbackCalls, Is.Zero); - Assert.That(monitoredItem.NodeManager, Is.SameAs(replacementManager.Object)); - Assert.That(itemLifecycle.IsDetached, Is.False); - Assert.That(failureMessages, Does.Contain(AddReferencesFailure)); - Assert.That(failureMessages, Does.Contain(DeleteReferenceFailure)); - Assert.That(failureMessages, Does.Contain(RepairFailure)); - }); + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBeforeReload)); + uint urisVersionAfterReload = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfterReload, Is.EqualTo(urisVersionBeforeReload)); + + // Remove: must not change the namespace table either. + int namespaceCountBeforeRemove = server.NamespaceUris.Count; + uint urisVersionBeforeRemove = urisVersionAfterReload; + + await m_server.NodeManagerLifecycle.RemoveAsync(registration).ConfigureAwait(false); + + EventFieldList removeEvent; + (removeEvent, acknowledgements) = await PublishForModelChangeEventAsync( + services, + subscriptionId, + acknowledgements).ConfigureAwait(false); + AssertModelChangeEvent(removeEvent, "A live NodeManager was removed."); + + Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBeforeRemove)); + uint urisVersionAfterRemove = await ReadUrisVersionAsync().ConfigureAwait(false); + Assert.That(urisVersionAfterRemove, Is.EqualTo(urisVersionBeforeRemove)); } finally { - failReplacementAddReferences = false; - failRollbackDelete = false; - if (replacement.Published) - { - await host - .UnpublishAsync(replacementManager.Object) - .ConfigureAwait(false); - } - await host - .DestroyAsync( - replacementManager.Object, - removeExternalReferences: false) - .ConfigureAwait(false); - await host - .DestroyAsync( - currentManager.Object, - removeExternalReferences: false) - .ConfigureAwait(false); - await m_server.NodeManagerLifecycle - .RemoveAsync(ownerRegistration) + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ArrayOf subscriptionIds = [subscriptionId]; + await services + .DeleteSubscriptionsAsync(requestHeader, subscriptionIds) .ConfigureAwait(false); } } - [Test] - public Task LifecycleArgumentGuardsRejectNullInputsAsync() + /// + /// Creates a subscription and a single reporting, data-change monitored item on the + /// given node's Value attribute. + /// + private async Task<(uint SubscriptionId, uint MonitoredItemId)> + CreateSubscriptionWithMonitoredItemAsync( + ServerTestServices services, + NodeId nodeId) { - var lifecycle = (NodeManagerLifecycle)m_server.NodeManagerLifecycle; - IAsyncNodeManagerFactory asyncFactory = - Mock.Of(); - INodeManagerFactory syncFactory = Mock.Of(); + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscriptionResponse = await services + .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0) + .ConfigureAwait(false); + uint subscriptionId = subscriptionResponse.SubscriptionId; - ArgumentNullException exception = - Assert.ThrowsAsync( - async () => await lifecycle - .AddAsync((IAsyncNodeManagerFactory)null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("factory")); + ArrayOf monitoredItems = + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = nodeId, + AttributeId = Attributes.Value + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = 1, + SamplingInterval = 0, + QueueSize = 1, + DiscardOldest = true + } + } + ]; - exception = Assert.ThrowsAsync( - async () => await lifecycle - .AddAsync((INodeManagerFactory)null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("factory")); + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse createItemsResponse = await services + .CreateMonitoredItemsAsync(requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) + .ConfigureAwait(false); - exception = Assert.ThrowsAsync( - async () => await lifecycle - .ReloadAsync( - null!, - (IAsyncNodeManagerFactory)null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("replacement")); + Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); + Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); - exception = Assert.ThrowsAsync( - async () => await lifecycle - .ReloadAsync( - null!, - (INodeManagerFactory)null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("replacement")); + return (subscriptionId, createItemsResponse.Results[0].MonitoredItemId); + } - exception = Assert.ThrowsAsync( - async () => await lifecycle - .ReloadAsync(null!, asyncFactory) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("registration")); + private async Task<( + MonitoredItemNotification Notification, + ArrayOf Acknowledgements)> PublishForDataChangeAsync( + ServerTestServices services, + uint subscriptionId, + ArrayOf acknowledgements) + { + const int MaxPublishAttempts = 20; + for (int attempt = 0; attempt < MaxPublishAttempts; attempt++) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + PublishResponse response = await services + .PublishAsync(requestHeader, acknowledgements, timeoutCts.Token) + .ConfigureAwait(false); + Assert.That(response.SubscriptionId, Is.EqualTo(subscriptionId)); - exception = Assert.ThrowsAsync( - async () => await lifecycle - .ReloadAsync(null!, syncFactory) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("registration")); + acknowledgements = response.AvailableSequenceNumbers.ToArrayOf( + sequenceNumber => new SubscriptionAcknowledgement + { + SubscriptionId = subscriptionId, + SequenceNumber = sequenceNumber + }); - exception = Assert.ThrowsAsync( - async () => await lifecycle - .RemoveAsync(null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("registration")); + foreach (ExtensionObject notificationData in + response.NotificationMessage.NotificationData) + { + if (notificationData.TryGetValue( + out DataChangeNotification dataChangeNotification) && + dataChangeNotification.MonitoredItems.Count > 0) + { + return (dataChangeNotification.MonitoredItems[0], acknowledgements); + } + } + } + + Assert.Fail("No data-change notification was published."); + return default; + } + + /// + /// Deletes the given subscription so it no longer owns any monitored items. + /// + private async Task DeleteSubscriptionAsync(ServerTestServices services, uint subscriptionId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ArrayOf subscriptionIds = [subscriptionId]; + DeleteSubscriptionsResponse response = await services + .DeleteSubscriptionsAsync(requestHeader, subscriptionIds) + .ConfigureAwait(false); + Assert.That(response.Results.Count, Is.EqualTo(1)); + Assert.That(response.Results[0], Is.EqualTo(StatusCodes.Good)); + } + + private async Task DeleteMonitoredItemAsync( + ServerTestServices services, + uint subscriptionId, + uint monitoredItemId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + DeleteMonitoredItemsResponse response = await services + .DeleteMonitoredItemsAsync( + requestHeader, + subscriptionId, + [monitoredItemId]) + .ConfigureAwait(false); + Assert.That(response.Results.Count, Is.EqualTo(1)); + Assert.That(response.Results[0], Is.EqualTo(StatusCodes.Good)); + } + + private async Task ModifyEventMonitoredItemAsync( + ServerTestServices services, + uint subscriptionId, + uint monitoredItemId) + { + var eventFilter = new EventFilter(); + eventFilter.AddSelectClause( + ObjectTypeIds.BaseEventType, + QualifiedName.From(BrowseNames.EventType)); + eventFilter.AddSelectClause( + ObjectTypeIds.BaseEventType, + QualifiedName.From(BrowseNames.Message)); + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ModifyMonitoredItemsResponse response = await services + .ModifyMonitoredItemsAsync( + requestHeader, + subscriptionId, + TimestampsToReturn.Both, + [ + new MonitoredItemModifyRequest + { + MonitoredItemId = monitoredItemId, + RequestedParameters = new MonitoringParameters + { + ClientHandle = 1, + SamplingInterval = 0, + Filter = new ExtensionObject(eventFilter), + QueueSize = 2, + DiscardOldest = true + } + } + ]) + .ConfigureAwait(false); + Assert.That(response.Results.Count, Is.EqualTo(1)); + Assert.That(response.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + } - exception = Assert.ThrowsAsync( - async () => await lifecycle - .BeginShutdownAsync(null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("server")); + private static async Task WaitForNodeManagerVisibilityAsync( + MasterNodeManager master, + IAsyncNodeManager nodeManager, + bool visible) + { + const int MaxAttempts = 100; + for (int attempt = 0; attempt < MaxAttempts; attempt++) + { + if (master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, nodeManager)) == visible) + { + return; + } + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } - exception = Assert.ThrowsAsync( - async () => await lifecycle - .CompleteShutdownAsync(null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("server")); - return Task.CompletedTask; + Assert.That( + master.AsyncNodeManagers.Any(candidate => + ReferenceEquals(candidate, nodeManager)), + Is.EqualTo(visible)); } - [Test] - public async Task DynamicHostGuardsRejectInvalidArgumentsAndStateAsync() + private static async Task WaitForRegistrationAsync( + INodeManagerLifecycle lifecycle, + Guid registrationId, + IAsyncNodeManager nodeManager) { - var host = (IDynamicNodeManagerHost)m_server.CurrentInstance.NodeManager; - var coordinator = - (IDynamicNodeManagerHost)m_server.CurrentInstance.NodeManager; - Mock candidate = CreateLifecycleNodeManager( - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:HostGuards"); - var prepared = new PreparedNodeManager( - candidate.Object, - []); + const int MaxAttempts = 100; + for (int attempt = 0; attempt < MaxAttempts; attempt++) + { + NodeManagerRegistration registration = lifecycle.Registrations.Find( + candidate => candidate.Id == registrationId); + if (registration is not null && + ReferenceEquals(registration.NodeManager, nodeManager)) + { + return; + } + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } - ArgumentNullException exception = - Assert.ThrowsAsync( - async () => await host - .PrepareAsync(null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + Assert.That( + lifecycle.Registrations.Find(candidate => + candidate.Id == registrationId)?.NodeManager, + Is.SameAs(nodeManager)); + } - exception = Assert.ThrowsAsync( - async () => await host - .PublishAsync(null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("prepared")); + private static async Task WaitForRegistrationAsync( + INodeManagerLifecycle lifecycle, + IAsyncNodeManager nodeManager) + { + await WaitForConditionAsync( + () => lifecycle.Registrations.Find(candidate => + ReferenceEquals(candidate.NodeManager, nodeManager)) is not null) + .ConfigureAwait(false); + } - exception = Assert.ThrowsAsync( - async () => await host - .ReplaceAsync(null!, prepared) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("current")); + private static Task HoldRequestAsync( + IServerInternal server, + TaskCompletionSource entered, + TaskCompletionSource release) + { + return RunWithoutExecutionContext(async () => + { + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + entered.TrySetResult(true); + await release.Task.ConfigureAwait(false); + }); + } - exception = Assert.ThrowsAsync( - async () => await host - .UnpublishAsync(null!) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + private static async Task AssertLifecycleOperationDidNotUseDisposedServicesAsync( + Task operation) + { + try + { + await operation + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + Assert.That(ex, Is.Not.InstanceOf()); + Assert.That(ex.ToString(), Does.Not.Contain(nameof(ObjectDisposedException))); + } + } - exception = Assert.ThrowsAsync( - async () => await host - .DestroyAsync( - null!, - removeExternalReferences: false) - .ConfigureAwait(false)); - Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + private static async Task AssertLifecycleOperationDidNotUseDisposedServicesAsync( + Task operation) + { + try + { + await operation + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false); + } + catch (Exception ex) when (ex is not OutOfMemoryException) + { + Assert.That(ex, Is.Not.InstanceOf()); + Assert.That(ex.ToString(), Does.Not.Contain(nameof(ObjectDisposedException))); + } + } - exception = Assert.Throws( - () => host.Release(null!)); - Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + private static async Task WaitForConditionAsync(Func condition) + { + const int MaxAttempts = 400; + for (int attempt = 0; attempt < MaxAttempts; attempt++) + { + if (condition()) + { + return; + } + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } + Assert.That(condition(), Is.True); + } - Assert.That( - async () => await host - .CommitAsync(prepared) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "has not been staged")); + private void AssertServerInternalsDisposed() + { + ServiceResultException exception = Assert.Throws( + () => _ = m_server.CurrentInstance); + Assert.That(exception.StatusCode, Is.EqualTo(StatusCodes.BadServerHalted)); + } - Mock unowned = CreateLifecycleNodeManager( - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:Unowned"); - Assert.That( - async () => await host - .ReplaceAsync(unowned.Object, prepared) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "not owned")); - Assert.That( - async () => await host - .UnpublishAsync(unowned.Object) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "not owned")); - Assert.DoesNotThrow(() => host.Release(unowned.Object)); + private async Task FinishShutdownTestAsync() + { + m_requestHeader = null; + if (m_fixture is not null) + { + await m_fixture.StopAsync().ConfigureAwait(false); + m_fixture = null; + } + m_server = null; + } - Mock destroyCandidate = - CreateLifecycleNodeManager( - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:Destroy"); - await host - .DestroyAsync( - destroyCandidate.Object, - removeExternalReferences: true) - .ConfigureAwait(false); - destroyCandidate.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); + private static Task RunWithoutExecutionContext(Func action) + { + Task task; + using (ExecutionContext.SuppressFlow()) + { + task = Task.Run(action); + } + return task; + } - await host.PublishAsync(prepared).ConfigureAwait(false); - Assert.That( - async () => await host - .PublishAsync(prepared) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "already been staged")); + private static Task RunWithoutExecutionContext(Func> action) + { + Task task; + using (ExecutionContext.SuppressFlow()) + { + task = Task.Run(action); + } + return task; + } - await host.RollbackAsync(prepared).ConfigureAwait(false); - candidate.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); + private static Task RunLifecycleCallbackRequestAsync( + IServerInternal server, + Func> operation, + TaskCompletionSource requestEntered = null) + { + return RunWithoutExecutionContext(async () => + { + var context = new OperationContext( + new RequestHeader(), + secureChannelContext: null, + RequestType.Call, + RequestLifetime.None); + using IDisposable dispatchScope = + server.RequestManager.EnterServiceDispatchScope(); + using IDisposable requestScope = + server.RequestManager.EnterRequestScope(context); + requestEntered?.TrySetResult(true); + return await operation().ConfigureAwait(false); + }); + } - Mock owned = CreateLifecycleNodeManager( - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:Owned"); - var factory = new Mock(); - factory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(owned.Object); - NodeManagerRegistration registration = await m_server - .NodeManagerLifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false); - var duplicate = new PreparedNodeManager(owned.Object, []); + private static async Task AssertLifecycleOperationStopsForShutdownAsync( + Task operation) + { + InvalidOperationException exception = Assert.ThrowsAsync( + async () => await operation + .WaitAsync(TimeSpan.FromSeconds(10)) + .ConfigureAwait(false)); Assert.That( - async () => await host - .PublishAsync(duplicate) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "already registered")); + exception.ToString(), + Does.Contain("shutting down")); + } - Mock replacement = CreateLifecycleNodeManager( - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:StagedReplacement"); - var stagedReplacement = new PreparedNodeManager( - replacement.Object, - []) + private static async Task WaitForRetiredNotificationsSuspendedAsync( + MasterNodeManager master, + TrackingLifecycleNodeManager retiredManager, + ISession session) + { + const int MaxAttempts = 100; + for (int attempt = 0; attempt < MaxAttempts; attempt++) { - Staged = true - }; - Assert.That( - async () => await host - .ReplaceAsync(owned.Object, stagedReplacement) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "already been staged")); + int before = retiredManager.SessionActivatedCount; + await master + .SessionActivatedAsync( + new OperationContext(session, DiagnosticsMasks.None), + session.Id, + CancellationToken.None) + .ConfigureAwait(false); + if (retiredManager.SessionActivatedCount == before) + { + return; + } + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } - await m_server.NodeManagerLifecycle - .RemoveAsync(registration) - .ConfigureAwait(false); + Assert.Fail( + "The direct retired-generation cleanup did not suspend notifications."); } - [Test] - public async Task IndependentLifecycleShutdownReleasesRegistrationsAndRejectsNewOperationsAsync() + private static async Task WaitForRetiredNotificationsResumedAsync( + MasterNodeManager master, + TrackingLifecycleNodeManager retiredManager, + ISession session) { - const string NamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:IndependentShutdown"; - Mock nodeManager = - CreateLifecycleNodeManager(NamespaceUri); - Mock disposable = nodeManager.As(); - var factory = new Mock(); - factory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(nodeManager.Object); - using var lifecycle = new NodeManagerLifecycle(m_server); - - NodeManagerRegistration registration = await lifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false); - IServerInternal server = m_server.CurrentInstance; - var master = (MasterNodeManager)server.NodeManager; - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, registration.NodeManager)), - Is.True); - - await lifecycle - .BeginShutdownAsync(server) - .ConfigureAwait(false); + int activationCount = retiredManager.SessionActivatedCount; + const int MaxAttempts = 200; + for (int attempt = 0; attempt < MaxAttempts; attempt++) + { + await master + .SessionActivatedAsync( + new OperationContext(session, DiagnosticsMasks.None), + session.Id, + CancellationToken.None) + .ConfigureAwait(false); + if (retiredManager.SessionActivatedCount > activationCount) + { + return; + } + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } - Assert.That( - async () => await lifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false), - Throws.InvalidOperationException.With.Message.Contains( - "shutting down")); + Assert.Fail( + "The failed retired-generation drain did not restore notifications."); + } - await lifecycle - .CompleteShutdownAsync(server) - .ConfigureAwait(false); + private static void AddSyntheticMonitoredItem( + Subscription subscription, + IMonitoredItem monitoredItem) + { + Lock subscriptionLock = GetSubscriptionLock(subscription); + lock (subscriptionLock) + { + GetSubscriptionMonitoredItems(subscription).Add( + monitoredItem.Id, + new LinkedListNode(monitoredItem)); + } + } - Assert.That(lifecycle.Registrations, Is.Empty); - Assert.That( - master.AsyncNodeManagers.Any(manager => - ReferenceEquals(manager, registration.NodeManager)), - Is.False); - disposable.Verify(value => value.Dispose(), Times.Once); + private static void RemoveSyntheticMonitoredItem( + Subscription subscription, + IMonitoredItem monitoredItem) + { + Lock subscriptionLock = GetSubscriptionLock(subscription); + lock (subscriptionLock) + { + GetSubscriptionMonitoredItems(subscription).Remove(monitoredItem.Id); + } } - - [Test] - public Task AddAsyncCleansFailedSessionActivationAsync() + private static Dictionary> + GetSubscriptionMonitoredItems(Subscription subscription) { - const string NamespaceUri = - "urn:opcfoundation.org:Tests:NodeManagerLifecycle:ActivationFailure"; - const string ExpectedMessage = "SessionActivatedAsync failed."; - var nodeManager = new Mock(); - var syncNodeManager = new Mock(); - nodeManager - .Setup(manager => manager.NamespaceUris) - .Returns([NamespaceUri]); - nodeManager - .Setup(manager => manager.SyncNodeManager) - .Returns(syncNodeManager.Object); - nodeManager - .Setup(manager => manager.CreateAddressSpaceAsync( - It.IsAny>>(), - It.IsAny())) - .Returns(default(ValueTask)); - nodeManager - .Setup(manager => manager.DeleteAddressSpaceAsync( - It.IsAny())) - .Returns(default(ValueTask)); - nodeManager - .Setup(manager => manager.SessionActivatedAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .Returns(() => new ValueTask( - Task.FromException( - new SentinelException(ExpectedMessage)))); - nodeManager - .Setup(manager => manager.SessionClosingAsync( - It.IsAny(), - It.IsAny(), - false, - It.IsAny())) - .Returns(default(ValueTask)); + FieldInfo field = typeof(Subscription).GetField( + "m_monitoredItems", + BindingFlags.Instance | BindingFlags.NonPublic); + Assert.That(field, Is.Not.Null); + return (Dictionary>)field.GetValue(subscription); + } - var factory = new Mock(); - factory - .Setup(value => value.CreateAsync( - It.IsAny(), - It.IsAny(), - It.IsAny())) - .ReturnsAsync(nodeManager.Object); + private static Lock GetSubscriptionLock(Subscription subscription) + { + FieldInfo field = typeof(Subscription).GetField( + "m_lock", + BindingFlags.Instance | BindingFlags.NonPublic); + Assert.That(field, Is.Not.Null); + return (Lock)field.GetValue(subscription); + } - Assert.That( - async () => await m_server.NodeManagerLifecycle - .AddAsync(factory.Object) - .ConfigureAwait(false), - Throws.TypeOf() - .With.Message.EqualTo(ExpectedMessage)); + private static async Task WaitForConditionRefreshCountAsync( + TrackingLifecycleNodeManager nodeManager, + int expectedCount) + { + const int MaxAttempts = 100; + for (int attempt = 0; attempt < MaxAttempts; attempt++) + { + if (nodeManager.ConditionRefreshCount >= expectedCount) + { + return; + } + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } - nodeManager.Verify( - manager => manager.SessionClosingAsync( - It.IsAny(), - It.IsAny(), - false, - CancellationToken.None), - Times.AtLeastOnce); - nodeManager.Verify( - manager => manager.DeleteAddressSpaceAsync( - CancellationToken.None), - Times.Once); - Assert.That( - m_server.NodeManagerLifecycle.Registrations, - Is.Empty); - return Task.CompletedTask; + Assert.That(nodeManager.ConditionRefreshCount, Is.GreaterThanOrEqualTo(expectedCount)); } /// - /// An event subscription and monitored item on , - /// created before the live NodeManager is ever added, must receive one - /// BaseModelChangeEventState-shaped notification per lifecycle operation - /// (add, same-URI reload, remove), each carrying the provider's exact - /// SourceNode/SourceName/Message values (no Changes - /// field is expected, since that only exists on the separate - /// GeneralModelChangeEventState/SemanticChangeEventState shapes). Add - /// must also change the server's namespace table - /// (NamespaceArray/UrisVersion), while a same-URI reload and a - /// subsequent remove must both leave it unchanged. + /// Creates a subscription with a single reporting data monitored item on + /// and returns both the subscription id and the + /// server-assigned monitored item id (needed to target Modify, SetMonitoringMode, + /// and Delete at that specific item). /// - [Test] - [Category("NodeManagerLifecycleEvents")] - public async Task ExistingServerEventSubscriptionReceivesLifecycleModelChangeEventsAsync() + private async Task<(uint SubscriptionId, uint MonitoredItemId)> + CreateSubscriptionAndMonitoredItemAsync( + ServerTestServices services, + NodeId nodeId, + uint clientHandle) { - var services = new ServerTestServices(m_server, m_secureChannelContext); - RequestHeader requestHeader = m_requestHeader; requestHeader.Timestamp = DateTimeUtc.Now; CreateSubscriptionResponse subscriptionResponse = await services @@ -2269,151 +7471,269 @@ public async Task ExistingServerEventSubscriptionReceivesLifecycleModelChangeEve uint subscriptionId = subscriptionResponse.SubscriptionId; ArrayOf monitoredItems = - [CreateModelChangeEventMonitoredItem(clientHandle: 1, queueSize: 10)]; + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = nodeId, + AttributeId = Attributes.Value + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = clientHandle, + SamplingInterval = 0, + QueueSize = 1, + DiscardOldest = true + } + } + ]; requestHeader = m_requestHeader; requestHeader.Timestamp = DateTimeUtc.Now; CreateMonitoredItemsResponse createItemsResponse = await services .CreateMonitoredItemsAsync(requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) .ConfigureAwait(false); + Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); - ArrayOf acknowledgements = default; - try - { - IServerInternal server = m_server.CurrentInstance; - - // --- Add: registers a brand-new namespace URI. --- - int namespaceCountBeforeAdd = server.NamespaceUris.Count; - uint urisVersionBeforeAdd = await ReadUrisVersionAsync().ConfigureAwait(false); + return (subscriptionId, createItemsResponse.Results[0].MonitoredItemId); + } - NodeManagerRegistration registration = await m_server.NodeManagerLifecycle - .AddRuntimeNodeSetAsync(CreateGenerationOptions(generation: 1)) - .ConfigureAwait(false); + /// + /// Creates a subscription with one reporting event monitored item on the supplied + /// event notifier and returns both server-assigned identifiers. + /// + private async Task<(uint SubscriptionId, uint MonitoredItemId)> + CreateSubscriptionAndEventMonitoredItemAsync( + ServerTestServices services, + NodeId nodeId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscriptionResponse = await services + .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0) + .ConfigureAwait(false); + uint subscriptionId = subscriptionResponse.SubscriptionId; - EventFieldList addEvent; - (addEvent, acknowledgements) = await PublishForModelChangeEventAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - AssertModelChangeEvent(addEvent, "A live NodeManager was added."); + var eventFilter = new EventFilter(); + eventFilter.AddSelectClause( + ObjectTypeIds.BaseEventType, + QualifiedName.From(BrowseNames.EventType)); + ArrayOf monitoredItems = + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = nodeId, + AttributeId = Attributes.EventNotifier + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = 1, + SamplingInterval = 0, + Filter = new ExtensionObject(eventFilter), + QueueSize = 1, + DiscardOldest = true + } + } + ]; - Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBeforeAdd + 1)); - uint urisVersionAfterAdd = await ReadUrisVersionAsync().ConfigureAwait(false); - Assert.That(urisVersionAfterAdd, Is.Not.EqualTo(urisVersionBeforeAdd)); + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse createItemsResponse = await services + .CreateMonitoredItemsAsync(requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) + .ConfigureAwait(false); - // --- Reload (same URI): must not change the namespace table. --- - int namespaceCountBeforeReload = server.NamespaceUris.Count; - uint urisVersionBeforeReload = urisVersionAfterAdd; + Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); + Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); - registration = await m_server.NodeManagerLifecycle - .ReloadRuntimeNodeSetAsync(registration, CreateGenerationOptions(generation: 2)) - .ConfigureAwait(false); + return (subscriptionId, createItemsResponse.Results[0].MonitoredItemId); + } - EventFieldList reloadEvent; - (reloadEvent, acknowledgements) = await PublishForModelChangeEventAsync( - services, + private async Task CreateEventMonitoredItemAsync( + ServerTestServices services, + uint subscriptionId, + NodeId nodeId, + uint clientHandle) + { + var eventFilter = new EventFilter(); + eventFilter.AddSelectClause( + ObjectTypeIds.BaseEventType, + QualifiedName.From(BrowseNames.EventType)); + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse response = await services + .CreateMonitoredItemsAsync( + requestHeader, subscriptionId, - acknowledgements).ConfigureAwait(false); - AssertModelChangeEvent(reloadEvent, "A live NodeManager was reloaded."); - - Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBeforeReload)); - uint urisVersionAfterReload = await ReadUrisVersionAsync().ConfigureAwait(false); - Assert.That(urisVersionAfterReload, Is.EqualTo(urisVersionBeforeReload)); - - // --- Remove: must not change the namespace table either. --- - int namespaceCountBeforeRemove = server.NamespaceUris.Count; - uint urisVersionBeforeRemove = urisVersionAfterReload; + TimestampsToReturn.Both, + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = nodeId, + AttributeId = Attributes.EventNotifier + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = clientHandle, + SamplingInterval = 0, + Filter = new ExtensionObject(eventFilter), + QueueSize = 1, + DiscardOldest = true + } + } + ]) + .ConfigureAwait(false); - await m_server.NodeManagerLifecycle.RemoveAsync(registration).ConfigureAwait(false); + Assert.That(response.Results.Count, Is.EqualTo(1)); + Assert.That(response.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + return response.Results[0].MonitoredItemId; + } - EventFieldList removeEvent; - (removeEvent, acknowledgements) = await PublishForModelChangeEventAsync( - services, - subscriptionId, - acknowledgements).ConfigureAwait(false); - AssertModelChangeEvent(removeEvent, "A live NodeManager was removed."); + /// + /// Pushes a fresh value directly onto a retired generation's own node, simulating an + /// internal (device-driven) update so tests can prove the retired generation still + /// services its existing monitored items after a ShadowReload switch. + /// + private static async Task PushRetiredValueAsync( + IServerInternal server, + AsyncCustomNodeManager retiredManager, + NodeId nodeId, + int value) + { + var state = (BaseVariableState)retiredManager.Find(nodeId)!; + state.Value = value; + state.Timestamp = DateTimeUtc.Now; + state.StatusCode = StatusCodes.Good; + state.UpdateChangeMasks(NodeStateChangeMasks.Value); + await state + .ClearChangeMasksAsync(server.DefaultSystemContext, includeChildren: false) + .ConfigureAwait(false); + } - Assert.That(server.NamespaceUris.Count, Is.EqualTo(namespaceCountBeforeRemove)); - uint urisVersionAfterRemove = await ReadUrisVersionAsync().ConfigureAwait(false); - Assert.That(urisVersionAfterRemove, Is.EqualTo(urisVersionBeforeRemove)); - } - finally + /// + /// Polls (bounded) until the retired generation's own address space has been torn + /// down (its PredefinedNodes emptied), proving the retired generation is + /// disposed promptly once its last monitored item drains - without any further + /// lifecycle operation being invoked by the test. + /// + private static async Task AssertRetiredGenerationDisposedAsync( + AsyncCustomNodeManager retiredManager, + NodeId nodeId) + { + const int MaxAttempts = 50; + for (int attempt = 0; attempt < MaxAttempts; attempt++) { - requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - ArrayOf subscriptionIds = [subscriptionId]; - await services - .DeleteSubscriptionsAsync(requestHeader, subscriptionIds) - .ConfigureAwait(false); + if (retiredManager.Find(nodeId) is null) + { + return; + } + await Task.Delay(100).ConfigureAwait(false); } + + Assert.That( + retiredManager.Find(nodeId), + Is.Null, + "The shadow-retired generation must be disposed promptly once its last monitored " + + "item drains, without any further lifecycle operation."); } /// - /// Creates a subscription and a single reporting, data-change monitored item on the - /// given node's Value attribute. + /// Publishes on using the given session's request + /// header in a bounded loop until a carrying + /// arrives. Used to prove a transferred monitored item + /// keeps being serviced by the (retired) generation that owns it, from a second session. /// - private async Task<(uint SubscriptionId, uint MonitoredItemId)> - CreateSubscriptionWithMonitoredItemAsync( - ServerTestServices services, - NodeId nodeId) - { - RequestHeader requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - CreateSubscriptionResponse subscriptionResponse = await services - .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0) - .ConfigureAwait(false); - uint subscriptionId = subscriptionResponse.SubscriptionId; + private async Task<(DataValue? Value, ArrayOf Acknowledgements)> + PublishForDataChangeOnSessionAsync( + ServerTestServices services, + RequestHeader sessionRequestHeader, + uint subscriptionId, + ArrayOf acknowledgements, + uint clientHandle) + { + const int MaxPublishAttempts = 20; + DataValue? value = null; - ArrayOf monitoredItems = - [ - new MonitoredItemCreateRequest - { - ItemToMonitor = new ReadValueId + for (int attempt = 0; attempt < MaxPublishAttempts && value is null; attempt++) + { + sessionRequestHeader.Timestamp = DateTimeUtc.Now; + + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + PublishResponse response = await services + .PublishAsync(sessionRequestHeader, acknowledgements, timeoutCts.Token) + .ConfigureAwait(false); + + Assert.That(response.SubscriptionId, Is.EqualTo(subscriptionId)); + + acknowledgements = response.AvailableSequenceNumbers.ToArrayOf( + sequenceNumber => new SubscriptionAcknowledgement { - NodeId = nodeId, - AttributeId = Attributes.Value - }, - MonitoringMode = MonitoringMode.Reporting, - RequestedParameters = new MonitoringParameters + SubscriptionId = subscriptionId, + SequenceNumber = sequenceNumber + }); + + if (response.NotificationMessage is { } message) + { + foreach (ExtensionObject notificationData in message.NotificationData) { - ClientHandle = 1, - SamplingInterval = 0, - QueueSize = 1, - DiscardOldest = true + if (notificationData.TryGetValue(out DataChangeNotification dcn)) + { + foreach (MonitoredItemNotification item in dcn.MonitoredItems) + { + if (item.ClientHandle == clientHandle) + { + value = item.Value; + } + } + } } } - ]; - - requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - CreateMonitoredItemsResponse createItemsResponse = await services - .CreateMonitoredItemsAsync(requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) - .ConfigureAwait(false); - - Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); - Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + } - return (subscriptionId, createItemsResponse.Results[0].MonitoredItemId); + Assert.That( + value, + Is.Not.Null, + $"No data-change notification for client handle {clientHandle} on subscription " + + $"{subscriptionId} arrived within {MaxPublishAttempts} bounded publish attempts."); + return (value, acknowledgements); } - private async Task<( - MonitoredItemNotification Notification, - ArrayOf Acknowledgements)> PublishForDataChangeAsync( + /// + /// Publishes on in a bounded loop, acknowledging + /// previously delivered sequence numbers on each call, until a + /// carrying + /// arrives. Used to prove that a monitored item keeps being serviced (by whichever + /// NodeManager generation owns it) after a live lifecycle switch. + /// + private async Task<(DataValue? Value, ArrayOf Acknowledgements)> + PublishForDataChangeAsync( ServerTestServices services, uint subscriptionId, - ArrayOf acknowledgements) + ArrayOf acknowledgements, + uint clientHandle) { const int MaxPublishAttempts = 20; - for (int attempt = 0; attempt < MaxPublishAttempts; attempt++) + DataValue? value = null; + + for (int attempt = 0; attempt < MaxPublishAttempts && value is null; attempt++) { RequestHeader requestHeader = m_requestHeader; requestHeader.Timestamp = DateTimeUtc.Now; + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); PublishResponse response = await services .PublishAsync(requestHeader, acknowledgements, timeoutCts.Token) .ConfigureAwait(false); + Assert.That(response.SubscriptionId, Is.EqualTo(subscriptionId)); acknowledgements = response.AvailableSequenceNumbers.ToArrayOf( @@ -2423,35 +7743,30 @@ await services SequenceNumber = sequenceNumber }); - foreach (ExtensionObject notificationData in - response.NotificationMessage.NotificationData) + if (response.NotificationMessage is { } message) { - if (notificationData.TryGetValue( - out DataChangeNotification dataChangeNotification) && - dataChangeNotification.MonitoredItems.Count > 0) + foreach (ExtensionObject notificationData in message.NotificationData) { - return (dataChangeNotification.MonitoredItems[0], acknowledgements); + if (notificationData.TryGetValue(out DataChangeNotification dcn)) + { + foreach (MonitoredItemNotification item in dcn.MonitoredItems) + { + if (item.ClientHandle == clientHandle) + { + value = item.Value; + } + } + } } } } - Assert.Fail("No data-change notification was published."); - return default; - } - - /// - /// Deletes the given subscription so it no longer owns any monitored items. - /// - private async Task DeleteSubscriptionAsync(ServerTestServices services, uint subscriptionId) - { - RequestHeader requestHeader = m_requestHeader; - requestHeader.Timestamp = DateTimeUtc.Now; - ArrayOf subscriptionIds = [subscriptionId]; - DeleteSubscriptionsResponse response = await services - .DeleteSubscriptionsAsync(requestHeader, subscriptionIds) - .ConfigureAwait(false); - Assert.That(response.Results.Count, Is.EqualTo(1)); - Assert.That(response.Results[0], Is.EqualTo(StatusCodes.Good)); + Assert.That( + value, + Is.Not.Null, + $"No data-change notification for client handle {clientHandle} on subscription " + + $"{subscriptionId} arrived within {MaxPublishAttempts} bounded publish attempts."); + return (value, acknowledgements); } /// @@ -2626,9 +7941,12 @@ private static void AssertModelChangeEvent(EventFieldList eventFields, string ex /// should be reported/fixed separately. /// /// - private static RuntimeNodeSetOptions CreateOptions(string namespaceUri, int value) + private static RuntimeNodeSetOptions CreateOptions( + string namespaceUri, + int value, + bool subscribeToEvents = false) { - string xml = BuildNodeSetXml(namespaceUri); + string xml = BuildNodeSetXml(namespaceUri, subscribeToEvents); return new RuntimeNodeSetOptions { @@ -2661,6 +7979,14 @@ private static RuntimeNodeSetOptions CreateGenerationOptions(int generation) generation == 1 ? kGeneration1Value : kGeneration2Value); } + private static RuntimeNodeSetOptions CreateEventGenerationOptions(int generation) + { + return CreateOptions( + kModelNamespaceUri, + generation == 1 ? kGeneration1Value : kGeneration2Value, + subscribeToEvents: true); + } + private static RuntimeNodeSetOptions CreateDroppedGenerationOptions() { string xml = $""" @@ -2702,8 +8028,11 @@ private static RuntimeNodeSetOptions CreateDroppedGenerationOptions() /// for why its concrete value is instead wired through the fluent /// Configure callback. /// - private static string BuildNodeSetXml(string namespaceUri) + private static string BuildNodeSetXml( + string namespaceUri, + bool subscribeToEvents = false) { + string eventNotifier = subscribeToEvents ? " EventNotifier=\"1\"" : string.Empty; return $""" - + {kRootBrowseName} i=58 @@ -2739,12 +8068,21 @@ private static string BuildNodeSetXml(string namespaceUri) /// Reads a single node attribute through the Read service and validates the response /// and diagnostic shape. /// - private async Task ReadValueAsync(NodeId nodeId, uint attributeId = Attributes.Value) + private Task ReadValueAsync( + NodeId nodeId, + uint attributeId = Attributes.Value) + { + return ReadValueAsync(nodeId, m_requestHeader, attributeId); + } + + private async Task ReadValueAsync( + NodeId nodeId, + RequestHeader requestHeader, + uint attributeId = Attributes.Value) { ArrayOf readIds = [new ReadValueId { NodeId = nodeId, AttributeId = attributeId }]; - RequestHeader requestHeader = m_requestHeader; requestHeader.Timestamp = DateTimeUtc.Now; ReadResponse response = await m_server.ReadAsync( m_secureChannelContext, @@ -2814,15 +8152,120 @@ private static Mock CreateLifecycleNodeManager( return nodeManager; } - private sealed class NodeManagementLifecycleNodeManager : AsyncCustomNodeManager + private IAsyncNodeManagerFactory CreateNodeManagementFactory( + int value, + bool includeEuRange) + { + var factory = new Mock(); + factory + .Setup(candidate => candidate.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(( + IServerInternal server, + ApplicationConfiguration configuration, + CancellationToken _) => new ValueTask( + new NodeManagementLifecycleNodeManager( + server, + configuration, + m_logger, + kModelNamespaceUri, + value, + includeEuRange))); + return factory.Object; + } + + private IAsyncNodeManagerFactory CreateTrackingNodeManagementFactory( + int value, + Action onCreated, + string namespaceUri = kModelNamespaceUri, + NodeId? externalParentId = null) + { + var factory = new Mock(); + factory + .Setup(candidate => candidate.CreateAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(( + IServerInternal server, + ApplicationConfiguration configuration, + CancellationToken _) => + { + var manager = new TrackingLifecycleNodeManager( + server, + configuration, + m_logger, + namespaceUri, + value, + externalParentId); + onCreated(manager); + return new ValueTask(manager); + }); + return factory.Object; + } + + private sealed class CallbackSafeNodeManagerFactory : + IAsyncNodeManagerFactory, + IRequestCallbackSafeNodeManagerFactory + { + public CallbackSafeNodeManagerFactory( + ArrayOf namespaceUris, + Func< + IServerInternal, + ApplicationConfiguration, + CancellationToken, + ValueTask> create) + { + NamespacesUris = namespaceUris; + m_create = create; + } + + public ArrayOf NamespacesUris { get; } + + public bool AllowLifecycleFromRequestCallback => true; + + public int CreateCount => Volatile.Read(ref m_createCount); + + public ValueTask CreateAsync( + IServerInternal server, + ApplicationConfiguration configuration, + CancellationToken cancellationToken = default) + { + Interlocked.Increment(ref m_createCount); + return m_create(server, configuration, cancellationToken); + } + + private readonly Func< + IServerInternal, + ApplicationConfiguration, + CancellationToken, + ValueTask> m_create; + private int m_createCount; + } + + private class NodeManagementLifecycleNodeManager : + AsyncCustomNodeManager, + INodeManagerReloadParticipant { + private readonly int m_value; + private readonly bool m_includeEuRange; + private readonly NodeId? m_externalParentId; + public NodeManagementLifecycleNodeManager( IServerInternal server, ApplicationConfiguration configuration, ILogger logger, - params string[] namespaceUris) - : base(server, configuration, logger, namespaceUris) + string namespaceUri, + int value = kGeneration1Value, + bool includeEuRange = false, + NodeId? externalParentId = null) + : base(server, configuration, logger, namespaceUri) { + m_value = value; + m_includeEuRange = includeEuRange; + m_externalParentId = externalParentId; } public override bool AllowNodeManagement => true; @@ -2832,17 +8275,23 @@ public override async ValueTask CreateAddressSpaceAsync( CancellationToken cancellationToken = default) { ushort namespaceIndex = NamespaceIndexes[0]; + NodeId externalParentId = + m_externalParentId ?? ObjectIds.ObjectsFolder; + NodeId externalReferenceTypeId = m_externalParentId is null + ? ReferenceTypeIds.Organizes + : ReferenceTypeIds.HasComponent; var root = new BaseObjectState(null) { NodeId = new NodeId(kRootNodeId, namespaceIndex), BrowseName = new QualifiedName(kRootBrowseName, namespaceIndex), DisplayName = new LocalizedText(kRootBrowseName), - ReferenceTypeId = ReferenceTypeIds.Organizes + ReferenceTypeId = externalReferenceTypeId, + EventNotifier = EventNotifiers.SubscribeToEvents }; root.AddReference( - ReferenceTypeIds.Organizes, + externalReferenceTypeId, true, - ObjectIds.ObjectsFolder); + externalParentId); var variable = new BaseDataVariableState(root) { @@ -2854,8 +8303,30 @@ public override async ValueTask CreateAddressSpaceAsync( ValueRank = ValueRanks.Scalar, AccessLevel = AccessLevels.CurrentRead, UserAccessLevel = AccessLevels.CurrentRead, - Value = kGeneration1Value + Value = m_value }; + if (m_includeEuRange) + { + var euRange = new PropertyState(variable) + { + NodeId = new NodeId(kEuRangeNodeId, namespaceIndex), + BrowseName = QualifiedName.From(BrowseNames.EURange), + DisplayName = new LocalizedText(BrowseNames.EURange), + ReferenceTypeId = ReferenceTypeIds.HasProperty, + DataType = DataTypeIds.Range, + ValueRank = ValueRanks.Scalar, + AccessLevel = AccessLevels.CurrentRead, + UserAccessLevel = AccessLevels.CurrentRead, + Value = new Variant( + new ExtensionObject( + new Opc.Ua.Range + { + Low = 0, + High = 100 + })) + }; + variable.AddChild(euRange); + } root.AddChild(variable); await AddPredefinedNodeAsync( SystemContext, @@ -2863,11 +8334,280 @@ await AddPredefinedNodeAsync( cancellationToken).ConfigureAwait(false); MasterNodeManager.CreateExternalReference( externalReferences, - ObjectIds.ObjectsFolder, - ReferenceTypeIds.Organizes, + externalParentId, + externalReferenceTypeId, false, root.NodeId); } + + public ValueTask> PrepareReloadAsync( + IAsyncNodeManager replacement, + CancellationToken ct = default) + { + ct.ThrowIfCancellationRequested(); + return new ValueTask>([]); + } + } + + private sealed class LifecycleTestServer : ReferenceServer + { + public LifecycleTestServer(ITelemetryContext telemetry) + : base(telemetry) + { + } + + public ValueTask ShutdownInternalsAsync( + CancellationToken cancellationToken = default) + { + return base.OnServerStoppingAsync(cancellationToken); + } + + public int TransportListenerCountForTest => TransportListeners.Count; + + public Action BeforeCreateSessionServerSignatureForTest { get; set; } + + public void AddTransportListenerForTest(ITransportListener listener) + { + TransportListeners.Add(listener); + } + + protected override SignatureData CreateSessionServerSignature( + OperationContext context, + Certificate instanceCertificate, + Certificate parsedClientCertificate, + ByteString clientNonce, + ByteString serverNonce) + { + BeforeCreateSessionServerSignatureForTest?.Invoke( + instanceCertificate); + return base.CreateSessionServerSignature( + context, + instanceCertificate, + parsedClientCertificate, + clientNonce, + serverNonce); + } + } + + private sealed class TrackingLifecycleNodeManager : + NodeManagementLifecycleNodeManager + { + private int m_sessionActivatedCount; + private int m_allEventsSubscribeCount; + private int m_allEventsUnsubscribeCount; + private int m_conditionRefreshCount; + private int m_readCount; + private int m_deleteAddressSpaceCount; + private int m_deleteAddressSpaceFailuresRemaining; + private int m_disposeCount; + private int m_disposeFailuresRemaining; + private uint[] m_lastConditionRefreshMonitoredItemIds = []; + + public TrackingLifecycleNodeManager( + IServerInternal server, + ApplicationConfiguration configuration, + ILogger logger, + string namespaceUri, + int value, + NodeId? externalParentId = null) + : base( + server, + configuration, + logger, + namespaceUri, + value, + includeEuRange: false, + externalParentId: externalParentId) + { + } + + public int SessionActivatedCount => + Volatile.Read(ref m_sessionActivatedCount); + + public int AllEventsSubscribeCount => + Volatile.Read(ref m_allEventsSubscribeCount); + + public int AllEventsUnsubscribeCount => + Volatile.Read(ref m_allEventsUnsubscribeCount); + + public int ConditionRefreshCount => + Volatile.Read(ref m_conditionRefreshCount); + + public int ReadCount => + Volatile.Read(ref m_readCount); + + public int DeleteAddressSpaceCount => + Volatile.Read(ref m_deleteAddressSpaceCount); + + public int DisposeCount => + Volatile.Read(ref m_disposeCount); + + public int DeleteAddressSpaceFailuresRemaining + { + get => Volatile.Read(ref m_deleteAddressSpaceFailuresRemaining); + set => Volatile.Write(ref m_deleteAddressSpaceFailuresRemaining, value); + } + + public int DisposeFailuresRemaining + { + get => Volatile.Read(ref m_disposeFailuresRemaining); + set => Volatile.Write(ref m_disposeFailuresRemaining, value); + } + + public uint[] LastConditionRefreshMonitoredItemIds => + Volatile.Read(ref m_lastConditionRefreshMonitoredItemIds); + + public Func< + IEventMonitoredItem, + bool, + CancellationToken, + ValueTask> AllEventsCallback { get; set; } + + public Func SessionActivatedCallback { get; set; } + + public Func< + IList, + CancellationToken, + ValueTask> ConditionRefreshCallback { get; set; } + + public Func ReadCallback { get; set; } + + public override async ValueTask ReadAsync( + OperationContext context, + double maxAge, + ArrayOf nodesToRead, + IList values, + IList errors, + CancellationToken cancellationToken = default) + { + Interlocked.Increment(ref m_readCount); + if (ReadCallback is not null) + { + await ReadCallback(cancellationToken).ConfigureAwait(false); + } + await base.ReadAsync( + context, + maxAge, + nodesToRead, + values, + errors, + cancellationToken) + .ConfigureAwait(false); + } + + public override async ValueTask SessionActivatedAsync( + OperationContext context, + NodeId sessionId, + CancellationToken cancellationToken = default) + { + Interlocked.Increment(ref m_sessionActivatedCount); + if (SessionActivatedCallback is not null) + { + await SessionActivatedCallback(cancellationToken).ConfigureAwait(false); + } + await base.SessionActivatedAsync( + context, + sessionId, + cancellationToken) + .ConfigureAwait(false); + } + + public override async ValueTask SubscribeToAllEventsAsync( + OperationContext context, + uint subscriptionId, + IEventMonitoredItem monitoredItem, + bool unsubscribe, + CancellationToken cancellationToken = default) + { + if (unsubscribe) + { + Interlocked.Increment(ref m_allEventsUnsubscribeCount); + } + else + { + Interlocked.Increment(ref m_allEventsSubscribeCount); + } + + if (AllEventsCallback is not null) + { + await AllEventsCallback( + monitoredItem, + unsubscribe, + cancellationToken).ConfigureAwait(false); + } + + return await base + .SubscribeToAllEventsAsync( + context, + subscriptionId, + monitoredItem, + unsubscribe, + cancellationToken) + .ConfigureAwait(false); + } + + public override async ValueTask ConditionRefreshAsync( + OperationContext context, + IList monitoredItems, + CancellationToken cancellationToken = default) + { + Interlocked.Increment(ref m_conditionRefreshCount); + Interlocked.Exchange( + ref m_lastConditionRefreshMonitoredItemIds, + [.. monitoredItems.Select(monitoredItem => monitoredItem.Id)]); + if (ConditionRefreshCallback is not null) + { + await ConditionRefreshCallback(monitoredItems, cancellationToken) + .ConfigureAwait(false); + } + return await base.ConditionRefreshAsync( + context, + monitoredItems, + cancellationToken) + .ConfigureAwait(false); + } + + public override async ValueTask DeleteAddressSpaceAsync( + CancellationToken cancellationToken = default) + { + Interlocked.Increment(ref m_deleteAddressSpaceCount); + if (TryConsumeFailure(ref m_deleteAddressSpaceFailuresRemaining)) + { + throw new SentinelException("DeleteAddressSpaceAsync failed."); + } + await base.DeleteAddressSpaceAsync(cancellationToken).ConfigureAwait(false); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + Interlocked.Increment(ref m_disposeCount); + if (TryConsumeFailure(ref m_disposeFailuresRemaining)) + { + throw new SentinelException("Dispose failed."); + } + } + base.Dispose(disposing); + } + + private static bool TryConsumeFailure(ref int failuresRemaining) + { + int current = Volatile.Read(ref failuresRemaining); + while (current > 0) + { + int observed = Interlocked.CompareExchange( + ref failuresRemaining, + current - 1, + current); + if (observed == current) + { + return true; + } + current = observed; + } + return false; + } } /// @@ -2877,7 +8617,15 @@ await AddPredefinedNodeAsync( public enum LifecycleOperation { Reload, - Remove + Remove, + ShadowReload + } + + public enum RetainedNotificationDispatchKind + { + Session, + Modify, + EventDelete } /// diff --git a/tests/Opc.Ua.Server.Tests/NodeManager/SyncNodeManagerAdapterTests.cs b/tests/Opc.Ua.Server.Tests/NodeManager/SyncNodeManagerAdapterTests.cs index 2490c08bad..652e71b4f6 100644 --- a/tests/Opc.Ua.Server.Tests/NodeManager/SyncNodeManagerAdapterTests.cs +++ b/tests/Opc.Ua.Server.Tests/NodeManager/SyncNodeManagerAdapterTests.cs @@ -462,6 +462,7 @@ private static void SetupAsyncMethods( monitoredItems, transferProcessed, transferErrors, + It.IsAny(), It.IsAny())) .Returns(default(ValueTask)); manager.Setup(m => m.SetMonitoringModeAsync( diff --git a/tests/Opc.Ua.Server.Tests/Opc.Ua.Server.Tests.csproj b/tests/Opc.Ua.Server.Tests/Opc.Ua.Server.Tests.csproj index d21101aed3..c3d0278053 100644 --- a/tests/Opc.Ua.Server.Tests/Opc.Ua.Server.Tests.csproj +++ b/tests/Opc.Ua.Server.Tests/Opc.Ua.Server.Tests.csproj @@ -53,7 +53,6 @@ - diff --git a/tests/Opc.Ua.Server.Tests/RequestManagerTests.cs b/tests/Opc.Ua.Server.Tests/RequestManagerTests.cs index 73b339e4e8..b790871af3 100644 --- a/tests/Opc.Ua.Server.Tests/RequestManagerTests.cs +++ b/tests/Opc.Ua.Server.Tests/RequestManagerTests.cs @@ -268,6 +268,64 @@ public void DisposeCancelsPendingRequests() Assert.That(requestLifetime.CancellationToken.IsCancellationRequested, Is.True); } + [Test] + [Category("NodeManagerLifecycle")] + public void RegisterLifecycleExtensionTwiceReturnsSameExtension() + { + RequestManagerLifecycleExtension first = RegisterLifecycleExtension(); + RequestManagerLifecycleExtension second = RegisterLifecycleExtension(); + + Assert.That(second, Is.SameAs(first)); + } + + [Test] + [Category("NodeManagerLifecycle")] + public void RegisterLifecycleExtensionAfterDisposeThrowsObjectDisposedException() + { + m_requestManager.Dispose(); + + Assert.That( + () => m_requestManager.RegisterLifecycleExtension(), + Throws.TypeOf()); + } + + [Test] + [Category("NodeManagerLifecycle")] + public void RequestManagerWithoutLifecycleExtensionAdmitsValidationAndRequests() + { + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(15, requestLifetime); + + using (m_requestManager.EnterValidationScope()) + { + Assert.DoesNotThrow(() => m_requestManager.RequestReceived(context)); + } + + m_requestManager.RequestCompleted(context); + Assert.That(requestLifetime.TryCancel(StatusCodes.BadTimeout), Is.False); + } + + [Test] + [Category("NodeManagerLifecycle")] + public async Task RequestManagerWithoutLifecycleExtensionDoesNotRepeatDrainAsync() + { + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(16, requestLifetime); + IDisposable validationScope = m_requestManager.EnterValidationScope(); + + Task drain = m_requestManager.WaitForCurrentRequestsAsync().AsTask(); + Assert.That(drain.IsCompleted, Is.False); + + m_requestManager.RequestReceived(context); + validationScope.Dispose(); + + await AssertCompletesWithinTimeoutAsync(drain).ConfigureAwait(false); + Assert.That( + requestLifetime.TryCancel(StatusCodes.BadTimeout), + Is.True, + "Without the lifecycle extension, the drain must not resnapshot promoted requests."); + } + [Test] [Category("NodeManagerLifecycle")] public async Task WaitForCurrentRequestsAsyncCompletesAfterAllSnapshotRequestsCompleteAsync() @@ -363,6 +421,93 @@ public async Task WaitForCurrentRequestsAsyncWithNoRequestsCompletesImmediatelyA await waiter.ConfigureAwait(false); } + [Test] + [Category("NodeManagerLifecycle")] + public async Task WaitForCurrentRequestsAsyncExcludesEveryLifecycleWaiterAsync() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetimeA = new RequestLifetime(); + using var requestLifetimeB = new RequestLifetime(); + using var requestLifetimeC = new RequestLifetime(); + OperationContext contextA = CreateOperationContext(10, requestLifetimeA); + OperationContext contextB = CreateOperationContext(11, requestLifetimeB); + OperationContext contextC = CreateOperationContext(12, requestLifetimeC); + + using IDisposable requestScopeA = m_requestManager.EnterRequestScope(contextA); + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope waiterScopeA = + extension.EnterLifecycleWaiter(); + waiterScopeA.MarkSemaphoreWaitStarted(); + using IDisposable requestScopeB = m_requestManager.EnterRequestScope(contextB); + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope waiterScopeB = + extension.EnterLifecycleWaiter(); + waiterScopeB.MarkSemaphoreWaitStarted(); + m_requestManager.RequestReceived(contextC); + + Task drain = m_requestManager.WaitForCurrentRequestsAsync().AsTask(); + Assert.That(drain.IsCompleted, Is.False); + + m_requestManager.RequestCompleted(contextC); + + await AssertCompletesWithinTimeoutAsync(drain).ConfigureAwait(false); + Assert.That( + requestLifetimeA.TryCancel(StatusCodes.BadTimeout), + Is.True, + "The first excluded request must still be executing."); + Assert.That( + requestLifetimeB.TryCancel(StatusCodes.BadTimeout), + Is.True, + "The second excluded request must still be executing."); + } + + [Test] + [Category("NodeManagerLifecycle")] + public async Task SemaphoreWaitStartReleasesAlreadyActiveDrainAsync() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(13, requestLifetime); + using IDisposable requestScope = m_requestManager.EnterRequestScope(context); + + Task drain = m_requestManager.WaitForCurrentRequestsAsync().AsTask(); + Assert.That(drain.IsCompleted, Is.False); + + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope waiterScope = + extension.EnterLifecycleWaiter(); + + Assert.That( + drain.IsCompleted, + Is.False, + "Registration must not release a drain before the semaphore wait is queued."); + + waiterScope.MarkSemaphoreWaitStarted(); + + await AssertCompletesWithinTimeoutAsync(drain).ConfigureAwait(false); + Assert.That( + requestLifetime.TryCancel(StatusCodes.BadTimeout), + Is.True, + "Waiting for the lifecycle semaphore must not complete the request itself."); + } + + [Test] + [Category("NodeManagerLifecycle")] + public async Task DisposedLifecycleWaiterIsIncludedInNextDrainAsync() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(14, requestLifetime); + IDisposable requestScope = m_requestManager.EnterRequestScope(context); + using (extension.EnterLifecycleWaiter()) + { + } + + Task drain = m_requestManager.WaitForCurrentRequestsAsync().AsTask(); + Assert.That(drain.IsCompleted, Is.False); + + requestScope.Dispose(); + + await AssertCompletesWithinTimeoutAsync(drain).ConfigureAwait(false); + } + [Test] public void RequestReceivedCalledTwiceWithSameContextIsIdempotent() { @@ -435,6 +580,58 @@ async Task HandleAsync() }); } + [Test] + [Category("NodeManagerLifecycle")] + public async Task ServiceDispatchScopeReceivesRequestIdentityFromAsyncValidationAsync() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(61, requestLifetime); + + using (m_requestManager.EnterServiceDispatchScope()) + { + await RegisterAsync().ConfigureAwait(false); + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope waiter = + extension.EnterLifecycleWaiter(); + } + + m_requestManager.RequestCompleted(context); + Assert.That(requestLifetime.TryCancel(StatusCodes.BadTimeout), Is.False); + + async Task RegisterAsync() + { + await Task.Yield(); + m_requestManager.RequestReceived(context); + } + } + + [Test] + [Category("NodeManagerLifecycle")] + public void NestedRequestRegistrationPreservesOuterDispatchIdentity() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var outerLifetime = new RequestLifetime(); + using var nestedLifetime = new RequestLifetime(); + OperationContext outer = CreateOperationContext(62, outerLifetime); + OperationContext nested = CreateOperationContext(63, nestedLifetime); + + using (m_requestManager.EnterServiceDispatchScope()) + using (m_requestManager.EnterRequestScope(outer)) + { + m_requestManager.RequestReceived(nested); + m_requestManager.RequestCompleted(nested); + + using RequestManagerLifecycleExtension.RequestLifecycleWaiterScope waiter = + extension.EnterLifecycleWaiter(); + } + + Assert.Multiple(() => + { + Assert.That(outerLifetime.TryCancel(StatusCodes.BadTimeout), Is.False); + Assert.That(nestedLifetime.TryCancel(StatusCodes.BadTimeout), Is.False); + }); + } + [Test] public void EnterRequestScopeDoesNotMarkTheFlowAsExecutingARequest() { @@ -568,6 +765,85 @@ public void NestedValidationScopesLeaveRegisteredRequestsToTheirOwnScope() m_requestManager.RequestCompleted(innerContext); } + [Test] + public void CloseAdmissionRejectsNewValidationAndDirectRequests() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(90, requestLifetime); + + extension.CloseAdmission(); + + ServiceResultException validationException = + Assert.Throws( + () => m_requestManager.EnterValidationScope()); + ServiceResultException requestException = + Assert.Throws( + () => m_requestManager.RequestReceived(context)); + + Assert.Multiple(() => + { + Assert.That( + validationException.StatusCode, + Is.EqualTo(StatusCodes.BadServerHalted)); + Assert.That( + requestException.StatusCode, + Is.EqualTo(StatusCodes.BadServerHalted)); + Assert.That( + requestLifetime.TryCancel(StatusCodes.BadTimeout), + Is.True); + }); + } + + [Test] + public void PreAdmittedValidationCanPromoteRequestAfterAdmissionCloses() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(91, requestLifetime); + IDisposable validationScope = m_requestManager.EnterValidationScope(); + + extension.CloseAdmission(); + + using (m_requestManager.EnterServiceDispatchScope()) + using (m_requestManager.EnterRequestScope(context)) + { + validationScope.Dispose(); + Assert.That(m_requestManager.IsExecutingRequest, Is.True); + } + + Assert.That(requestLifetime.TryCancel(StatusCodes.BadTimeout), Is.False); + } + + [Test] + [Category("NodeManagerLifecycle")] + public async Task ClosedAdmissionDrainTracksRequestRegisteredAfterInitialSnapshotAsync() + { + RequestManagerLifecycleExtension extension = RegisterLifecycleExtension(); + using var requestLifetime = new RequestLifetime(); + OperationContext context = CreateOperationContext(92, requestLifetime); + IDisposable validationScope = m_requestManager.EnterValidationScope(); + extension.CloseAdmission(); + + Task drain = m_requestManager.WaitForCurrentRequestsAsync().AsTask(); + Assert.That(drain.IsCompleted, Is.False); + m_requestManager.RequestReceived(context); + m_requestManager.RequestReceived(context); + validationScope.Dispose(); + + Task completed = await Task.WhenAny( + drain, + Task.Delay(TimeSpan.FromMilliseconds(250))).ConfigureAwait(false); + Assert.That( + completed, + Is.Not.SameAs(drain), + "The closed-admission drain must resnapshot the request promoted by validation."); + + m_requestManager.RequestCompleted(context); + await AssertCompletesWithinTimeoutAsync(drain).ConfigureAwait(false); + Assert.That(requestLifetime.TryCancel(StatusCodes.BadTimeout), Is.False); + } + private static OperationContext CreateOperationContext( uint requestHandle, RequestLifetime requestLifetime) @@ -575,6 +851,11 @@ private static OperationContext CreateOperationContext( return CreateOperationContext(requestHandle, requestLifetime, 0); } + private RequestManagerLifecycleExtension RegisterLifecycleExtension() + { + return m_requestManager.RegisterLifecycleExtension(); + } + private static OperationContext CreateOperationContext( uint requestHandle, RequestLifetime requestLifetime, diff --git a/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetConfigureAsyncTests.cs b/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetConfigureAsyncTests.cs new file mode 100644 index 0000000000..15083409f7 --- /dev/null +++ b/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetConfigureAsyncTests.cs @@ -0,0 +1,389 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Moq; +using NUnit.Framework; +using Opc.Ua.Server.Fluent; +using Opc.Ua.Server.RuntimeNodeSet; + +namespace Opc.Ua.Server.Tests.RuntimeNodeSet +{ + /// + /// Unit tests for the + /// async-lifetime hook: ordering with the synchronous + /// callback, single-seal + /// semantics, and the generation-owner disposal guarantees provided by + /// . + /// + [TestFixture] + [Category("RuntimeNodeSet")] + [Parallelizable(ParallelScope.All)] + [FixtureLifeCycle(LifeCycle.InstancePerTestCase)] + public sealed class RuntimeNodeSetConfigureAsyncTests + { + private const string kUriA = "urn:test:ConfigureAsyncModel"; + + private static readonly string[] s_expectedOrder = ["sync", "async"]; + + private sealed class TrackingAsyncDisposable : IAsyncDisposable + { + public bool Disposed { get; private set; } + + public ValueTask DisposeAsync() + { + Disposed = true; + return default; + } + } + + private static StreamRuntimeNodeSetSource MakeStreamSource(string modelUri) + { + string xml = + "\r\n" + + "\r\n" + + " \r\n" + + " " + + modelUri + + "\r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " \r\n" + + " ConfigureAsyncRoot\r\n" + + " \r\n" + + " i=58\r\n" + + " i=85\r\n" + + " \r\n" + + " \r\n" + + ""; + return RuntimeNodeSetSource.FromStream( + modelUri, + _ => new ValueTask( + new MemoryStream(Encoding.UTF8.GetBytes(xml))), + [modelUri]); + } + + /// + /// Creates an mock with the namespace + /// table, type tree, and master node manager scaffolding needed to + /// exercise + /// and + /// end to end. + /// + private static Mock BuildMockServer() + { + ILoggerFactory mockLoggerFactory = LoggerFactory.Create(b => b.AddDebug()); + var mockTelemetry = new Mock(); + mockTelemetry.SetupGet(t => t.LoggerFactory).Returns(mockLoggerFactory); + + var namespaceTable = new NamespaceTable(); + + var mockConfigurationNodeManager = new Mock(); + var mockMasterNodeManager = new Mock(); + mockMasterNodeManager + .SetupGet(m => m.ConfigurationNodeManager) + .Returns(mockConfigurationNodeManager.Object); + + var mockServer = new Mock(); + mockServer.SetupGet(s => s.Telemetry).Returns(mockTelemetry.Object); + mockServer.SetupGet(s => s.NamespaceUris).Returns(namespaceTable); + mockServer.SetupGet(s => s.ServerUris).Returns(new StringTable()); + mockServer.SetupGet(s => s.TypeTree).Returns(new TypeTable(namespaceTable)); + mockServer.SetupGet(s => s.Factory).Returns(EncodeableFactory.Create()); + mockServer.SetupGet(s => s.NodeManager).Returns(mockMasterNodeManager.Object); + mockServer.SetupGet(s => s.MonitoredItemQueueFactory) + .Returns(new MonitoredItemQueueFactory(mockTelemetry.Object)); + + var systemContext = new ServerSystemContext(mockServer.Object); + mockServer.SetupGet(s => s.DefaultSystemContext).Returns(systemContext); + + return mockServer; + } + + /// + /// Asserts that has not been sealed yet by + /// probing an unresolvable NodeId: an unsealed builder fails + /// resolution with , while a + /// sealed builder instead fails with + /// before resolution is even + /// attempted. + /// + private static void AssertBuilderNotSealed(INodeManagerBuilder builder) + { + ServiceResultException ex = Assert.Throws( + () => builder.Node(new NodeId(Guid.NewGuid()))); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadNodeIdUnknown)); + } + + /// + /// Asserts that has been sealed: any + /// further Node(...) call must fail with + /// . + /// + private static void AssertBuilderSealed(INodeManagerBuilder builder) + { + ServiceResultException ex = Assert.Throws( + () => builder.Node(new NodeId(Guid.NewGuid()))); + Assert.That(ex.StatusCode, Is.EqualTo((uint)StatusCodes.BadInvalidState)); + } + + private static async Task CreateManagerAsync( + Action configure = null, + Func> configureAsync = null) + { + StreamRuntimeNodeSetSource source = MakeStreamSource(kUriA); + var factory = new RuntimeNodeSetNodeManagerFactory(new RuntimeNodeSetOptions + { + Sources = [source], + DefaultNamespaceUri = kUriA, + Configure = configure, + ConfigureAsync = configureAsync + }); + + return await factory.CreateAsync( + BuildMockServer().Object, + new ApplicationConfiguration(), + CancellationToken.None).ConfigureAwait(false); + } + + /// + /// A sync-only callback + /// keeps working exactly as before: it runs, the builder is sealed + /// once, and no generation owner is tracked. + /// + [Test] + public async Task SyncOnlyConfigureStillRunsAndSealsAsync() + { + bool configureRan = false; + INodeManagerBuilder capturedBuilder = null; + + IAsyncNodeManager manager = await CreateManagerAsync( + configure: builder => + { + configureRan = true; + capturedBuilder = builder; + }).ConfigureAwait(false); + + var externalReferences = new Dictionary>(); + await manager.CreateAddressSpaceAsync(externalReferences, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(configureRan, Is.True); + Assert.That(capturedBuilder, Is.Not.Null); + + AssertBuilderSealed(capturedBuilder!); + + await manager.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + } + + /// + /// An async-only + /// callback runs before the builder is sealed: wiring calls made + /// from inside the callback must succeed. + /// + [Test] + public async Task AsyncOnlyConfigureRunsBeforeSealAsync() + { + bool configureAsyncRan = false; + INodeManagerBuilder capturedBuilder = null; + + IAsyncNodeManager manager = await CreateManagerAsync( + configureAsync: async (builder, ct) => + { + await Task.Yield(); + capturedBuilder = builder; + AssertBuilderNotSealed(builder); + configureAsyncRan = true; + return null; + }).ConfigureAwait(false); + + var externalReferences = new Dictionary>(); + await manager.CreateAddressSpaceAsync(externalReferences, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(configureAsyncRan, Is.True); + + AssertBuilderSealed(capturedBuilder!); + + await manager.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + } + + /// + /// When both callbacks are set, Configure runs first, then + /// ConfigureAsync, both against the same unsealed builder, + /// with a single Seal() applied once after both complete. + /// + [Test] + public async Task BothConfigureCallbacksRunInOrderWithSingleSealAsync() + { + var order = new List(); + INodeManagerBuilder capturedBuilder = null; + + IAsyncNodeManager manager = await CreateManagerAsync( + configure: builder => + { + order.Add("sync"); + capturedBuilder = builder; + AssertBuilderNotSealed(builder); + }, + configureAsync: async (builder, ct) => + { + await Task.Yield(); + order.Add("async"); + Assert.That(builder, Is.SameAs(capturedBuilder)); + // Still unsealed: the sync callback must not have sealed it. + AssertBuilderNotSealed(builder); + return null; + }).ConfigureAwait(false); + + var externalReferences = new Dictionary>(); + await manager.CreateAddressSpaceAsync(externalReferences, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(order, Is.EqualTo(s_expectedOrder)); + + AssertBuilderSealed(capturedBuilder!); + + await manager.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + } + + /// + /// The generation owner returned by ConfigureAsync is + /// disposed asynchronously when the manager's address space is + /// torn down via + /// (the normal-removal path). + /// + [Test] + public async Task OwnerDisposedOnDeleteAddressSpaceAsync() + { + await using TrackingAsyncDisposable owner = new(); + + IAsyncNodeManager manager = await CreateManagerAsync( + configureAsync: (_, _) => new ValueTask(owner)) + .ConfigureAwait(false); + + var externalReferences = new Dictionary>(); + await manager.CreateAddressSpaceAsync(externalReferences, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(owner.Disposed, Is.False); + + await manager.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + + Assert.That(owner.Disposed, Is.True); + } + + /// + /// If node-added notification fails after ConfigureAsync + /// produced a generation owner, CreateAddressSpaceAsync + /// disposes the owner before propagating the activation failure. + /// + [Test] + public async Task OwnerDisposedWhenNodeAddedCallbackFailsAsync() + { + await using TrackingAsyncDisposable owner = new(); + + IAsyncNodeManager manager = await CreateManagerAsync( + configure: builder => builder + .Node("ConfigureAsyncRoot") + .OnNodeAdded((_, _) => throw new InvalidOperationException( + "Simulated node-added failure.")), + configureAsync: (_, _) => new ValueTask(owner)) + .ConfigureAwait(false); + + var externalReferences = new Dictionary>(); + InvalidOperationException exception = null; + try + { + await manager.CreateAddressSpaceAsync( + externalReferences, + CancellationToken.None).ConfigureAwait(false); + } + catch (InvalidOperationException ex) + { + exception = ex; + } + + Assert.That(exception, Is.Not.Null); + Assert.That(owner.Disposed, Is.True); + + await manager.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + } + + /// + /// Each node-manager generation owns exactly one generation owner. + /// Tearing down one generation (e.g. the old generation retired + /// after a shadow reload) must not affect another, independently + /// created generation's owner; that owner is only disposed when + /// its own generation is retired. + /// + [Test] + public async Task OwnerIsolatedAcrossGenerationsAndDisposedOnlyWhenRetiredAsync() + { + await using TrackingAsyncDisposable ownerOld = new(); + await using TrackingAsyncDisposable ownerNew = new(); + + IAsyncNodeManager oldGeneration = await CreateManagerAsync( + configureAsync: (_, _) => new ValueTask(ownerOld)) + .ConfigureAwait(false); + IAsyncNodeManager newGeneration = await CreateManagerAsync( + configureAsync: (_, _) => new ValueTask(ownerNew)) + .ConfigureAwait(false); + + var externalReferencesOld = new Dictionary>(); + var externalReferencesNew = new Dictionary>(); + await oldGeneration.CreateAddressSpaceAsync(externalReferencesOld, CancellationToken.None) + .ConfigureAwait(false); + await newGeneration.CreateAddressSpaceAsync(externalReferencesNew, CancellationToken.None) + .ConfigureAwait(false); + + // Retiring the old generation (as happens once a shadow reload's + // replacement generation has taken over all new requests) must + // dispose only its own owner. + await oldGeneration.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + + Assert.That(ownerOld.Disposed, Is.True); + Assert.That(ownerNew.Disposed, Is.False); + + await newGeneration.DeleteAddressSpaceAsync(CancellationToken.None).ConfigureAwait(false); + + Assert.That(ownerNew.Disposed, Is.True); + } + } +} diff --git a/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensionsTests.cs b/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensionsTests.cs new file mode 100644 index 0000000000..1481d82aae --- /dev/null +++ b/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleExtensionsTests.cs @@ -0,0 +1,320 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using Opc.Ua.Server.RuntimeNodeSet; + +namespace Opc.Ua.Server.Tests.RuntimeNodeSet +{ + /// + /// Covers the argument contract and factory wiring of the runtime NodeSet + /// lifecycle extension methods. The extensions are a thin, allocation-only + /// wrapper over , so they are verified + /// against a mocked lifecycle rather than a live server. + /// + [TestFixture] + [Category("NodeManagerLifecycle")] + [Parallelizable] + public class RuntimeNodeSetLifecycleExtensionsTests + { + [Test] + public void AddRuntimeNodeSetRejectsANullLifecycle() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await RuntimeNodeSetLifecycleExtensions + .AddRuntimeNodeSetAsync(null!, CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("lifecycle")); + } + + [Test] + public void AddRuntimeNodeSetRejectsNullOptions() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .AddRuntimeNodeSetAsync(null!) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("options")); + } + + [Test] + public async Task AddRuntimeNodeSetForwardsARuntimeNodeSetFactoryAsync() + { + Mock lifecycle = CreateLifecycle(); + + await lifecycle.Object + .AddRuntimeNodeSetAsync(CreateOptions(), CancellationToken.None) + .ConfigureAwait(false); + + lifecycle.Verify( + l => l.AddAsync( + It.IsAny(), + It.IsAny()), + Times.Once); + } + + [Test] + public void ReloadRuntimeNodeSetRejectsANullLifecycle() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await RuntimeNodeSetLifecycleExtensions + .ReloadRuntimeNodeSetAsync( + null!, + CreateRegistration(), + CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("lifecycle")); + } + + [Test] + public void ReloadRuntimeNodeSetRejectsANullRegistration() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .ReloadRuntimeNodeSetAsync(null!, CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("registration")); + } + + [Test] + public void ReloadRuntimeNodeSetRejectsNullReplacementOptions() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .ReloadRuntimeNodeSetAsync(CreateRegistration(), null!) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + } + + [Test] + public async Task ReloadRuntimeNodeSetForwardsARuntimeNodeSetFactoryAsync() + { + Mock lifecycle = CreateLifecycle(); + + await lifecycle.Object + .ReloadRuntimeNodeSetAsync(CreateRegistration(), CreateOptions()) + .ConfigureAwait(false); + + lifecycle.Verify( + l => l.ReloadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Once); + } + + [Test] + public void ShadowReloadRuntimeNodeSetRejectsANullLifecycle() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await RuntimeNodeSetLifecycleExtensions + .ShadowReloadRuntimeNodeSetAsync( + null!, + CreateRegistration(), + CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("lifecycle")); + } + + [Test] + public void ShadowReloadRuntimeNodeSetRejectsANullRegistration() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .ShadowReloadRuntimeNodeSetAsync(null!, CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("registration")); + } + + [Test] + public void ShadowReloadRuntimeNodeSetRejectsNullReplacementOptions() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .ShadowReloadRuntimeNodeSetAsync(CreateRegistration(), null!) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + } + + [Test] + public async Task ShadowReloadRuntimeNodeSetForwardsARuntimeNodeSetFactoryAsync() + { + Mock lifecycle = CreateLifecycle(); + + await lifecycle.Object + .ShadowReloadRuntimeNodeSetAsync(CreateRegistration(), CreateOptions()) + .ConfigureAwait(false); + + lifecycle.Verify( + l => l.ShadowReloadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Once); + } + + [Test] + public void ImmediateReloadRuntimeNodeSetRejectsANullLifecycle() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await RuntimeNodeSetLifecycleExtensions + .ImmediateReloadRuntimeNodeSetAsync( + null!, + CreateRegistration(), + CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("lifecycle")); + } + + [Test] + public void ImmediateReloadRuntimeNodeSetRejectsANullRegistration() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .ImmediateReloadRuntimeNodeSetAsync(null!, CreateOptions()) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("registration")); + } + + [Test] + public void ImmediateReloadRuntimeNodeSetRejectsNullReplacementOptions() + { + ArgumentNullException exception = Assert.ThrowsAsync( + async () => await CreateLifecycle().Object + .ImmediateReloadRuntimeNodeSetAsync(CreateRegistration(), null!) + .ConfigureAwait(false)); + + Assert.That(exception.ParamName, Is.EqualTo("replacement")); + } + + [Test] + public async Task ImmediateReloadRuntimeNodeSetForwardsARuntimeNodeSetFactoryAsync() + { + Mock lifecycle = CreateLifecycle(); + + await lifecycle.Object + .ImmediateReloadRuntimeNodeSetAsync(CreateRegistration(), CreateOptions()) + .ConfigureAwait(false); + + lifecycle.Verify( + l => l.ImmediateReloadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny()), + Times.Once); + } + + private static Mock CreateLifecycle() + { + NodeManagerRegistration registration = CreateRegistration(); + var lifecycle = new Mock(); + lifecycle + .Setup(l => l.AddAsync( + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask(registration)); + lifecycle + .Setup(l => l.ReloadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask(registration)); + lifecycle + .Setup(l => l.ShadowReloadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask(registration)); + lifecycle + .Setup(l => l.ImmediateReloadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .Returns(new ValueTask(registration)); + return lifecycle; + } + + private static RuntimeNodeSetOptions CreateOptions() + { + return new RuntimeNodeSetOptions + { + Sources = + [ + RuntimeNodeSetSource.FromStream( + "RuntimeNodeSetLifecycleExtensionsTests", + _ => new ValueTask( + new MemoryStream(Encoding.UTF8.GetBytes(kNodeSetXml))), + [kModelNamespaceUri]) + ] + }; + } + + private static NodeManagerRegistration CreateRegistration() + { + var nodeManager = new Mock(); + nodeManager + .SetupGet(n => n.NamespaceUris) + .Returns([kModelNamespaceUri]); + return new NodeManagerRegistration(Guid.NewGuid(), 1, nodeManager.Object); + } + + private const string kModelNamespaceUri = + "urn:opcfoundation.org:Tests:RuntimeNodeSetExtensions"; + + private const string kNodeSetXml = + """ + + + + urn:opcfoundation.org:Tests:RuntimeNodeSetExtensions + + + + + + """; + } +} diff --git a/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleTests.cs b/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleTests.cs index 5078ccf79a..4abff0d921 100644 --- a/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleTests.cs +++ b/tests/Opc.Ua.Server.Tests/RuntimeNodeSet/RuntimeNodeSetLifecycleTests.cs @@ -32,6 +32,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Moq; @@ -919,6 +920,140 @@ public async Task ReloadRuntimeNodeSetAsyncReplacesGenerationAndPreservesNamespa Assert.That(originalOnlyValue.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); } + /// + /// Unlike Reload, ShadowReload must succeed while the current generation owns an + /// active reporting monitored item. New Read and Browse requests must be + /// atomically routed to the replacement generation as soon as the switch is + /// committed, while the monitored item created before the switch keeps being + /// serviced by the retired (but not yet destroyed) current generation, including + /// for a value pushed directly on that retired generation's own node after the + /// switch. Once the owning subscription is deleted, a later lifecycle operation + /// completes retired-generation cleanup and disposes the old generation's address + /// space. + /// + [Test] + public async Task ShadowReloadRuntimeNodeSetAsyncRoutesNewRequestsToReplacementWhileOldMonitoredItemStaysActiveAsync() + { + IServerInternal server = m_server.CurrentInstance; + var master = (MasterNodeManager)server.NodeManager; + + NodeManagerRegistration original = await m_server.NodeManagerLifecycle + .AddRuntimeNodeSetAsync(CreateOptions(generation: 1)) + .ConfigureAwait(false); + + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + var rootNodeId = new NodeId(kRootNodeId, ns); + var valueNodeId = new NodeId(kValueNodeId, ns); + var replacementOnlyNodeId = new NodeId(kReplacementOnlyNodeId, ns); + var originalManager = (AsyncCustomNodeManager)original.NodeManager; + const uint clientHandle = 1; + + var services = new ServerTestServices(m_server, m_secureChannelContext); + uint subscriptionId = await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) + .ConfigureAwait(false); + + // Drain the initial data-change sample delivered on monitored-item creation so + // the later publish loop only observes the value pushed after the switch. + ArrayOf acknowledgements = default; + (_, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + + try + { + NodeManagerRegistration reloaded = await m_server.NodeManagerLifecycle + .ShadowReloadRuntimeNodeSetAsync(original, CreateOptions(generation: 2)) + .ConfigureAwait(false); + + Assert.That(reloaded.Id, Is.EqualTo(original.Id)); + Assert.That(reloaded.Generation, Is.EqualTo(original.Generation + 1)); + Assert.That(ReferenceEquals(reloaded.NodeManager, original.NodeManager), Is.False); + + // New requests must be atomically routed to the replacement generation. + Assert.That( + master.NamespaceManagers[ns].Count(m => ReferenceEquals(m, reloaded.NodeManager)), + Is.EqualTo(1)); + Assert.That( + master.NamespaceManagers[ns].Any(m => ReferenceEquals(m, original.NodeManager)), + Is.False); + + DataValue valueAfterSwitch = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(valueAfterSwitch.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(valueAfterSwitch.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + + BrowseResponse rootBrowse = await BrowseAsync(rootNodeId).ConfigureAwait(false); + Assert.That(rootBrowse.Results.Count, Is.EqualTo(1)); + ArrayOf rootReferences = rootBrowse.Results[0].References; + Assert.That( + rootReferences.Contains( + r => r.BrowseName.Equals(new QualifiedName(kReplacementOnlyBrowseName, ns))), + Is.True); + Assert.That( + rootReferences.Contains( + r => r.BrowseName.Equals(new QualifiedName(kOriginalOnlyBrowseName, ns))), + Is.False); + NodeState replacementNode = await server.NodeManager + .FindNodeInAddressSpaceAsync(replacementOnlyNodeId) + .ConfigureAwait(false); + Assert.That(replacementNode, Is.Not.Null); + + // The retired generation's own node must still be present and unaffected. + var originalValueState = (BaseVariableState)originalManager.Find(valueNodeId)!; + Assert.That(originalValueState, Is.Not.Null); + Assert.That(originalValueState.Value, Is.EqualTo(kGeneration1Value)); + + // Simulate an internal (device-driven) value push directly on the retired + // generation's own node: it must still reach the existing monitored item. + const int pushedValue = 888; + originalValueState.Value = pushedValue; + originalValueState.Timestamp = DateTimeUtc.Now; + originalValueState.StatusCode = StatusCodes.Good; + originalValueState.UpdateChangeMasks(NodeStateChangeMasks.Value); + await originalValueState + .ClearChangeMasksAsync(server.DefaultSystemContext, includeChildren: false) + .ConfigureAwait(false); + + DataValue? pushedNotification; + (pushedNotification, acknowledgements) = await PublishForDataChangeAsync( + services, + subscriptionId, + acknowledgements, + clientHandle).ConfigureAwait(false); + Assert.That(pushedNotification, Is.Not.Null); + Assert.That(pushedNotification!.Value.WrappedValue.GetInt32(), Is.EqualTo(pushedValue)); + + // The replacement generation's own value must remain unaffected by the + // push made directly on the retired generation. + DataValue valueAfterPush = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(valueAfterPush.WrappedValue.GetInt32(), Is.EqualTo(kGeneration2Value)); + } + finally + { + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + // With the owning subscription gone, prompt background cleanup or the later + // lifecycle operation finishes retired-generation cleanup. If the background + // pass already claimed the generation, Remove need not duplicate that work. + NodeManagerRegistration current = m_server.NodeManagerLifecycle.Registrations + .Find(r => r.Id == original.Id); + Assert.That(current, Is.Not.Null); + await m_server.NodeManagerLifecycle.RemoveAsync(current).ConfigureAwait(false); + + for (int attempt = 0; + attempt < 400 && originalManager.Find(valueNodeId) is not null; + attempt++) + { + await Task.Delay(TimeSpan.FromMilliseconds(25)).ConfigureAwait(false); + } + Assert.That(originalManager.Find(valueNodeId), Is.Null); + Assert.That( + CountMatches(m_server.NodeManagerLifecycle.Registrations, r => r.Id == original.Id), + Is.Zero); + } + /// /// Removing a live registration must unroute its NodeManager and unregister it, /// leaving its nodes unreachable through direct lookup, browse, read, and translate, @@ -1318,6 +1453,130 @@ private async Task ReadNamespaceArrayAsync() return value.WrappedValue.GetStringArray().ToArray(); } + /// + /// Creates a subscription and a single reporting, data-change monitored item on the + /// given node's Value attribute. + /// + private async Task CreateSubscriptionWithMonitoredItemAsync( + ServerTestServices services, + NodeId nodeId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscriptionResponse = await services + .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0) + .ConfigureAwait(false); + uint subscriptionId = subscriptionResponse.SubscriptionId; + + ArrayOf monitoredItems = + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = nodeId, + AttributeId = Attributes.Value + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = 1, + SamplingInterval = 0, + QueueSize = 1, + DiscardOldest = true + } + } + ]; + + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse createItemsResponse = await services + .CreateMonitoredItemsAsync(requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) + .ConfigureAwait(false); + + Assert.That(createItemsResponse.Results.Count, Is.EqualTo(1)); + Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + + return subscriptionId; + } + + /// + /// Deletes the given subscription so it no longer owns any monitored items. + /// + private async Task DeleteSubscriptionAsync(ServerTestServices services, uint subscriptionId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ArrayOf subscriptionIds = [subscriptionId]; + DeleteSubscriptionsResponse response = await services + .DeleteSubscriptionsAsync(requestHeader, subscriptionIds) + .ConfigureAwait(false); + Assert.That(response.Results.Count, Is.EqualTo(1)); + Assert.That(response.Results[0], Is.EqualTo(StatusCodes.Good)); + } + + /// + /// Publishes on in a bounded loop, acknowledging + /// previously delivered sequence numbers on each call, until a + /// carrying + /// arrives. Used to prove that a monitored item keeps being serviced (by whichever + /// NodeManager generation owns it) after a live lifecycle switch. + /// + private async Task<(DataValue? Value, ArrayOf Acknowledgements)> + PublishForDataChangeAsync( + ServerTestServices services, + uint subscriptionId, + ArrayOf acknowledgements, + uint clientHandle) + { + const int MaxPublishAttempts = 20; + DataValue? value = null; + + for (int attempt = 0; attempt < MaxPublishAttempts && value is null; attempt++) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + PublishResponse response = await services + .PublishAsync(requestHeader, acknowledgements, timeoutCts.Token) + .ConfigureAwait(false); + + Assert.That(response.SubscriptionId, Is.EqualTo(subscriptionId)); + + acknowledgements = response.AvailableSequenceNumbers.ToArrayOf( + sequenceNumber => new SubscriptionAcknowledgement + { + SubscriptionId = subscriptionId, + SequenceNumber = sequenceNumber + }); + + if (response.NotificationMessage is { } message) + { + foreach (ExtensionObject notificationData in message.NotificationData) + { + if (notificationData.TryGetValue(out DataChangeNotification dcn)) + { + foreach (MonitoredItemNotification item in dcn.MonitoredItems) + { + if (item.ClientHandle == clientHandle) + { + value = item.Value; + } + } + } + } + } + } + + Assert.That( + value, + Is.Not.Null, + $"No data-change notification for client handle {clientHandle} on subscription " + + $"{subscriptionId} arrived within {MaxPublishAttempts} bounded publish attempts."); + return (value, acknowledgements); + } + /// /// Browses a single node with the standard hierarchical-references template used /// throughout this fixture. diff --git a/tests/Opc.Ua.Server.Tests/StandardServerCoverageTests.cs b/tests/Opc.Ua.Server.Tests/StandardServerCoverageTests.cs index 13966af429..8134839e90 100644 --- a/tests/Opc.Ua.Server.Tests/StandardServerCoverageTests.cs +++ b/tests/Opc.Ua.Server.Tests/StandardServerCoverageTests.cs @@ -111,6 +111,16 @@ public void ConstructorUsesProvidedTimeProvider() Assert.That(server.TimeProviderAccessor, Is.SameAs(custom)); } + [Test] + public void DisposeCanBeCalledMoreThanOnce() + { + TestableStandardServer server = CreateServer(); + + server.Dispose(); + + Assert.DoesNotThrow(server.Dispose); + } + [Test] public void LoadComplexTypesDefaultsToTrue() { diff --git a/tests/Opc.Ua.Server.Tests/SubscriptionRetirementTrackerTests.cs b/tests/Opc.Ua.Server.Tests/SubscriptionRetirementTrackerTests.cs new file mode 100644 index 0000000000..a3bbb47f38 --- /dev/null +++ b/tests/Opc.Ua.Server.Tests/SubscriptionRetirementTrackerTests.cs @@ -0,0 +1,503 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Reflection; +using Moq; +using NUnit.Framework; +using Opc.Ua.Tests; + +namespace Opc.Ua.Server.Tests +{ + /// + /// Covers the monitored-item retirement and lifecycle seams a + /// exposes to the NodeManager lifecycle when a + /// generation is retired immediately. + /// + [TestFixture] + [Category("Subscription")] + [Category("NodeManagerLifecycle")] + [Parallelizable] + public class SubscriptionRetirementTrackerTests + { + [SetUp] + public void SetUp() + { + m_telemetry = NUnitTelemetryContext.Create(); + m_serverMock = new Mock(); + m_sessionMock = new Mock(); + m_diagnosticsNodeManagerMock = new Mock(); + m_nodeManagerMock = new Mock(); + m_queueFactoryMock = new Mock(); + + m_serverMock.Setup(s => s.Telemetry).Returns(m_telemetry); + m_serverMock.Setup(s => s.DiagnosticsNodeManager).Returns(m_diagnosticsNodeManagerMock.Object); + m_serverMock.Setup(s => s.NodeManager).Returns(m_nodeManagerMock.Object); + m_serverMock.Setup(s => s.MonitoredItemQueueFactory).Returns(m_queueFactoryMock.Object); + m_serverMock.Setup(s => s.DiagnosticsWriteLock).Returns(new object()); + m_serverMock.Setup(s => s.ServerDiagnostics).Returns(new ServerDiagnosticsSummaryDataType()); + + var namespaceUris = new NamespaceTable(); + m_serverMock.Setup(s => s.NamespaceUris).Returns(namespaceUris); + m_serverMock.Setup(s => s.ServerUris).Returns(new StringTable()); + m_serverMock.Setup(s => s.TypeTree).Returns(new TypeTable(namespaceUris)); + m_serverMock.Setup(s => s.Factory).Returns(new Mock().Object); + m_serverMock.Setup(s => s.DefaultSystemContext).Returns(new ServerSystemContext(m_serverMock.Object)); + + var identity = new UserIdentity(new AnonymousIdentityToken()); + m_sessionMock.Setup(s => s.Id).Returns(new NodeId(Guid.NewGuid())); + m_sessionMock.Setup(s => s.Identity).Returns(identity); + m_sessionMock.Setup(s => s.IdentityToken).Returns(identity.TokenHandler); + m_sessionMock.Setup(s => s.DiagnosticsLock).Returns(new object()); + m_sessionMock.Setup(s => s.SessionDiagnostics).Returns( + new SessionDiagnosticsDataType + { + ClientDescription = new ApplicationDescription + { + ApplicationUri = + "urn:localhost:opcfoundation.org:SubscriptionRetirementTrackerTests" + } + }); + + m_diagnosticsNodeManagerMock + .Setup(d => d.CreateSubscriptionDiagnosticsAsync( + It.IsAny(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync(new NodeId(1)); + } + + [Test] + public void CanRetireMonitoredItemsThrowsForNullNodeManager() + { + using Subscription subscription = CreateSubscription(); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + ArgumentNullException exception = Assert.Throws( + () => tracker.CanRetireMonitoredItems(null!)); + + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + } + + [Test] + public void RetireMonitoredItemsThrowsForNullNodeManager() + { + using Subscription subscription = CreateSubscription(); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + ArgumentNullException exception = Assert.Throws( + () => tracker.RetireMonitoredItems(null!, StatusCodes.BadNodeIdUnknown)); + + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + } + + [Test] + public void RetireMonitoredItemsThrowsForNullError() + { + using Subscription subscription = CreateSubscription(); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + ArgumentNullException exception = Assert.Throws( + () => tracker.RetireMonitoredItems(CreateNodeManager(), null!)); + + Assert.That(exception.ParamName, Is.EqualTo("error")); + } + + [Test] + public void DetachRetiredMonitoredItemsThrowsForNullNodeManager() + { + using Subscription subscription = CreateSubscription(); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + ArgumentNullException exception = Assert.Throws( + () => tracker.DetachRetiredMonitoredItems(null!)); + + Assert.That(exception.ParamName, Is.EqualTo("nodeManager")); + } + + [Test] + public void CanRetireMonitoredItemsIsTrueForAnEmptySubscription() + { + using Subscription subscription = CreateSubscription(); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That(tracker.CanRetireMonitoredItems(CreateNodeManager()), Is.True); + } + + [Test] + public void CanRetireMonitoredItemsIsFalseForADurableSubscription() + { + m_queueFactoryMock.Setup(f => f.SupportsDurableQueues).Returns(true); + using Subscription subscription = CreateSubscription(); + Assert.That( + ServiceResult.IsGood(subscription.SetSubscriptionDurable(1000)), + Is.True); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That(tracker.CanRetireMonitoredItems(CreateNodeManager()), Is.False); + } + + [Test] + public void RetireMonitoredItemsRejectsADurableSubscription() + { + m_queueFactoryMock.Setup(f => f.SupportsDurableQueues).Returns(true); + using Subscription subscription = CreateSubscription(); + Assert.That( + ServiceResult.IsGood(subscription.SetSubscriptionDurable(1000)), + Is.True); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That( + () => tracker.RetireMonitoredItems( + CreateNodeManager(), + StatusCodes.BadNodeIdUnknown), + Throws.InstanceOf()); + } + + [Test] + public void CanRetireMonitoredItemsIsTrueWhenEveryOwnedItemIsRetirable() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + AddMonitoredItem(subscription, new RetirableMonitoredItemStub(1, nodeManager)); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That(tracker.CanRetireMonitoredItems(nodeManager), Is.True); + } + + [Test] + public void CanRetireMonitoredItemsIsFalseWhenAnOwnedItemIsNotRetirable() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + AddMonitoredItem(subscription, new PlainMonitoredItemStub(2, nodeManager)); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That(tracker.CanRetireMonitoredItems(nodeManager), Is.False); + } + + [Test] + public void CanRetireMonitoredItemsIsFalseWhenAnOwnedItemIsDurable() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + AddMonitoredItem( + subscription, + new RetirableMonitoredItemStub(3, nodeManager) { IsDurable = true }); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That(tracker.CanRetireMonitoredItems(nodeManager), Is.False); + } + + [Test] + public void CanRetireMonitoredItemsIgnoresItemsOwnedByAnotherNodeManager() + { + IAsyncNodeManager owner = CreateNodeManager(); + IAsyncNodeManager other = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + AddMonitoredItem(subscription, new PlainMonitoredItemStub(4, other)); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That(tracker.CanRetireMonitoredItems(owner), Is.True); + } + + [Test] + public void RetireMonitoredItemsRetiresEveryOwnedItem() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + var item = new RetirableMonitoredItemStub(5, nodeManager); + AddMonitoredItem(subscription, item); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + var error = new ServiceResult(StatusCodes.BadNodeIdUnknown); + + tracker.RetireMonitoredItems(nodeManager, error); + + Assert.That(item.RetireCount, Is.EqualTo(1)); + Assert.That(item.IsRetired, Is.True); + Assert.That(item.RetirementError, Is.SameAs(error)); + } + + [Test] + public void RetireMonitoredItemsLeavesItemsOfAnotherNodeManagerUntouched() + { + IAsyncNodeManager owner = CreateNodeManager(); + IAsyncNodeManager other = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + var foreign = new RetirableMonitoredItemStub(6, other); + AddMonitoredItem(subscription, foreign); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + tracker.RetireMonitoredItems(owner, StatusCodes.BadNodeIdUnknown); + + Assert.That(foreign.RetireCount, Is.Zero); + } + + [Test] + public void RetireMonitoredItemsRejectsANonRetirableOwnedItem() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + AddMonitoredItem(subscription, new PlainMonitoredItemStub(7, nodeManager)); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That( + () => tracker.RetireMonitoredItems( + nodeManager, + StatusCodes.BadNodeIdUnknown), + Throws.InstanceOf()); + } + + [Test] + public void RetireMonitoredItemsRejectsADurableOwnedItem() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + var durable = new RetirableMonitoredItemStub(12, nodeManager) { IsDurable = true }; + AddMonitoredItem(subscription, durable); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + Assert.That( + () => tracker.RetireMonitoredItems( + nodeManager, + StatusCodes.BadNodeIdUnknown), + Throws.InstanceOf()); + Assert.That(durable.RetireCount, Is.Zero); + } + + [Test] + public void DetachRetiredMonitoredItemsDetachesOnlyRetiredOwnedItems() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + + var retired = new RetirableMonitoredItemStub(8, nodeManager); + retired.Retire(StatusCodes.BadNodeIdUnknown); + var live = new RetirableMonitoredItemStub(9, nodeManager); + AddMonitoredItem(subscription, retired); + AddMonitoredItem(subscription, live); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + tracker.DetachRetiredMonitoredItems(nodeManager); + + Assert.That(retired.DetachCount, Is.EqualTo(1)); + Assert.That(live.DetachCount, Is.Zero); + } + + [Test] + public void DetachRetiredMonitoredItemsIgnoresRetiredItemsOfAnotherNodeManager() + { + IAsyncNodeManager owner = CreateNodeManager(); + IAsyncNodeManager other = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + var foreign = new RetirableMonitoredItemStub(10, other); + foreign.Retire(StatusCodes.BadNodeIdUnknown); + AddMonitoredItem(subscription, foreign); + INodeManagerMonitoredItemRetirementTracker tracker = subscription; + + tracker.DetachRetiredMonitoredItems(owner); + + Assert.That(foreign.DetachCount, Is.Zero); + } + + [Test] + public void ContainsMonitoredItemDistinguishesRegisteredInstances() + { + IAsyncNodeManager nodeManager = CreateNodeManager(); + using Subscription subscription = CreateSubscription(); + var registered = new RetirableMonitoredItemStub(11, nodeManager); + AddMonitoredItem(subscription, registered); + ISubscriptionMonitoredItemLifecycle lifecycle = subscription; + + Assert.That(lifecycle.ContainsMonitoredItem(registered), Is.True); + + // Same id, different instance: the subscription must not claim it. + var impostor = new RetirableMonitoredItemStub(11, nodeManager); + Assert.That(lifecycle.ContainsMonitoredItem(impostor), Is.False); + } + + private static IAsyncNodeManager CreateNodeManager() + { + return new Mock().Object; + } + + private Subscription CreateSubscription() + { + return new Subscription( + m_serverMock.Object, + m_sessionMock.Object, + subscriptionId: 1, + publishingInterval: 1000, + maxLifetimeCount: 10, + maxKeepAliveCount: 5, + maxNotificationsPerPublish: 0, + priority: 0, + publishingEnabled: true, + maxMessageCount: 10); + } + + private static void AddMonitoredItem(Subscription subscription, IMonitoredItem monitoredItem) + { + var items = GetPrivateField>>( + subscription, + "m_monitoredItems"); + var checkList = GetPrivateField>( + subscription, + "m_itemsToCheck"); + LinkedListNode node = checkList.AddLast(monitoredItem); + items[monitoredItem.Id] = node; + } + + private static T GetPrivateField(object instance, string fieldName) + { + FieldInfo field = instance.GetType().GetField( + fieldName, + BindingFlags.Instance | BindingFlags.NonPublic) + ?? throw new InvalidOperationException($"Field {fieldName} not found."); + return (T)(field.GetValue(instance) + ?? throw new InvalidOperationException($"Field {fieldName} is null.")); + } + + private Mock m_serverMock; + private Mock m_sessionMock; + private Mock m_diagnosticsNodeManagerMock; + private Mock m_nodeManagerMock; + private Mock m_queueFactoryMock; + private ITelemetryContext m_telemetry; + } + + /// + /// A minimal monitored item that does not support immediate retirement. + /// Hand written because IRetirableMonitoredItem is internal and + /// therefore cannot be proxied by Moq. + /// + internal class PlainMonitoredItemStub : IMonitoredItem + { + public PlainMonitoredItemStub(uint id, IAsyncNodeManager nodeManager) + { + Id = id; + NodeManager = nodeManager; + } + public IAsyncNodeManager NodeManager { get; } + + public ISession Session => null; + + public IUserIdentity EffectiveIdentity => null; + + public uint Id { get; } + + public uint SubscriptionId => 1; + + public bool IsDurable { get; set; } + + public uint ClientHandle => Id; + + public ISubscription SubscriptionCallback { get; set; } + + public object ManagerHandle => null; + + public int MonitoredItemType => 1; + + public bool IsReadyToPublish => false; + + public bool IsReadyToTrigger { get; set; } + + public bool IsResendData => false; + + public NodeId NodeId => new(Id); + + public MonitoringMode MonitoringMode => MonitoringMode.Reporting; + + public double SamplingInterval => 1000; + + public void SetupResendDataTrigger() + { + } + + public ServiceResult GetCreateResult(out MonitoredItemCreateResult result) + { + result = new MonitoredItemCreateResult(); + return ServiceResult.Good; + } + + public ServiceResult GetModifyResult(out MonitoredItemModifyResult result) + { + result = new MonitoredItemModifyResult(); + return ServiceResult.Good; + } + + public IStoredMonitoredItem ToStorableMonitoredItem() + { + return null; + } + + public MonitoringMode SetMonitoringMode(MonitoringMode monitoringMode) + { + return MonitoringMode.Reporting; + } + + public void Dispose() + { + GC.SuppressFinalize(this); + } + } + + /// + /// A monitored item that supports immediate retirement and records how it + /// was driven by the subscription. + /// + internal sealed class RetirableMonitoredItemStub : PlainMonitoredItemStub, IRetirableMonitoredItem + { + public RetirableMonitoredItemStub(uint id, IAsyncNodeManager nodeManager) + : base(id, nodeManager) + { + } + + public bool IsRetired { get; private set; } + + public ServiceResult RetirementError { get; private set; } + + public int RetireCount { get; private set; } + + public int DetachCount { get; private set; } + + public void Retire(ServiceResult error) + { + IsRetired = true; + RetirementError = error; + RetireCount++; + } + + public void DetachOwner() + { + DetachCount++; + } + } +} diff --git a/tests/Opc.Ua.Server.Tests/SubscriptionTests.cs b/tests/Opc.Ua.Server.Tests/SubscriptionTests.cs index 20147f2448..000a70242a 100644 --- a/tests/Opc.Ua.Server.Tests/SubscriptionTests.cs +++ b/tests/Opc.Ua.Server.Tests/SubscriptionTests.cs @@ -408,6 +408,27 @@ private static void SetPrivateField( field.SetValue(instance, value); } + private static void EnqueueConditionRefreshTask( + SubscriptionManager manager, + ISubscription subscription) + { + Type taskType = typeof(SubscriptionManager).GetNestedType( + "ConditionRefreshTask", + BindingFlags.NonPublic) + ?? throw new InvalidOperationException( + "ConditionRefreshTask type not found."); + object task = Activator.CreateInstance(taskType, subscription, 0u) + ?? throw new InvalidOperationException( + "ConditionRefreshTask could not be created."); + object queue = GetPrivateField( + manager, + "m_conditionRefreshQueue"); + MethodInfo enqueue = queue.GetType().GetMethod("Enqueue") + ?? throw new InvalidOperationException( + "ConditionRefreshTask queue Enqueue method not found."); + enqueue.Invoke(queue, [task]); + } + private static void ExpireOnNextPublishTimer(Subscription subscription) { uint maxLifetimeCount = GetPrivateField( @@ -933,6 +954,82 @@ public async Task CreateSubscriptionWithNotificationLimitsUsesEffectiveLimitAsyn Is.EqualTo((uint)expectedLimit)); } + [Test] + public async Task DisposeAsyncJoinsWorkersAndIsIdempotentAsync() + { + var timeProvider = new FakeTimeProvider( + new DateTimeOffset(2026, 1, 1, 0, 0, 0, TimeSpan.Zero)); + var configuration = new ApplicationConfiguration + { + ServerConfiguration = new ServerConfiguration + { + PublishingResolution = 1000 + } + }; + var manager = new SubscriptionManager( + m_serverMock.Object, + configuration, + timeProvider); + + await manager.StartupAsync().ConfigureAwait(false); + await Task.Yield(); + + await manager.DisposeAsync().ConfigureAwait(false); + await manager.DisposeAsync().ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That( + GetPrivateField(manager, "m_publishSubscriptionsTask").IsCompleted, + Is.True); + Assert.That( + GetPrivateField(manager, "m_conditionRefreshTask").IsCompleted, + Is.True); + }); + } + + [Test] + public async Task DisposeAsyncWhileConditionRefreshIsRunningWaitsForWorkAsync() + { + var configuration = new ApplicationConfiguration + { + ServerConfiguration = new ServerConfiguration() + }; + var manager = new SubscriptionManager( + m_serverMock.Object, + configuration); + var refreshStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseRefresh = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + bool refreshCompleted = false; + var subscription = new Mock(); + subscription + .Setup(s => s.ConditionRefreshAsync(It.IsAny())) + .Returns((CancellationToken _) => new ValueTask(WaitForReleaseAsync())); + + async Task WaitForReleaseAsync() + { + refreshStarted.SetResult(new object()); + await releaseRefresh.Task.ConfigureAwait(false); + refreshCompleted = true; + } + + EnqueueConditionRefreshTask(manager, subscription.Object); + manager.StartConditionRefreshWorkerForTest(); + await refreshStarted.Task.ConfigureAwait(false); + + Task disposeTask = manager.DisposeAsync().AsTask(); + + Assert.That(disposeTask.IsCompleted, Is.False); + + releaseRefresh.SetResult(new object()); + await disposeTask.ConfigureAwait(false); + await manager.DisposeAsync().ConfigureAwait(false); + + Assert.That(refreshCompleted, Is.True); + } + [TestCase(0, 0L, 0L)] [TestCase(0, 25L, 25L)] [TestCase(10, 0L, 10L)] @@ -1040,6 +1137,7 @@ public async Task TransferSerializesWithClosingSourceSessionAsync() It.IsAny(), It.IsAny>(), It.IsAny>(), + It.IsAny(), It.IsAny())) .Callback(() => transferEntered.TrySetResult(true)) .Returns(() => new ValueTask(releaseTransfer.Task)); @@ -1087,6 +1185,410 @@ public async Task TransferSerializesWithClosingSourceSessionAsync() Assert.DoesNotThrow(() => subscription.ResendData(destinationContext)); } + [Test] + public async Task TransferClaimsSourceBeforeCallbacksAndBlocksStalePublishAsync() + { + var fixture = await CreateTransferSubscriptionAsync().ConfigureAwait(false); + using SubscriptionManager manager = fixture.Manager; + Subscription subscription = fixture.Subscription; + SessionPublishQueue sourceQueue = GetPublishQueue( + manager, + fixture.SourceContext.SessionId); + SetPrivateField(subscription, "m_waitingForPublish", false); + SetPrivateField(subscription, "m_lifetimeCounter", 0u); + SetExpiryTime( + subscription, + TimeProvider.System.GetTimestampMilliseconds() - 100); + m_sessionMock + .Setup(session => session.IsSecureChannelValid("source-channel")) + .Returns(true); + IReadOnlyList staleSnapshot = + sourceQueue.CapturePublishTimerSnapshot(); + using var publishCancellation = new CancellationTokenSource(); + Task sourcePublish = sourceQueue.PublishAsync( + "source-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + publishCancellation.Token); + var transferEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseTransfer = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + m_nodeManagerMock + .Setup(nodeManager => nodeManager.TransferMonitoredItemsAsync( + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Callback(() => transferEntered.TrySetResult(true)) + .Returns(() => new ValueTask(releaseTransfer.Task)); + + Task transferTask = manager + .TransferSubscriptionsAsync( + fixture.DestinationContext, + [subscription.Id], + sendInitialValues: true) + .AsTask(); + Task entered = await Task.WhenAny( + transferEntered.Task, + Task.Delay(TimeSpan.FromSeconds(5))).ConfigureAwait(false); + if (!ReferenceEquals(entered, transferEntered.Task)) + { + releaseTransfer.TrySetResult(true); + Assert.Fail("Transfer did not reach the monitored-item callback barrier."); + } + + try + { + sourceQueue.PublishTimerExpired(staleSnapshot); + + Assert.Multiple(() => + { + Assert.That( + sourceQueue.CapturePublishTimerSnapshot(), + Is.Empty, + "The source entry must be claimed before callbacks run."); + Assert.That( + sourcePublish.IsCompleted, + Is.False, + "A stale source timer must not assign the claimed subscription."); + ServiceResultException error = Assert.Throws( + () => subscription.Publish( + fixture.SourceContext, + out _, + out _)); + Assert.That( + error.StatusCode, + Is.EqualTo(StatusCodes.BadSubscriptionIdInvalid)); + }); + } + finally + { + releaseTransfer.TrySetResult(true); + } + + TransferSubscriptionsResponse transferred = await transferTask.ConfigureAwait(false); + publishCancellation.Cancel(); + try + { + await sourcePublish.ConfigureAwait(false); + } + catch (Exception) + { + // The old session's parked Publish is cancelled or completed by + // the transferred-status notification, never with the subscription. + } + + Assert.Multiple(() => + { + Assert.That(transferred.Results, Has.Count.EqualTo(1)); + Assert.That(transferred.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That( + subscription.Session, + Is.SameAs(fixture.DestinationSession.Object)); + }); + Assert.DoesNotThrow( + () => subscription.ResendData(fixture.DestinationContext)); + } + + [Test] + public async Task TransferInitialValueIsPublishedOnlyByDestinationAsync() + { + var fixture = await CreateTransferSubscriptionAsync().ConfigureAwait(false); + using SubscriptionManager manager = fixture.Manager; + Subscription subscription = fixture.Subscription; + using var queueFactory = new MonitoredItemQueueFactory(m_telemetry); + m_serverMock.Setup(server => server.MonitoredItemQueueFactory).Returns(queueFactory); + var itemOwner = new Mock(); + using var monitoredItem = new MonitoredItem( + m_serverMock.Object, + itemOwner.Object, + new object(), + subscription.Id, + id: 10, + new ReadValueId + { + NodeId = new NodeId("TransferValue", 2), + AttributeId = Attributes.Value + }, + DiagnosticsMasks.None, + TimestampsToReturn.Both, + MonitoringMode.Reporting, + clientHandle: 11, + originalFilter: null, + filterToUse: null, + range: null, + samplingInterval: 1000, + queueSize: 1, + discardOldest: true, + sourceSamplingInterval: 1000); + await RegisterMonitoredItemsAsync(subscription, monitoredItem).ConfigureAwait(false); + monitoredItem.QueueValue(new DataValue(new Variant(1234)), null); + var initialNotifications = new Queue(); + monitoredItem.Publish( + new OperationContext(monitoredItem), + initialNotifications, + new Queue(), + 1, + m_telemetry.CreateLogger()); + Assert.That(initialNotifications, Has.Count.EqualTo(1)); + + var transferEntered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseTransfer = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + itemOwner + .Setup(nodeManager => nodeManager.TransferMonitoredItemsAsync( + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Returns< + OperationContext, + bool, + IList, + IList, + IList, + MonitoredItemTransferOptions, + CancellationToken>(async (_, sendInitialValues, monitoredItems, processedItems, errors, transferOptions, cancellationToken) => + { + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + if (processedItems[ii]) + { + continue; + } + + processedItems[ii] = true; + errors[ii] = ServiceResult.Good; + if (sendInitialValues && !transferOptions.DeferInitialValues) + { + monitoredItems[ii].SetupResendDataTrigger(); + } + } + transferEntered.TrySetResult(true); + await releaseTransfer.Task.WaitAsync(cancellationToken).ConfigureAwait(false); + }); + itemOwner + .Setup(nodeManager => nodeManager.RollbackMonitoredItemsTransferAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .Returns(default(ValueTask)); + var configurationNodeManager = new Mock(); + configurationNodeManager + .SetupGet(nodeManager => nodeManager.NamespaceUris) + .Returns(System.Array.Empty()); + var coreNodeManager = new Mock(); + coreNodeManager + .SetupGet(nodeManager => nodeManager.NamespaceUris) + .Returns(System.Array.Empty()); + var factory = new Mock(); + factory + .Setup(nodeManagerFactory => nodeManagerFactory.CreateConfigurationNodeManager()) + .Returns(configurationNodeManager.Object); + factory + .Setup(nodeManagerFactory => nodeManagerFactory.CreateCoreNodeManager(It.IsAny())) + .Returns(coreNodeManager.Object); + m_serverMock.Setup(server => server.MainNodeManagerFactory).Returns(factory.Object); + using var masterNodeManager = new MasterNodeManager( + m_serverMock.Object, + new ApplicationConfiguration { ServerConfiguration = new ServerConfiguration() }, + null, + itemOwner.Object); + m_serverMock.Setup(server => server.NodeManager).Returns(masterNodeManager); + + Task transferTask = manager + .TransferSubscriptionsAsync( + fixture.DestinationContext, + [subscription.Id], + sendInitialValues: true) + .AsTask(); + Task entered = await Task.WhenAny( + transferEntered.Task, + Task.Delay(TimeSpan.FromSeconds(5))).ConfigureAwait(false); + if (!ReferenceEquals(entered, transferEntered.Task)) + { + releaseTransfer.TrySetResult(true); + Assert.Fail("Transfer did not reach the monitored-item callback barrier."); + } + + try + { + itemOwner.Verify( + nodeManager => nodeManager.TransferMonitoredItemsAsync( + It.IsAny(), + true, + It.IsAny>(), + It.IsAny>(), + It.IsAny>(), + It.Is(options => options.DeferInitialValues), + It.IsAny()), + Times.Once); + Assert.That(monitoredItem.IsResendData, Is.False); + ServiceResultException error = Assert.Throws( + () => subscription.Publish( + fixture.SourceContext, + out _, + out _)); + Assert.That(error.StatusCode, Is.EqualTo(StatusCodes.BadSubscriptionIdInvalid)); + } + finally + { + releaseTransfer.TrySetResult(true); + } + + TransferSubscriptionsResponse transferred = await transferTask.ConfigureAwait(false); + Assert.That(transferred.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(monitoredItem.IsResendData, Is.True); + + SessionPublishQueue destinationQueue = GetPublishQueue( + manager, + fixture.DestinationContext.SessionId); + SetPrivateField(subscription, "m_waitingForPublish", false); + SetPrivateField(subscription, "m_lifetimeCounter", 0u); + SetExpiryTime( + subscription, + TimeProvider.System.GetTimestampMilliseconds() - 100); + destinationQueue.PublishTimerExpired( + destinationQueue.CapturePublishTimerSnapshot()); + ISubscription readySubscription = await destinationQueue.PublishAsync( + "destination-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + CancellationToken.None).ConfigureAwait(false); + NotificationMessage message = readySubscription.Publish( + fixture.DestinationContext, + out _, + out _); + + Assert.Multiple(() => + { + Assert.That(readySubscription, Is.SameAs(subscription)); + Assert.That(message, Is.Not.Null); + Assert.That(message.NotificationData, Is.Not.Empty); + Assert.That(monitoredItem.IsResendData, Is.False); + }); + } + + [Test] + public async Task TransferFallbackAppliesInitialValueExactlyOnceAsync() + { + var fixture = await CreateTransferSubscriptionAsync().ConfigureAwait(false); + using SubscriptionManager manager = fixture.Manager; + Subscription subscription = fixture.Subscription; + using var queueFactory = new MonitoredItemQueueFactory(m_telemetry); + m_serverMock.Setup(server => server.MonitoredItemQueueFactory).Returns(queueFactory); + var itemOwner = new Mock(); + using var monitoredItem = new MonitoredItem( + m_serverMock.Object, + itemOwner.Object, + new object(), + subscription.Id, + id: 11, + new ReadValueId + { + NodeId = new NodeId("FallbackTransferValue", 2), + AttributeId = Attributes.Value + }, + DiagnosticsMasks.None, + TimestampsToReturn.Both, + MonitoringMode.Reporting, + clientHandle: 12, + originalFilter: null, + filterToUse: null, + range: null, + samplingInterval: 1000, + queueSize: 1, + discardOldest: true, + sourceSamplingInterval: 1000); + await RegisterMonitoredItemsAsync(subscription, monitoredItem).ConfigureAwait(false); + monitoredItem.QueueValue(new DataValue(new Variant(5678)), null); + var initialNotifications = new Queue(); + monitoredItem.Publish( + new OperationContext(monitoredItem), + initialNotifications, + new Queue(), + 1, + m_telemetry.CreateLogger()); + Assert.That(initialNotifications, Has.Count.EqualTo(1)); + int setupResendCalls = 0; + m_nodeManagerMock + .Setup(nodeManager => nodeManager.TransferMonitoredItemsAsync( + It.IsAny(), + true, + It.Is>(items => items.Contains(monitoredItem)), + It.IsAny>(), + It.Is(options => options == null), + It.IsAny())) + .Callback, IList, MonitoredItemTransferOptions, CancellationToken>( + (_, sendInitialValues, monitoredItems, errors, transferOptions, _) => + { + Assert.That(transferOptions, Is.Null); + for (int ii = 0; ii < monitoredItems.Count; ii++) + { + errors[ii] = ServiceResult.Good; + if (sendInitialValues) + { + setupResendCalls++; + monitoredItems[ii].SetupResendDataTrigger(); + } + } + }) + .Returns(default(ValueTask)); + + TransferSubscriptionsResponse transferred = await manager + .TransferSubscriptionsAsync( + fixture.DestinationContext, + [subscription.Id], + sendInitialValues: true) + .ConfigureAwait(false); + + Assert.That(transferred.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(setupResendCalls, Is.EqualTo(1)); + SessionPublishQueue destinationQueue = GetPublishQueue( + manager, + fixture.DestinationContext.SessionId); + SetPrivateField(subscription, "m_waitingForPublish", false); + SetPrivateField(subscription, "m_lifetimeCounter", 0u); + SetExpiryTime( + subscription, + TimeProvider.System.GetTimestampMilliseconds() - 100); + destinationQueue.PublishTimerExpired( + destinationQueue.CapturePublishTimerSnapshot()); + ISubscription readySubscription = await destinationQueue.PublishAsync( + "destination-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + CancellationToken.None).ConfigureAwait(false); + NotificationMessage firstMessage = readySubscription.Publish( + fixture.DestinationContext, + out _, + out _); + NotificationMessage secondMessage = readySubscription.Publish( + fixture.DestinationContext, + out _, + out _); + + Assert.Multiple(() => + { + Assert.That(firstMessage.NotificationData, Is.Not.Empty); + Assert.That(secondMessage?.NotificationData ?? [], Is.Empty); + Assert.That(monitoredItem.IsResendData, Is.False); + }); + } + [Test] public async Task SourcePublishTimerSnapshotDoesNotExpireTransferredSubscriptionAsync() { @@ -1312,6 +1814,7 @@ await manager.SessionClosingAsync( It.IsAny(), It.IsAny>(), It.IsAny>(), + It.IsAny(), It.IsAny())) .Returns( () => Interlocked.Increment(ref transferCalls) == 1 @@ -1504,3 +2007,5 @@ private static Mock CreateDataChangeMonitoredItem( } } } + + diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/CompilerUtils.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/CompilerUtils.cs index ccb25e3e97..8d285abb94 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/CompilerUtils.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/CompilerUtils.cs @@ -90,6 +90,14 @@ public static AdditionalText From(string resourceName) throw new FileNotFoundException("Resource not found"); } + /// + /// Creates an in-memory additional file with the supplied path and content. + /// + public static AdditionalText FromContent(string path, string content) + { + return new EmbeddedText(path, content); + } + /// /// Creates in-memory additional text. /// @@ -256,6 +264,27 @@ public static CSharpCompilation CreateCompilation( .AddReferences(DefaultReferences); } + /// + /// Runs the generator driver against the compilation and returns the + /// generator diagnostics together with the run result, without + /// asserting success. Use for tests that need to inspect diagnostics + /// produced by malformed, unsupported or otherwise rejected inputs + /// (for example a WoT model that fails to parse or convert) instead + /// of asserting a clean, fully compiling run. Named distinctly from + /// the built-in GeneratorDriver.RunGenerators API (which + /// returns a , not diagnostics) to avoid + /// ambiguity. + /// + public static (ImmutableArray Diagnostics, GeneratorDriverRunResult RunResult) + RunGeneratorsForDiagnostics(this GeneratorDriver driver, Compilation compilation) + { + driver = driver.RunGeneratorsAndUpdateCompilation( + compilation, + out Compilation _, + out ImmutableArray diagnostics); + return (diagnostics, driver.GetRunResult()); + } + /// /// Add code files to compilation /// diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/FluentBuilderGeneratorTests.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/FluentBuilderGeneratorTests.cs index 363ad14103..5d23f858c5 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/FluentBuilderGeneratorTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/FluentBuilderGeneratorTests.cs @@ -334,12 +334,13 @@ public void DeclarationBackedInputOnlyMethodEmitsTypedOnCallOverloads() public void DeclarationBackedNodeSetFixtureCarriesDeclarationInputArgument() { Dictionary files = GenerateForDeclarationBackedNodeSet(); - string values = files.Single(kv => kv.Key.EndsWith(".NodeStates.i.g.cs", StringComparison.Ordinal)).Value; + string values = files.Single( + kv => kv.Key.EndsWith(".NodeStates.ex.g.cs", StringComparison.Ordinal)).Value; Assert.Multiple(() => { Assert.That(values, Does.Contain("AdjustDeclaration_InputArguments")); - Assert.That(values, Does.Contain("setpoint")); + Assert.That(values, Does.Contain("Name = \"setpoint\"")); }); } @@ -459,10 +460,8 @@ private static string GetFluentBuilders() return files.Single(kv => kv.Key.EndsWith(".FluentBuilders.g.cs", StringComparison.Ordinal)).Value; } - // ============================================================ // FB-3 phase 3: per-ObjectType IComponentAccessor/IPropertyAccessor // extensions emitted into the same FluentBuilders file. - // ============================================================ [Test] public void EmittedFluentBuilders_HasPerObjectTypeComponentAccessorClass() @@ -595,12 +594,14 @@ private static Dictionary GenerateForDeclarationBackedNodeSet() string path = Path.Combine(resources, nodeSetFile); var nodesets = new NodesetFileCollection( - [(path, new NodesetFileOptions + [ + (path, new NodesetFileOptions { ModelUri = namespaceUri, Name = "DeclarationBackedMethod", Prefix = "DeclarationBackedMethod" - })], + }) + ], [], fileSystem, telemetry); diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/NodeStateGeneratorTests.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/NodeStateGeneratorTests.cs index b728662371..9c2471912f 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/NodeStateGeneratorTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/NodeStateGeneratorTests.cs @@ -35,6 +35,7 @@ using System.Text.RegularExpressions; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.Extensions.Logging; using Moq; using NUnit.Framework; @@ -499,6 +500,308 @@ public void ConcreteInstanceAnalogChildren_AreMaterializedUnconditionally() } } + /// + /// Verifies DataTypeEncoding objects remain independent predefined + /// nodes when a NodeSet exporter authors a same-namespace + /// ParentNodeId pointing at the owning DataType. Absorbing the + /// encoding into the DataType child collection drops it from the + /// generated NodeManager and leaves the server TypeTree without the + /// encoding-to-DataType relationship required for structured values. + /// + [Test] + public void SameNamespaceEncodingNodesAreEmittedAsPredefinedNodes() + { + ITelemetryContext telemetry = NUnitTelemetryContext.Create(logLevel: LogLevel.Error); + + Dictionary files = GenerateFromNodeSet( + "SameNamespaceEncoding.NodeSet2.xml", + telemetry); + + string code = files.Single( + kv => kv.Key.EndsWith(".NodeStates.ex.g.cs", StringComparison.Ordinal)).Value; + + Assert.Multiple(() => + { + Assert.That( + code, + Does.Contain("CreateMyDataType_Encoding_DefaultBinary"), + "The Default Binary encoding factory must be emitted."); + Assert.That( + code, + Does.Contain("CreateMyDataType_Encoding_Default_JSON"), + "The Default JSON encoding factory must be emitted."); + Assert.That( + code, + Does.Contain( + "NodeState state = CreateMyDataType_Encoding_DefaultBinary(context);"), + "The Default Binary encoding must be registered as a predefined node."); + Assert.That( + code, + Does.Contain( + "NodeState state = CreateMyDataType_Encoding_Default_JSON(context);"), + "The Default JSON encoding must be registered as a predefined node."); + }); + } + + [Test] + public void MethodArgumentDataTypesUseRuntimeNamespaceTable() + { + ITelemetryContext telemetry = NUnitTelemetryContext.Create(logLevel: LogLevel.Error); + + Dictionary files = GenerateFromNodeSet( + "MethodArgumentNamespace.NodeSet2.xml", + telemetry); + + string code = files.Single( + kv => kv.Key.EndsWith(".NodeStates.ex.g.cs", StringComparison.Ordinal)).Value; + string factory = ExtractMethodBody( + code, + "CreateMyObjectType_DoWork_InputArguments"); + + Assert.Multiple(() => + { + Assert.That( + factory, + Does.Contain( + "DataType = global::Opc.Ua.NodeId.Create(100u, " + + "global::MethodArguments.Namespaces.MethodArguments, " + + "context.NamespaceUris)")); + Assert.That(factory, Does.Not.Contain("Variant.FromXml")); + }); + } + + [Test] + public void SameNamedMethodArgumentsUseDistinctSymbolsAndPreserveRuntimeNames() + { + ITelemetryContext telemetry = NUnitTelemetryContext.Create(logLevel: LogLevel.Error); + + Dictionary files = GenerateFromNodeSet( + "SameNamedMethodArguments.NodeSet2.xml", + telemetry); + Dictionary repeatedFiles = GenerateFromNodeSet( + "SameNamedMethodArguments.NodeSet2.xml", + telemetry); + + string nodeStates = files.Single( + kv => kv.Key.EndsWith(".NodeStates.ex.g.cs", StringComparison.Ordinal)).Value; + string nodeStateClasses = files.Single( + kv => kv.Key.EndsWith(".NodeStates.g.cs", StringComparison.Ordinal)).Value; + string proxies = files.Single( + kv => kv.Key.EndsWith(".TypeProxies.g.cs", StringComparison.Ordinal)).Value; + string generatedCode = string.Join("\n", files.Values); + string inputArgumentsFactory = ExtractMethodBody( + nodeStates, + "CreateRoundTripMethodType_InputArguments"); + string outputArgumentsFactory = ExtractMethodBody( + nodeStates, + "CreateRoundTripMethodType_OutputArguments"); + string localCollisionInputFactory = ExtractMethodBody( + nodeStates, + "CreateLocalCollisionMethodType_InputArguments"); + string localCollisionOutputFactory = ExtractMethodBody( + nodeStates, + "CreateLocalCollisionMethodType_OutputArguments"); + string[] inputRuntimeNames = ExtractStringLiteralValues(inputArgumentsFactory); + string[] outputRuntimeNames = ExtractStringLiteralValues(outputArgumentsFactory); + string[] localCollisionInputNames = + ExtractStringLiteralValues(localCollisionInputFactory); + string[] localCollisionOutputNames = + ExtractStringLiteralValues(localCollisionOutputFactory); + string[] proxyRuntimeStrings = ExtractStringLiteralValues(proxies); + string[] expectedInputNames = + [ + "Foo", + "foo", + "Class", + "VersionId", + "Await", + "Ct", + "cT", + "CancellationToken", + "Context", + "ObjectId", + "Method", + "InputArguments", + "Results", + "_result", + "_foo", + "_", + "Nameof", + "__arglist", + "__makeref", + "__reftype", + "__refvalue" + ]; + string[] expectedOutputNames = + [ + "VersionId", + "class", + "Changed", + "OutputArguments", + "ServiceResult", + "Quote\"Name", + "Back\\Slash", + "Line\nBreak", + "Δelta雪", + "Foo", + "RoundTripMethodStateResult", + "Next\u0085Line", + "Line\u2028Separator", + "Paragraph\u2029Separator" + ]; + + Assert.Multiple(() => + { + Assert.That(generatedCode, Does.Contain("string foo,")); + Assert.That(generatedCode, Does.Contain("string foo2,")); + Assert.That(generatedCode, Does.Contain("string @class,")); + Assert.That(generatedCode, Does.Contain("string versionId,")); + Assert.That(generatedCode, Does.Contain("string await2,")); + Assert.That(generatedCode, Does.Contain("string ct2,")); + Assert.That(generatedCode, Does.Contain("string cT3,")); + Assert.That(generatedCode, Does.Contain("string cancellationToken2,")); + Assert.That(generatedCode, Does.Contain("string context2,")); + Assert.That(generatedCode, Does.Contain("string objectId2,")); + Assert.That(generatedCode, Does.Contain("string method2,")); + Assert.That(generatedCode, Does.Contain("string inputArguments2,")); + Assert.That(generatedCode, Does.Contain("string results2,")); + Assert.That(nodeStateClasses, Does.Contain("string _result2,")); + Assert.That(nodeStateClasses, Does.Contain("string _foo,")); + Assert.That(nodeStateClasses, Does.Contain("string _2,")); + Assert.That(nodeStateClasses, Does.Contain("string nameof,")); + Assert.That(nodeStateClasses, Does.Contain("string @__arglist,")); + Assert.That(nodeStateClasses, Does.Contain("string @__makeref,")); + Assert.That(nodeStateClasses, Does.Contain("string @__reftype,")); + Assert.That(nodeStateClasses, Does.Contain("string @__refvalue,")); + Assert.That(generatedCode, Does.Contain("ref string versionIdOut")); + Assert.That(generatedCode, Does.Contain("ref string classOut")); + Assert.That(generatedCode, Does.Contain("ref string outputArgumentsOut")); + Assert.That(generatedCode, Does.Contain("ref string serviceResultOut")); + Assert.That(nodeStateClasses, Does.Contain("ref string fooOut")); + Assert.That(nodeStateClasses, + Does.Contain("ref string roundTripMethodStateResultOut")); + Assert.That(generatedCode, Does.Contain( + "public string VersionIdOut { get; set; }")); + Assert.That(generatedCode, Does.Contain( + "public string ClassOut { get; set; }")); + Assert.That(generatedCode, Does.Contain( + "public string OutputArgumentsOut { get; set; }")); + Assert.That(generatedCode, Does.Contain( + "public string ServiceResultOut { get; set; }")); + Assert.That(nodeStateClasses, Does.Contain( + "public string RoundTripMethodStateResultOut { get; set; }")); + Assert.That(generatedCode, Does.Contain("\\u0085")); + Assert.That(generatedCode, Does.Contain("\\u2028")); + Assert.That(generatedCode, Does.Contain("\\u2029")); + Assert.That(generatedCode, Does.Not.Contain("string await,")); + Assert.That(generatedCode, Does.Not.Contain("string cancellationToken,")); + Assert.That(inputArgumentsFactory, + Does.Not.Contain("Name = \"foo2\"")); + Assert.That(inputArgumentsFactory, + Does.Not.Contain("Name = \"@class\"")); + Assert.That(outputArgumentsFactory, + Does.Not.Contain("Name = \"VersionIdOut\"")); + Assert.That(outputArgumentsFactory, + Does.Not.Contain("Name = \"classOut\"")); + foreach (string expectedName in expectedInputNames) + { + Assert.That(inputRuntimeNames, Does.Contain(expectedName)); + } + foreach (string expectedName in expectedOutputNames) + { + Assert.That(outputRuntimeNames, Does.Contain(expectedName)); + } + Assert.That(localCollisionInputNames, Does.Contain("_foo")); + Assert.That(localCollisionOutputNames, Does.Contain("Foo")); + + Assert.That(proxies, Does.Contain("ValueTask<(")); + Assert.That(proxies, Does.Contain( + "ValueTask LocalCollisionAsync(")); + Assert.That(proxies, Does.Contain( + "TryGetValue(out string _fooOut)")); + Assert.That(proxies, Does.Contain("return _fooOut;")); + Assert.That(proxies, Does.Contain("string versionIdOut")); + Assert.That(proxies, Does.Contain("string classOut")); + Assert.That(proxies, Does.Contain("bool changed")); + Assert.That(proxies, Does.Contain("string outputArgumentsOut")); + Assert.That(proxies, Does.Contain("string serviceResultOut")); + Assert.That(proxies, Does.Contain("string quote_Name")); + Assert.That(proxies, Does.Contain("string back_Slash")); + Assert.That(proxies, Does.Contain("string lineBreak")); + Assert.That(proxies, Does.Contain("string δelta雪")); + Assert.That(proxies, Does.Contain("string fooOut")); + Assert.That(proxies, + Does.Contain("string roundTripMethodStateResult")); + Assert.That(proxies, Does.Contain("string nextLine")); + Assert.That(proxies, Does.Contain("string lineSeparator")); + Assert.That(proxies, Does.Contain("string paragraphSeparator")); + Assert.That(proxies, Does.Contain("string foo,")); + Assert.That(proxies, Does.Contain("string foo2,")); + Assert.That(proxies, Does.Contain("string @class,")); + Assert.That(proxies, Does.Contain("string versionId,")); + Assert.That(proxies, Does.Contain("string await2,")); + Assert.That(proxies, Does.Contain("string ct2,")); + Assert.That(proxies, Does.Contain("string cT3,")); + Assert.That(proxies, Does.Contain("string cancellationToken2,")); + Assert.That(proxies, Does.Contain("string context2,")); + Assert.That(proxies, Does.Contain("string objectId2,")); + Assert.That(proxies, Does.Contain("string method2,")); + Assert.That(proxies, Does.Contain("string inputArguments2,")); + Assert.That(proxies, Does.Contain("string results2,")); + Assert.That(proxies, Does.Contain("string _result,")); + Assert.That(proxies, Does.Contain("string _foo,")); + Assert.That(proxies, Does.Contain("string _2,")); + Assert.That(proxies, Does.Contain("string nameof2,")); + Assert.That(proxies, Does.Contain("string @__arglist,")); + Assert.That(proxies, Does.Contain("string @__makeref,")); + Assert.That(proxies, Does.Contain("string @__reftype,")); + Assert.That(proxies, Does.Contain("string @__refvalue,")); + Assert.That(proxies, Does.Contain("")); + Assert.That(proxies, Does.Not.Contain("")); + Assert.That(proxies, Does.Contain("output 'VersionId'.")); + Assert.That(proxies, Does.Contain("output 'class'.")); + foreach (string expectedName in expectedOutputNames) + { + Assert.That( + proxyRuntimeStrings, + Does.Contain( + $"Method 'RoundTrip' returned an unexpected value " + + $"for output '{expectedName}'.")); + } + + Assert.That(repeatedFiles.Keys, Is.EquivalentTo(files.Keys)); + foreach (string key in files.Keys) + { + Assert.That(repeatedFiles[key], Is.EqualTo(files[key]), key); + } + }); + + using var peStream = new MemoryStream(); + bool success = OptimizationLevel.Debug + .CreateCompilation() + .AddCode( + files.WithOpcUaGeneratedStack(), + LanguageVersion.Latest) + .Emit(peStream) + .Check(TestContext.Out, out int errorCount, out int warnCount); + + Assert.That(success, Is.True, + $"Generated code should compile. Errors: {errorCount}, Warnings: {warnCount}"); + } + + private static string[] ExtractStringLiteralValues(string source) + { + return + [ + .. CSharpSyntaxTree.ParseText(source) + .GetRoot() + .DescendantNodes() + .OfType() + .Where(literal => literal.IsKind(SyntaxKind.StringLiteralExpression)) + .Select(literal => literal.Token.ValueText) + ]; + } + private static Dictionary GenerateFromNodeSet( string nodeSetResource, ITelemetryContext telemetry) diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/ObjectTypeProxyGeneratorTests.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/ObjectTypeProxyGeneratorTests.cs index 6bd3717291..ed9218b01b 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/ObjectTypeProxyGeneratorTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Generators/ObjectTypeProxyGeneratorTests.cs @@ -349,6 +349,35 @@ public void Emit_StructureInput_UsesFromStructureForBoxing() Does.Contain("global::Opc.Ua.Variant.FromStructure(payload)")); } + [Test] + public void StructureOutputUsesSessionMessageContext() + { + MethodDesign method = CreateMethod( + "Read", + outputs: + [ + CreateParameter( + "payload", + BasicDataType.UserDefined, + symbolicName: "MyStruct") + ]); + ObjectTypeDesign objectType = CreateObjectType("FooType", method); + m_mockModelDesign.Setup(m => m.GetNodeDesigns()).Returns([objectType]); + + using var stream = new MemoryStream(); + m_mockFileSystem + .Setup(fs => fs.OpenWrite(It.IsAny())) + .Returns(stream); + + new ObjectTypeProxyGenerator(CreateContext()).Emit(); + string content = Encoding.UTF8.GetString(stream.ToArray()); + + Assert.That( + content, + Does.Contain( + "TryGetStructure(base.Session.MessageContext, out ")); + } + [Test] public void Emit_ObjectTypeWithBaseType_EmitsInheritance() { diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/MethodArgumentNamespace.NodeSet2.xml b/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/MethodArgumentNamespace.NodeSet2.xml new file mode 100644 index 0000000000..5f618058ee --- /dev/null +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/MethodArgumentNamespace.NodeSet2.xml @@ -0,0 +1,94 @@ + + + + http://test.org/UA/MethodArguments/ + + + + + + + + i=38 + i=37 + i=40 + i=45 + i=46 + i=47 + + + + MyDataType + + i=22 + ns=1;i=101 + + + + + + + + Default Binary + + i=76 + ns=1;i=100 + + + + + MyObjectType + + i=58 + ns=1;i=201 + + + + + DoWork + + i=78 + ns=1;i=200 + ns=1;i=202 + + + + + InputArguments + + i=78 + i=68 + ns=1;i=201 + + + + + + i=297 + + + + Options + + ns=1;i=100 + + -1 + + + Structured method options. + + + + + + + + diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/SameNamedMethodArguments.NodeSet2.xml b/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/SameNamedMethodArguments.NodeSet2.xml new file mode 100644 index 0000000000..79984b2a28 --- /dev/null +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/SameNamedMethodArguments.NodeSet2.xml @@ -0,0 +1,812 @@ + + + + http://test.org/UA/SameNamedMethodArguments/ + + + + + + + + i=1 + i=12 + i=37 + i=40 + i=45 + i=46 + i=47 + + + + VersionedObjectType + + i=58 + ns=1;i=1004 + ns=1;i=1013 + + + + + RoundTripMethodType + + ns=1;i=1002 + ns=1;i=1003 + + + + + InputArguments + + i=78 + i=68 + ns=1;i=1001 + + + + + + i=297 + + + + Foo + + i=12 + + -1 + + + The first canonical-name input. + + + + + + + i=297 + + + + foo + + i=12 + + -1 + + + The colliding canonical-name input. + + + + + + + i=297 + + + + Class + + i=12 + + -1 + + + A C# keyword after canonical casing. + + + + + + + i=297 + + + + VersionId + + i=12 + + -1 + + + The requested version identifier. + + + + + + + i=297 + + + + Await + + i=12 + + -1 + + + A contextual C# keyword in asynchronous code. + + + + + + + i=297 + + + + Ct + + i=12 + + -1 + + + A proxy cancellation-token collision. + + + + + + + i=297 + + + + cT + + i=12 + + -1 + + + A mixed-case reserved-name collision. + + + + + + + i=297 + + + + CancellationToken + + i=12 + + -1 + + + A NodeState cancellation-token collision. + + + + + + + i=297 + + + + Context + + i=12 + + -1 + + + A generated-handler context collision. + + + + + + + i=297 + + + + ObjectId + + i=12 + + -1 + + + A generated-handler object identifier collision. + + + + + + + i=297 + + + + Method + + i=12 + + -1 + + + A generated-handler method collision. + + + + + + + i=297 + + + + InputArguments + + i=12 + + -1 + + + A generated input-collection collision. + + + + + + + i=297 + + + + Results + + i=12 + + -1 + + + A generated result-collection collision. + + + + + + + i=297 + + + + _result + + i=12 + + -1 + + + A NodeState result-local collision. + + + + + + + i=297 + + + + _foo + + i=12 + + -1 + + + A proxy output-local collision. + + + + + + + i=297 + + + + _ + + i=12 + + -1 + + + A single-underscore identifier. + + + + + + + i=297 + + + + Nameof + + i=12 + + -1 + + + A contextual operator identifier. + + + + + + + i=297 + + + + __arglist + + i=12 + + -1 + + + A special C# keyword identifier. + + + + + + + i=297 + + + + __makeref + + i=12 + + -1 + + + A special C# keyword identifier. + + + + + + + i=297 + + + + __reftype + + i=12 + + -1 + + + A special C# keyword identifier. + + + + + + + i=297 + + + + __refvalue + + i=12 + + -1 + + + A special C# keyword identifier. + + + + + + + + + + OutputArguments + + i=78 + i=68 + ns=1;i=1001 + + + + + + i=297 + + + + VersionId + + i=12 + + -1 + + + The effective version identifier. + + + + + + + i=297 + + + + class + + i=12 + + -1 + + + The keyword-colliding output. + + + + + + + i=297 + + + + Changed + + i=1 + + -1 + + + Whether the effective version changed. + + + + + + + i=297 + + + + OutputArguments + + i=12 + + -1 + + + A generated output-collection collision. + + + + + + + i=297 + + + + ServiceResult + + i=12 + + -1 + + + A generated result-member collision. + + + + + + + i=297 + + + + Quote"Name + + i=12 + + -1 + + + An authored name containing a quotation mark. + + + + + + + i=297 + + + + Back\Slash + + i=12 + + -1 + + + An authored name containing a backslash. + + + + + + + i=297 + + + + Line Break + + i=12 + + -1 + + + An authored name containing a newline. + + + + + + + i=297 + + + + Δelta雪 + + i=12 + + -1 + + + An authored name containing Unicode letters. + + + + + + + i=297 + + + + Foo + + i=12 + + -1 + + + An output whose local collides with input _foo. + + + + + + + i=297 + + + + RoundTripMethodStateResult + + i=12 + + -1 + + + An output matching its generated result type. + + + + + + + i=297 + + + + Next…Line + + i=12 + + -1 + + + An authored name containing next-line. + + + + + + + i=297 + + + + Line
Separator + + i=12 + + -1 + + + An authored name containing a line separator. + + + + + + + i=297 + + + + Paragraph
Separator + + i=12 + + -1 + + + An authored name containing a paragraph separator. + + + + + + + + + + RoundTrip + + i=78 + ns=1;i=1000 + + + + + LocalCollisionMethodType + + ns=1;i=1011 + ns=1;i=1012 + + + + + InputArguments + + i=78 + i=68 + ns=1;i=1010 + + + + + + i=297 + + + + _foo + + i=12 + + -1 + + + The underscore-prefixed input. + + + + + + + + + + OutputArguments + + i=78 + i=68 + ns=1;i=1010 + + + + + + i=297 + + + + Foo + + i=12 + + -1 + + + The output whose emitted local would be _foo. + + + + + + + + + + LocalCollision + + i=78 + ns=1;i=1000 + + + diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/SameNamespaceEncoding.NodeSet2.xml b/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/SameNamespaceEncoding.NodeSet2.xml new file mode 100644 index 0000000000..50ed0995d2 --- /dev/null +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Resources/SameNamespaceEncoding.NodeSet2.xml @@ -0,0 +1,59 @@ + + + + + http://test.org/UA/SameNamespaceEncoding/ + + + + + + + + i=38 + i=45 + i=40 + + + + MyDataType + + i=22 + ns=1;i=200 + ns=1;i=201 + + + + + + + + Default Binary + + i=76 + ns=1;i=100 + + + + + Default JSON + + i=76 + ns=1;i=100 + + + diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/ModelDesignExtensionsTests.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/ModelDesignExtensionsTests.cs index a33928a02b..4cdea2c826 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/ModelDesignExtensionsTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/ModelDesignExtensionsTests.cs @@ -29,6 +29,11 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; using System.Xml; using Moq; using NUnit.Framework; @@ -46,6 +51,207 @@ namespace Opc.Ua.Schema.Model.Tests [Parallelizable] public class ModelDesignExtensionsTests { + [Test] + public void AssignMethodArgumentCodeNamesAllocatesInputsBeforeOutputs() + { + var method = new MethodDesign + { + InputArguments = + [ + new Parameter { Name = "Foo" }, + new Parameter { Name = "foo" }, + new Parameter { Name = "Class" }, + new Parameter { Name = "VersionId" } + ], + OutputArguments = + [ + new Parameter { Name = "VersionId" }, + new Parameter { Name = "class" }, + new Parameter { Name = "Changed" } + ] + }; + + method.AssignMethodArgumentCodeNames(); + string[] firstInputs = + [.. method.InputArguments.Select(p => p.GetGeneratedCodeIdentifier())]; + string[] firstOutputs = + [.. method.OutputArguments.Select(p => p.GetGeneratedCodeIdentifier())]; + string[] expectedInputs = ["foo", "foo2", "@class", "versionId"]; + string[] expectedOutputs = ["versionIdOut", "classOut", "changed"]; + + method.AssignMethodArgumentCodeNames(); + + Assert.Multiple(() => + { + Assert.That(firstInputs, Is.EqualTo(expectedInputs)); + Assert.That(firstOutputs, Is.EqualTo(expectedOutputs)); + Assert.That( + method.InputArguments.Select(p => p.GetGeneratedCodeIdentifier()), + Is.EqualTo(firstInputs)); + Assert.That( + method.OutputArguments.Select(p => p.GetGeneratedCodeIdentifier()), + Is.EqualTo(firstOutputs)); + }); + } + + [Test] + public void AssignMethodArgumentCodeNamesUsesIndependentReservedScopes() + { + Parameter[] inputs = + [ + new Parameter { Name = "Await" }, + new Parameter { Name = "Ct" }, + new Parameter { Name = "cT" }, + new Parameter { Name = "CancellationToken" } + ]; + Parameter[] outputs = + [ + new Parameter { Name = "OutputArguments" }, + new Parameter { Name = "ServiceResult" } + ]; + var nodeStateScope = new MethodArgumentCodeNameScope( + "await", + "cancellationToken", + "outputArguments", + "serviceResult"); + var proxyScope = new MethodArgumentCodeNameScope( + "await", + "ct", + "outputArguments"); + + ModelDesignExtensions.AssignMethodArgumentCodeNames( + inputs, + outputs, + nodeStateScope); + string[] nodeStateInputs = + [.. inputs.Select(p => p.GetGeneratedCodeIdentifier(scope: nodeStateScope))]; + string[] nodeStateOutputs = + [.. outputs.Select(p => p.GetGeneratedCodeIdentifier(scope: nodeStateScope))]; + string[] expectedNodeStateInputs = + ["await2", "ct", "cT2", "cancellationToken2"]; + string[] expectedNodeStateOutputs = + ["outputArgumentsOut", "serviceResultOut"]; + string[] expectedProxyInputs = + ["await2", "ct2", "cT3", "cancellationToken"]; + string[] expectedProxyOutputs = + ["outputArgumentsOut", "serviceResult"]; + + ModelDesignExtensions.AssignMethodArgumentCodeNames( + inputs, + outputs, + proxyScope); + + Assert.Multiple(() => + { + Assert.That( + nodeStateInputs, + Is.EqualTo(expectedNodeStateInputs)); + Assert.That( + nodeStateOutputs, + Is.EqualTo(expectedNodeStateOutputs)); + Assert.That( + inputs.Select(p => p.GetGeneratedCodeIdentifier(scope: proxyScope)), + Is.EqualTo(expectedProxyInputs)); + Assert.That( + outputs.Select(p => p.GetGeneratedCodeIdentifier(scope: proxyScope)), + Is.EqualTo(expectedProxyOutputs)); + Assert.That( + inputs.Select(p => p.GetGeneratedCodeIdentifier(scope: nodeStateScope)), + Is.EqualTo(nodeStateInputs)); + Assert.That( + outputs.Select(p => p.GetGeneratedCodeIdentifier(scope: nodeStateScope)), + Is.EqualTo(nodeStateOutputs)); + }); + } + + [Test] + public void AssignMethodArgumentCodeNamesReservesEmittedAliasesAndAdditionalNames() + { + Parameter[] inputs = + [ + new Parameter { Name = "_result" }, + new Parameter { Name = "_foo" }, + new Parameter { Name = "_" }, + new Parameter { Name = "Nameof" } + ]; + Parameter[] outputs = + [ + new Parameter { Name = "Foo" }, + new Parameter { Name = "RoundTripMethodStateResult" } + ]; + var scope = new MethodArgumentCodeNameScope( + (identifier, output) => output ? + new[] { identifier, "_" + identifier.TrimStart('@') } : + new[] { identifier }, + "_", + "_result", + "nameof"); + string[] expectedInputs = ["_result2", "_foo", "_2", "nameof2"]; + string[] expectedOutputs = ["fooOut", "roundTripMethodStateResultOut"]; + + ModelDesignExtensions.AssignMethodArgumentCodeNames( + inputs, + outputs, + scope, + "RoundTripMethodStateResult"); + + Assert.Multiple(() => + { + Assert.That( + inputs.Select(p => p.GetGeneratedCodeIdentifier(scope: scope)), + Is.EqualTo(expectedInputs)); + Assert.That( + outputs.Select(p => p.GetGeneratedCodeIdentifier(scope: scope)), + Is.EqualTo(expectedOutputs)); + }); + } + + [Test] + public void GeneratedMethodArgumentNamesAreExternalToSerialization() + { + var method = new MethodDesign + { + InputArguments = + [ + new Parameter { Name = "Foo" }, + new Parameter { Name = "foo" } + ] + }; + method.AssignMethodArgumentCodeNames(); + Parameter parameter = method.InputArguments[1]; + Assert.That(parameter.GetGeneratedCodeIdentifier(), Is.EqualTo("foo2")); + + MemberInfo[] serializableMembers; +#pragma warning disable SYSLIB0050 // Validate the BinaryFormatter member contract without serializing. + serializableMembers = FormatterServices.GetSerializableMembers(typeof(Parameter)); +#pragma warning restore SYSLIB0050 + + var serializer = new DataContractSerializer(typeof(Parameter)); + using var stream = new MemoryStream(); + serializer.WriteObject(stream, parameter); + string serialized = Encoding.UTF8.GetString(stream.ToArray()); + + Assert.Multiple(() => + { + Assert.That( + typeof(Parameter).GetMember( + "GeneratedCodeName", + BindingFlags.Instance | + BindingFlags.Public | + BindingFlags.NonPublic), + Is.Empty); + Assert.That( + serializableMembers.Any( + member => member.Name.Contains( + "GeneratedCode", + StringComparison.Ordinal)), + Is.False); + Assert.That(serialized, Does.Not.Contain("GeneratedCode")); + Assert.That(serialized, Does.Contain("foo")); + Assert.That(serialized, Does.Not.Contain("foo2")); + }); + } + /// /// Tests that DetermineBasicDataType returns BaseDataType when dataType is null. /// diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/NodeSetToModelDesignTests.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/NodeSetToModelDesignTests.cs index 12a724ab77..16ec25ab46 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/NodeSetToModelDesignTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Schema/NodeSetToModelDesignTests.cs @@ -34,6 +34,7 @@ using System.Text; using Microsoft.Extensions.Logging; using NUnit.Framework; +using Opc.Ua.SourceGeneration; using Opc.Ua.Tests; namespace Opc.Ua.Schema.Model.Tests @@ -53,7 +54,11 @@ public class NodeSetToModelDesignTests { private const string OpcUaNamespaceUri = "http://opcfoundation.org/UA/"; private const string CrossModelNamespaceUri = "http://test.org/UA/CrossModel/Types"; + private const string SameNamedArgumentsNamespaceUri = + "http://test.org/UA/SameNamedMethodArguments/"; private const string NodeSetResource = "CrossModelTypes.NodeSet2.xml"; + private const string SameNamedArgumentsResource = + "SameNamedMethodArguments.NodeSet2.xml"; private const string DesignResource = "TestDataDesign.xml"; private VirtualFileSystem m_fileSystem; @@ -203,6 +208,87 @@ public void ImportWithoutBaseModelThrowsInvalidDataException() Assert.That(ex.Message, Does.Contain("WidgetType")); } + [Test] + public void ImportPreservesSameNamedInputAndOutputArgumentNames() + { + ITelemetryContext telemetry = CreateTelemetry(); + string path = ResourcePath(SameNamedArgumentsResource); + var nodesets = new NodesetFileCollection( + [(path, new NodesetFileOptions())], + [], + m_fileSystem, + telemetry); + List designFiles = nodesets.GetDesignFileListForModel( + SameNamedArgumentsNamespaceUri, + out _); + Assert.That(designFiles, Is.Not.Null); + + IFileSystem fileSystem = typeof(Generators).Assembly + .AsFileSystem("Opc.Ua.SourceGeneration.Design") + .WithFallback(m_fileSystem); + IModelDesign model = fileSystem.OpenModelDesign( + new DesignFileCollection { Targets = designFiles }, + [], + telemetry, + useAllowSubtypes: false); + MethodDesign method = model.GetNodeDesigns() + .OfType() + .Single(x => x.SymbolicName?.Name == "RoundTripMethodType"); + string[] expectedInputNames = + [ + "Foo", + "foo", + "Class", + "VersionId", + "Await", + "Ct", + "cT", + "CancellationToken", + "Context", + "ObjectId", + "Method", + "InputArguments", + "Results", + "_result", + "_foo", + "_", + "Nameof", + "__arglist", + "__makeref", + "__reftype", + "__refvalue" + ]; + string[] expectedOutputNames = + [ + "VersionId", + "class", + "Changed", + "OutputArguments", + "ServiceResult", + "Quote\"Name", + "Back\\Slash", + "Line\nBreak", + "Δelta雪", + "Foo", + "RoundTripMethodStateResult", + "Next\u0085Line", + "Line\u2028Separator", + "Paragraph\u2029Separator" + ]; + + Assert.Multiple(() => + { + Assert.That(method.InputArguments, Has.Length.EqualTo(expectedInputNames.Length)); + Assert.That( + method.InputArguments.Select(argument => argument.Name), + Is.EqualTo(expectedInputNames)); + Assert.That(method.OutputArguments, Has.Length.EqualTo(expectedOutputNames.Length)); + Assert.That( + method.OutputArguments.Select(argument => argument.Name), + Is.EqualTo(expectedOutputNames)); + }); + } + private static ITelemetryContext CreateTelemetry() { return NUnitTelemetryContext.Create(logLevel: LogLevel.Error); diff --git a/tests/Opc.Ua.SourceGeneration.Core.Tests/Shared/SourceGenerationUtilsTests.cs b/tests/Opc.Ua.SourceGeneration.Core.Tests/Shared/SourceGenerationUtilsTests.cs index 986f07e608..01f7ebac11 100644 --- a/tests/Opc.Ua.SourceGeneration.Core.Tests/Shared/SourceGenerationUtilsTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Core.Tests/Shared/SourceGenerationUtilsTests.cs @@ -43,6 +43,37 @@ namespace Opc.Ua.SourceGeneration.Shared.Tests [Parallelizable] public class SourceGenerationUtilsTests { + [TestCase("Foo", false, "foo")] + [TestCase("foo", false, "foo")] + [TestCase("Class", false, "@class")] + [TestCase("@class", false, "@class")] + [TestCase("some-value", false, "some_value")] + [TestCase("1 Value", false, "_1value")] + [TestCase("Class", true, "Class")] + [TestCase("__arglist", false, "@__arglist")] + [TestCase("__makeref", false, "@__makeref")] + [TestCase("__reftype", false, "@__reftype")] + [TestCase("__refvalue", false, "@__refvalue")] + public void ToCSharpIdentifierCanonicalizesAndEscapes( + string input, + bool upperCamelCase, + string expected) + { + Assert.That( + input.ToCSharpIdentifier(upperCamelCase), + Is.EqualTo(expected)); + } + + [Test] + public void AsStringLiteralEscapesUnicodeLineSeparators() + { + const string value = "Next\u0085Line\u2028Paragraph\u2029End"; + + Assert.That( + value.AsStringLiteral(), + Is.EqualTo("\"Next\\u0085Line\\u2028Paragraph\\u2029End\"")); + } + /// /// Tests that IsNull returns the expected result for various XmlQualifiedName inputs. /// diff --git a/tests/Opc.Ua.SourceGeneration.Tests/ModelGeneratorTests.cs b/tests/Opc.Ua.SourceGeneration.Tests/ModelGeneratorTests.cs index f105ded249..4db51bc993 100644 --- a/tests/Opc.Ua.SourceGeneration.Tests/ModelGeneratorTests.cs +++ b/tests/Opc.Ua.SourceGeneration.Tests/ModelGeneratorTests.cs @@ -30,6 +30,8 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; +using System.Globalization; +using System.IO; using System.Linq; using System.Text; using System.Xml.Linq; @@ -37,6 +39,8 @@ using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; namespace Opc.Ua.SourceGeneration { @@ -139,6 +143,531 @@ public void GenerateAndCompileDemoModelNodeSetsTest( Assert.That(generatorResult.GeneratedSources, Has.Length.EqualTo(19)); } + [Test] + public void GenerateAndCompileDemoModelWotNativeProjectionTest() + { + var generator = new ModelSourceGenerator(); + var host = new ModelSourceGeneratorHoist(generator); + CSharpCompilation compilation = OptimizationLevel.Release.CreateCompilation() + .AddCode( + new Dictionary().WithOpcUaGeneratedStack(), + LanguageVersion.CSharp13); + var options = DefaultWotOptions(); + + AdditionalText nodeSetText = EmbeddedText.From("DemoModel.NodeSet2.xml"); + using var nodeSetStream = new MemoryStream( + Encoding.UTF8.GetBytes(nodeSetText.GetText()!.ToString())); + UANodeSet nodeSet = UANodeSet.Read(nodeSetStream)!; + using WotDocument wot = WotNodeSetConverter.FromNodeSet(nodeSet); + Assert.That( + wot.TryGetEnvelope(out _), + Is.False, + "Source-generation equivalence shall be proved by uav:nodes, not the envelope."); + AdditionalText wotText = EmbeddedText.FromContent( + "DemoModel.tm.json", + Encoding.UTF8.GetString(wot.Utf8Json.ToArray())); + + GeneratorDriver driver = CSharpGeneratorDriver.Create(host) + .WithUpdatedParseOptions(new CSharpParseOptions() + .WithKind(SourceCodeKind.Regular) + .WithLanguageVersion(LanguageVersion.CSharp13)) + .AddAdditionalTexts( + [ + wotText, + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]) + .WithUpdatedAnalyzerConfigOptions(options); + + GeneratorRunResult generatorResult = GenerateAndCompile(driver, compilation); + Assert.That( + generatorResult.GeneratedSources.Any(source => + source.HintName.Contains("DemoModel", StringComparison.Ordinal)), + Is.True); + } + + [TestCase("DemoModel.tm.json")] + [TestCase("DemoModel.td.json")] + [TestCase("DemoModel.tm.jsonld")] + [TestCase("DemoModel.td.jsonld")] + public void RecognizesAllSupportedWotExtensionsTest(string fileName) + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + + GeneratorRunResult generatorResult = RunDemoModelGenerator( + LanguageVersion.CSharp13, + EmbeddedText.FromContent(fileName, wotJson), + DefaultWotOptions()); + + Assert.That( + generatorResult.GeneratedSources.Any(source => + source.HintName.StartsWith("DemoModel.", StringComparison.Ordinal)), + Is.True, + $"'{fileName}' should be recognized as a WoT model input"); + } + + [Test] + public void PlainJsonLdWithoutOptInIsNotConsumedAsModelInputTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + + // No opt-in metadata is set for the plain .jsonld file: it must be + // treated as arbitrary JSON-LD, not as a WoT model, so the whole + // run has nothing to generate (and reports no diagnostics), + // even though the content is itself a perfectly valid WoT + // envelope document. + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + DefaultWotOptions(), + [EmbeddedText.FromContent("DemoModel.jsonld", wotJson)]); + + Assert.That(diagnostics, Is.Empty); + Assert.That(runResult.Results[0].GeneratedSources, Is.Empty); + } + + [Test] + public void PlainJsonLdOptInIsConsumedAsModelInputTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + + AnalyzerOptionsProvider options = DefaultWotOptions(); + options.TextOptions["DemoModel.jsonld"] = new Dictionary + { + ["build_metadata.AdditionalFiles.ModelSourceGeneratorWot"] = "true" + }; + + GeneratorRunResult generatorResult = RunDemoModelGenerator( + LanguageVersion.CSharp13, + EmbeddedText.FromContent("DemoModel.jsonld", wotJson), + options); + + Assert.That( + generatorResult.GeneratedSources.Any(source => + source.HintName.StartsWith("DemoModel.", StringComparison.Ordinal)), + Is.True, + "a .jsonld file with ModelSourceGeneratorWot=true should be recognized as a WoT model input"); + } + + [Test] + public void IgnoredOptedInPlainJsonLdProducesNoDiagnosticsOrSourcesTest() + { + var options = DefaultWotOptions(); + options.TextOptions["Ignored.jsonld"] = new Dictionary + { + ["build_metadata.AdditionalFiles.ModelSourceGeneratorWot"] = "true", + ["build_metadata.AdditionalFiles.ModelSourceGeneratorIgnore"] = "true" + }; + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + options, + [EmbeddedText.FromContent("Ignored.jsonld", "{ invalid json")]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics, + Is.Empty, + "an ignored, explicitly opted-in .jsonld file must be excluded before parsing"); + Assert.That( + runResult.Results[0].GeneratedSources, + Is.Empty, + "an ignored, explicitly opted-in .jsonld file must emit no sources"); + } + + [Test] + public void NodeSetAndEnvelopeWotProduceEquivalentGeneratedOutputTest() + { + const LanguageVersion languageVersion = LanguageVersion.CSharp13; + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + + GeneratorRunResult nodeSetResult = RunDemoModelGenerator( + languageVersion, + EmbeddedText.FromContent("DemoModel.NodeSet2.xml", nodeSetXml), + DefaultWotOptions()); + GeneratorRunResult wotResult = RunDemoModelGenerator( + languageVersion, + EmbeddedText.FromContent("DemoModel.tm.json", BuildDemoModelWotEnvelopeJson(nodeSetXml)), + DefaultWotOptions()); + + string[] nodeSetHints = + [ + .. nodeSetResult.GeneratedSources + .Select(s => s.HintName) + .Where(h => h.StartsWith("DemoModel.", StringComparison.Ordinal)) + .OrderBy(h => h, StringComparer.Ordinal) + ]; + string[] wotHints = + [ + .. wotResult.GeneratedSources + .Select(s => s.HintName) + .Where(h => h.StartsWith("DemoModel.", StringComparison.Ordinal)) + .OrderBy(h => h, StringComparer.Ordinal) + ]; + Assert.That(nodeSetHints, Is.Not.Empty); + Assert.That( + wotHints, + Is.EqualTo(nodeSetHints), + "a WoT envelope input should generate the same set of hint names as the equivalent NodeSet2 input"); + + foreach (string hint in nodeSetHints) + { + string nodeSetSource = nodeSetResult.GeneratedSources + .Single(s => s.HintName == hint).SourceText.ToString(); + string wotSource = wotResult.GeneratedSources + .Single(s => s.HintName == hint).SourceText.ToString(); + Assert.That( + wotSource, + Is.EqualTo(nodeSetSource), + $"generated source for '{hint}' should be identical between the NodeSet2 and WoT-envelope inputs"); + } + } + + [Test] + public void MalformedWotJsonProducesDiagnosticWithoutGeneratorExceptionTest() + { + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + DefaultWotOptions(), + [ + EmbeddedText.FromContent("Malformed.tm.json", "{ this is not valid json"), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That( + runResult.Results[0].Exception, + Is.Null, + "a malformed WoT document must not crash the generator"); + Assert.That( + diagnostics.Any(d => d.Id == "MODELGEN030"), + Is.True, + "a malformed WoT document should produce a MODELGEN030 diagnostic"); + // The malformed WoT input must not abort generation for the rest + // of the compilation: DI does not depend on it and should still + // be generated. + Assert.That(runResult.Results[0].GeneratedSources, Is.Not.Empty); + } + + [Test] + public void IgnoredMalformedWotJsonProducesNoDiagnosticsOrSourcesTest() + { + var options = DefaultWotOptions(); + options.TextOptions["Malformed.tm.json"] = new Dictionary + { + ["build_metadata.AdditionalFiles.ModelSourceGeneratorIgnore"] = "true" + }; + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + options, + [EmbeddedText.FromContent("Malformed.tm.json", "{ this is not valid json")]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics, + Is.Empty, + "an ignored WoT file must be excluded before parsing and diagnostic forwarding"); + Assert.That( + runResult.Results[0].GeneratedSources, + Is.Empty, + "an ignored WoT file must emit no sources"); + } + + [Test] + public void WotDocumentWithoutEnvelopeNativeMappingOrRecognizedTypeProducesDiagnosticTest() + { + const string json = /*lang=json,strict*/ """{ "title": "NotARecognizedThing" }"""; + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + DefaultWotOptions(), + [ + EmbeddedText.FromContent("Unrecognized.td.json", json), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics.Any(d => + d.Id == "MODELGEN031" && + d.GetMessage(CultureInfo.InvariantCulture).Contains("WOT3001", StringComparison.Ordinal)), + Is.True, + "a document that is neither a recognized Thing Model/Description nor carries a " + + "preservation envelope or native mapping should report WotDiagnosticCode.NoConvertibleContent (WOT3001)"); + } + + [Test] + public void DigestMismatchedWotEnvelopeProducesDiagnosticWithoutGeneratorExceptionTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string tamperedJson = TamperEnvelopeDigestData( + BuildDemoModelWotEnvelopeJson(nodeSetXml, includeEnvelope: true)); + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + DefaultWotOptions(), + [ + EmbeddedText.FromContent("Tampered.tm.json", tamperedJson), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics.Any(d => + d.Id == "MODELGEN031" && + d.GetMessage(CultureInfo.InvariantCulture).Contains("WOT2006", StringComparison.Ordinal)), + Is.True, + "a tampered envelope digest should report WotDiagnosticCode.DigestMismatch (WOT2006)"); + } + + [Test] + public void ConversionErrorWithNonNullValueEmitsNoNodeSetEvenWhenDiagnosticSuppressedTest() + { + // A valid preservation envelope whose native projection carries a + // conflicting browse name: the envelope still restores a (non-null) + // NodeSet, but the native-consistency check reports an error. The + // wrapper must exclude this errored result so no generated model is + // emitted, independent of whether MODELGEN031 is later suppressed. + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string conflicted = TamperNativeProjectionBrowseName( + BuildDemoModelWotEnvelopeJson(nodeSetXml, includeEnvelope: true)); + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("Conflict.tm.json", conflicted), + new NodesetFileOptions(), + default); + + Assert.That( + outcome.Diagnostics.Any(d => + d.Id == "MODELGEN031" && + d.GetMessage(CultureInfo.InvariantCulture).Contains("WOT3000", StringComparison.Ordinal)), + Is.True, + "a native-projection conflict should be reported as a MODELGEN031 error " + + "(WotDiagnosticCode.NativeProjectionConflict / WOT3000)"); + Assert.That( + outcome.NodeSetText, + Is.Null, + "a conversion result with an error diagnostic must not yield a NodeSet even when a " + + "(partial) value was produced and the MODELGEN031 diagnostic could be suppressed"); + } + + [Test] + public void CollidingWotInputsProduceDiagnosticAndOnlyOneIsAcceptedTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + DefaultWotOptions(), + [ + EmbeddedText.FromContent("DemoModel.tm.json", wotJson), + EmbeddedText.FromContent("DemoModel.td.json", wotJson), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics.Any(d => d.Id == "MODELGEN034"), + Is.True, + "two WoT inputs synthesizing the same virtual NodeSet2 path should report MODELGEN034"); + Assert.That( + runResult.Results[0].GeneratedSources + .Count(s => s.HintName == "DemoModel.Constants.g.cs"), + Is.EqualTo(1), + "exactly one of the colliding inputs should be accepted, not zero or both"); + } + + [Test] + public void IgnoredWotInputDoesNotOwnCollisionPathAgainstActiveWotTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + var options = DefaultWotOptions(); + options.TextOptions["DemoModel.tm.json"] = new Dictionary + { + ["build_metadata.AdditionalFiles.ModelSourceGeneratorIgnore"] = "true" + }; + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + options, + [ + EmbeddedText.FromContent("DemoModel.tm.json", wotJson), + EmbeddedText.FromContent("DemoModel.td.json", wotJson), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics, + Is.Empty, + "an ignored WoT input must not reserve its synthesized NodeSet2 path"); + Assert.That( + runResult.Results[0].GeneratedSources + .Count(s => s.HintName == "DemoModel.Constants.g.cs"), + Is.EqualTo(1), + "the active WoT input should generate normally when its colliding peer is ignored"); + } + + [Test] + public void WotInputCollidingWithExplicitNodeSet2FileProducesDiagnosticTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + DefaultWotOptions(), + [ + EmbeddedText.FromContent("DemoModel.NodeSet2.xml", nodeSetXml), + EmbeddedText.FromContent("DemoModel.tm.json", wotJson), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics.Any(d => d.Id == "MODELGEN034"), + Is.True, + "a WoT input synthesizing the same path as an explicit NodeSet2 input should report MODELGEN034"); + Assert.That( + runResult.Results[0].GeneratedSources + .Count(s => s.HintName == "DemoModel.Constants.g.cs"), + Is.EqualTo(1), + "the explicit NodeSet2 input should win; the WoT input should be dropped, not duplicated"); + } + + [Test] + public void IgnoredWotInputDoesNotCollideWithActiveNodeSet2Test() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + var options = DefaultWotOptions(); + options.TextOptions["DemoModel.tm.json"] = new Dictionary + { + ["build_metadata.AdditionalFiles.ModelSourceGeneratorIgnore"] = "true" + }; + + (ImmutableArray diagnostics, GeneratorDriverRunResult runResult) = + RunGeneratorLeniently( + options, + [ + EmbeddedText.FromContent("DemoModel.tm.json", wotJson), + EmbeddedText.FromContent("DemoModel.NodeSet2.xml", nodeSetXml), + EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml") + ]); + + Assert.That(runResult.Results[0].Exception, Is.Null); + Assert.That( + diagnostics, + Is.Empty, + "an ignored WoT input must not report a collision with an active NodeSet2 input"); + Assert.That( + runResult.Results[0].GeneratedSources + .Count(s => s.HintName == "DemoModel.Constants.g.cs"), + Is.EqualTo(1), + "the active NodeSet2 input should generate normally when the colliding WoT input is ignored"); + } + + [Test] + public void WotInputPreservesAdditionalFilesOptionsTest() + { + string nodeSetXml = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + string wotJson = BuildDemoModelWotEnvelopeJson(nodeSetXml); + + AnalyzerOptionsProvider options = DefaultWotOptions(); + options.TextOptions["CustomWot.tm.json"] = new Dictionary + { + ["build_metadata.AdditionalFiles.ModelSourceGeneratorPrefix"] = "CustomWotPrefix", + ["build_metadata.AdditionalFiles.ModelSourceGeneratorName"] = "CustomWotName", + ["build_metadata.AdditionalFiles.ModelSourceGeneratorModelUri"] = + "urn:opcfoundation.org:2024-01:DemoModel", + ["build_metadata.AdditionalFiles.ModelSourceGeneratorVersion"] = "9.9.9" + }; + + // None of the options above throw or are rejected even though + // ModelUri/Version are set explicitly (matching, respectively + // overriding, the values already declared inside the WoT input's + // restored NodeSet2 element) — proving they are applied + // to the WoT-derived NodeSet2 file exactly as they would be to a + // NodeSet2/ModelDesign AdditionalFiles input. + GeneratorRunResult generatorResult = RunDemoModelGenerator( + LanguageVersion.CSharp13, + EmbeddedText.FromContent("CustomWot.tm.json", wotJson), + options); + + Assert.That( + generatorResult.GeneratedSources.Any(s => s.HintName == "CustomWotPrefix.Constants.g.cs"), + Is.True, + "the Prefix metadata from the WoT AdditionalFiles item should be honored " + + "after wrapping the WoT input as a NodeSet2 file"); + Assert.That( + generatorResult.GeneratedSources.Any(s => + s.HintName.StartsWith("DemoModel.", StringComparison.Ordinal)), + Is.False, + "the default DemoModel prefix should not be used once Prefix is overridden"); + } + + [Test] + public void IncrementalRerunChangesOutputForWotContentButNotForUnrelatedFilesTest() + { + var generator = new ModelSourceGenerator(); + var host = new ModelSourceGeneratorHoist(generator); + CSharpCompilation compilation = OptimizationLevel.Release.CreateCompilation() + .AddCode(new Dictionary().WithOpcUaGeneratedStack(), LanguageVersion.CSharp13); + AnalyzerOptionsProvider options = DefaultWotOptions(); + + string nodeSetXmlV1 = EmbeddedText.From("DemoModel.NodeSet2.xml").GetText()!.ToString(); + const string originalAttr = "BrowseName=\"1:Yellow\" ParentNodeId=\"ns=1;i=125\""; + const string renamedAttr = "BrowseName=\"1:YellowRenamedForIncrementalTest\" ParentNodeId=\"ns=1;i=125\""; + Assert.That(nodeSetXmlV1, Does.Contain(originalAttr)); + string nodeSetXmlV2 = nodeSetXmlV1.Replace(originalAttr, renamedAttr, StringComparison.Ordinal); + Assert.That(nodeSetXmlV2, Is.Not.EqualTo(nodeSetXmlV1)); + + AdditionalText wotV1 = EmbeddedText.FromContent( + "DemoModel.tm.json", BuildDemoModelWotEnvelopeJson(nodeSetXmlV1)); + AdditionalText wotV2 = EmbeddedText.FromContent( + "DemoModel.tm.json", BuildDemoModelWotEnvelopeJson(nodeSetXmlV2)); + AdditionalText unrelatedV1 = EmbeddedText.FromContent("Unrelated.csv", "NodeId,BrowseName\n"); + AdditionalText unrelatedV2 = EmbeddedText.FromContent("Unrelated.csv", "NodeId,BrowseName\n1,Foo\n"); + + GeneratorDriver driver = CSharpGeneratorDriver.Create(host) + .WithUpdatedParseOptions(new CSharpParseOptions() + .WithKind(SourceCodeKind.Regular) + .WithLanguageVersion(LanguageVersion.CSharp13)) + .AddAdditionalTexts([wotV1, EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml"), unrelatedV1]) + .WithUpdatedAnalyzerConfigOptions(options); + + driver = driver.RunGeneratorsAndUpdateCompilation( + compilation, out Compilation _, out ImmutableArray diagnostics1); + Assert.That(diagnostics1, Is.Empty); + string baseline = GetGeneratedSourcesText(driver.GetRunResult()); + + GeneratorDriver contentChangedDriver = driver + .RemoveAdditionalTexts([wotV1]) + .AddAdditionalTexts([wotV2]); + contentChangedDriver = contentChangedDriver.RunGeneratorsAndUpdateCompilation( + compilation, out Compilation _, out ImmutableArray diagnostics2); + Assert.That(diagnostics2, Is.Empty); + string afterContentChange = GetGeneratedSourcesText(contentChangedDriver.GetRunResult()); + Assert.That( + afterContentChange, + Is.Not.EqualTo(baseline), + "changing the WoT input content must change the generated output"); + + GeneratorDriver unrelatedChangedDriver = driver + .RemoveAdditionalTexts([unrelatedV1]) + .AddAdditionalTexts([unrelatedV2]); + unrelatedChangedDriver = unrelatedChangedDriver.RunGeneratorsAndUpdateCompilation( + compilation, out Compilation _, out ImmutableArray diagnostics3); + Assert.That(diagnostics3, Is.Empty); + string afterUnrelatedChange = GetGeneratedSourcesText(unrelatedChangedDriver.GetRunResult()); + Assert.That( + afterUnrelatedChange, + Is.EqualTo(baseline), + "changing an unrelated file must not change the WoT-derived generated output"); + } + [Theory] public void GenerateAndCompileIsa95JobControlNodeSet2Test( LanguageVersion languageVersion) @@ -537,7 +1066,7 @@ public partial class AmbiguousNodeManager Has.Length.EqualTo(1), "a selector-less binding must be reported once, not once per pass"); Assert.That( - unmatched[0].GetMessage(System.Globalization.CultureInfo.InvariantCulture), + unmatched[0].GetMessage(CultureInfo.InvariantCulture), Does.Contain("multiple models"), "the diagnostic should explain the ambiguity"); } @@ -602,6 +1131,156 @@ private static (ImmutableArray Diagnostics, GeneratorDriverRunResult return (diagnostics, driver.GetRunResult()); } + /// + /// Default per-file/global options shared by the WoT AdditionalFile + /// tests below. + /// + /// Event records are omitted because these tests compile the DI NodeSet + /// only as a model dependency. Its generated alarm event records are + /// C# record types that derive from the standard UA alarm + /// records, which the deliberately class-based generated-stack stub in + /// CompilerUtils does not provide. + /// + /// + private static AnalyzerOptionsProvider DefaultWotOptions() + { + return new AnalyzerOptionsProvider( + new Dictionary + { + ["build_property.ModelSourceGeneratorStartId"] = "1000", + ["build_property.ModelSourceGeneratorOmitFluentApi"] = "true", + ["build_property.ModelSourceGeneratorOmitEventRecords"] = "true" + }); + } + + /// + /// Converts a NodeSet2 XML document to a native-first WoT document. + /// Tests that exercise envelope integrity can request the explicit + /// byte-preserving uav:nodeSet archival mode. + /// + private static string BuildDemoModelWotEnvelopeJson( + string nodeSetXml, + string title = null, + bool includeEnvelope = false) + { + using var nodeSetStream = new MemoryStream(Encoding.UTF8.GetBytes(nodeSetXml)); + UANodeSet nodeSet = UANodeSet.Read(nodeSetStream)!; + using WotDocument wot = WotNodeSetConverter.FromNodeSet( + nodeSet, + title, + new WotNodeSetConverterOptions + { + PreservationMode = includeEnvelope + ? WotNodeSetPreservationMode.Always + : WotNodeSetPreservationMode.Never + }); + return Encoding.UTF8.GetString(wot.Utf8Json.ToArray()); + } + + /// + /// Flips one base64 character of the uav:nodeSet preservation + /// envelope's data value so the payload still decodes as valid + /// base64 but its SHA-256 digest no longer matches the recorded + /// sha256 value. + /// + private static string TamperEnvelopeDigestData(string envelopeJson) + { + const string marker = "\"data\": \""; + int index = envelopeJson.IndexOf(marker, StringComparison.Ordinal) + marker.Length; + char[] characters = envelopeJson.ToCharArray(); + characters[index] = characters[index] == 'A' ? 'B' : 'A'; + return new string(characters); + } + + /// + /// Rewrites the first browseName of the uav:nodes native + /// projection so it conflicts with the browse name carried by the + /// preservation envelope. The envelope still restores a valid NodeSet, but + /// the native-consistency check reports a + /// WotDiagnosticCode.NativeProjectionConflict error, producing a + /// conversion result with a non-null value and an error diagnostic. + /// + private static string TamperNativeProjectionBrowseName(string envelopeJson) + { + int nodesStart = envelopeJson.IndexOf("\"uav:nodes\"", StringComparison.Ordinal); + const string marker = "\"browseName\": \""; + int start = envelopeJson.IndexOf(marker, nodesStart, StringComparison.Ordinal); + int valueStart = start + marker.Length; + int valueEnd = envelopeJson.IndexOf('"', valueStart); + return new StringBuilder(envelopeJson.Length + 9) + .Append(envelopeJson, 0, valueEnd) + .Append("_MISMATCH") + .Append(envelopeJson, valueEnd, envelopeJson.Length - valueEnd) + .ToString(); + } + + /// + /// Runs the generator for a single model AdditionalText (plus its + /// dependency on the DI companion spec) and asserts a clean, + /// compiling run — for tests where the WoT input is expected to + /// succeed outright. + /// + private static GeneratorRunResult RunDemoModelGenerator( + LanguageVersion languageVersion, + AdditionalText modelText, + AnalyzerOptionsProvider options) + { + var generator = new ModelSourceGenerator(); + var host = new ModelSourceGeneratorHoist(generator); + CSharpCompilation compilation = OptimizationLevel.Release.CreateCompilation() + .AddCode(new Dictionary().WithOpcUaGeneratedStack(), languageVersion); + + GeneratorDriver driver = CSharpGeneratorDriver.Create(host) + .WithUpdatedParseOptions(new CSharpParseOptions() + .WithKind(SourceCodeKind.Regular) + .WithLanguageVersion(languageVersion)) + .AddAdditionalTexts([modelText, EmbeddedText.From("Opc.Ua.Di.NodeSet2.xml")]) + .WithUpdatedAnalyzerConfigOptions(options); + + return GenerateAndCompile(driver, compilation); + } + + /// + /// Runs the generator over the given AdditionalFiles without + /// asserting success — for tests that need to inspect diagnostics + /// produced by a malformed, unsupported or colliding WoT input. + /// + private static (ImmutableArray Diagnostics, GeneratorDriverRunResult RunResult) + RunGeneratorLeniently( + AnalyzerOptionsProvider options, + IEnumerable additionalTexts, + LanguageVersion languageVersion = LanguageVersion.CSharp13) + { + var generator = new ModelSourceGenerator(); + var host = new ModelSourceGeneratorHoist(generator); + CSharpCompilation compilation = OptimizationLevel.Release.CreateCompilation() + .AddCode(new Dictionary().WithOpcUaGeneratedStack(), languageVersion); + + GeneratorDriver driver = CSharpGeneratorDriver.Create(host) + .WithUpdatedParseOptions(new CSharpParseOptions() + .WithKind(SourceCodeKind.Regular) + .WithLanguageVersion(languageVersion)) + .AddAdditionalTexts([.. additionalTexts]) + .WithUpdatedAnalyzerConfigOptions(options); + + return driver.RunGeneratorsForDiagnostics(compilation); + } + + /// + /// Concatenates every generated source (ordered deterministically by + /// hint name) into a single comparable string, used by the + /// incremental re-run test to detect whether generated output + /// changed between runs. + /// + private static string GetGeneratedSourcesText(GeneratorDriverRunResult runResult) + { + return string.Join( + "\n----\n", + runResult.Results[0].GeneratedSources + .OrderBy(s => s.HintName, StringComparer.Ordinal) + .Select(s => s.HintName + ":\n" + s.SourceText)); + } + private static string ValidateXmlSchema( LanguageVersion languageVersion, GeneratorRunResult generatorResult) diff --git a/tests/Opc.Ua.SourceGeneration.Tests/WotNodeSetConversionFailureTests.cs b/tests/Opc.Ua.SourceGeneration.Tests/WotNodeSetConversionFailureTests.cs new file mode 100644 index 0000000000..139c6bc8bf --- /dev/null +++ b/tests/Opc.Ua.SourceGeneration.Tests/WotNodeSetConversionFailureTests.cs @@ -0,0 +1,341 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.SourceGeneration +{ + /// + /// Verifies the failure and diagnostic-projection paths of the WoT + /// AdditionalFile conversion wrapper. The wrapper is documented never to + /// throw (other than on cancellation), so every one of these inputs must + /// come back as a carrying a diagnostic + /// and no NodeSet. + /// + [TestFixture] + [Category("SourceGeneration")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + public class WotNodeSetConversionFailureTests + { + [Test] + public void ConvertUsesSynchronousConverterEntryPointForSelfContainedDocument() + { + const string json = """ + { + "@context": [ + "https://www.w3.org/2022/wot/td/v1.1", + { + "uav": "http://opcfoundation.org/UA/WoT-Binding/" + } + ], + "@type": [ + "tm:ThingModel", + "uav:objectType" + ], + "title": "SelfContained", + "uav:browseName": "nsu=urn:self-contained;SelfContained", + "uav:id": "nsu=urn:self-contained;s=SelfContained" + } + """; + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("SelfContained.tm.json", json), + new NodesetFileOptions(), + CancellationToken.None); + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult conversion = WotNodeSetConverter.ToNodeSetResult(document); + + string expectedXml = WriteNodeSet(conversion.Value!); + string actualXml = outcome.NodeSetText.GetText(CancellationToken.None)!.ToString(); + + Assert.That(outcome.Diagnostics, Is.Empty); + Assert.That(actualXml, Is.EqualTo(expectedXml)); + } + + [Test] + public void ConvertReportsParseErrorWhenSourceTextThrows() + { + var source = new ThrowingAdditionalText( + "Broken.tm.json", + new InvalidOperationException("the file could not be opened")); + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + source, + new NodesetFileOptions(), + CancellationToken.None); + + Assert.That(outcome.NodeSetText, Is.Null); + Assert.That(outcome.SourcePath, Is.EqualTo("Broken.tm.json")); + Diagnostic diagnostic = SingleDiagnostic(outcome, "MODELGEN030"); + Assert.That( + diagnostic.GetMessage(CultureInfo.InvariantCulture), + Does.Contain("the file could not be opened")); + } + + [Test] + public void ConvertPropagatesCancellationFromSourceText() + { + var source = new ThrowingAdditionalText( + "Cancelled.tm.json", + new OperationCanceledException()); + + Assert.That( + () => WotNodeSetAdditionalText.Convert( + source, + new NodesetFileOptions(), + CancellationToken.None), + Throws.InstanceOf()); + } + + [Test] + public void ConvertReportsParseErrorWhenSourceTextIsNull() + { + var source = new NullTextAdditionalText("Empty.tm.json"); + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + source, + new NodesetFileOptions(), + CancellationToken.None); + + Assert.That(outcome.NodeSetText, Is.Null); + Diagnostic diagnostic = SingleDiagnostic(outcome, "MODELGEN030"); + Assert.That( + diagnostic.GetMessage(CultureInfo.InvariantCulture), + Does.Contain("could not be read")); + } + + [Test] + public void ConvertReportsParseErrorForMalformedJson() + { + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("Malformed.tm.json", "{ \"title\": "), + new NodesetFileOptions(), + CancellationToken.None); + + Assert.That(outcome.NodeSetText, Is.Null); + Diagnostic diagnostic = SingleDiagnostic(outcome, "MODELGEN030"); + Assert.That(diagnostic.Location, Is.Not.EqualTo(Location.None)); + } + + [Test] + public void ConvertAnchorsMalformedJsonDiagnosticAtTheOffendingLine() + { + // The syntax error sits on the third line, so the reported location + // must not collapse to the start of the file. + const string json = "{\r\n \"title\": \"Demo\",\r\n \"base\": ,\r\n}"; + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("BadLine.tm.json", json), + new NodesetFileOptions(), + CancellationToken.None); + + Diagnostic diagnostic = SingleDiagnostic(outcome, "MODELGEN030"); + FileLinePositionSpan span = diagnostic.Location.GetLineSpan(); + Assert.That(span.Path, Is.EqualTo("BadLine.tm.json")); + Assert.That(span.StartLinePosition.Line, Is.GreaterThan(0)); + } + + [Test] + public void ConvertReportsParseErrorForEmptyDocument() + { + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("Empty.tm.json", string.Empty), + new NodesetFileOptions(), + CancellationToken.None); + + Assert.That(outcome.NodeSetText, Is.Null); + Assert.That(outcome.Diagnostics.Any(d => d.Id == "MODELGEN030"), Is.True); + } + + [Test] + public void ConvertReportsConversionErrorForJsonThatIsNotAWotDocument() + { + // Well-formed JSON that carries none of the required WoT members. + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("NotWot.tm.json", "{ \"unrelated\": 1 }"), + new NodesetFileOptions(), + CancellationToken.None); + + Assert.That(outcome.NodeSetText, Is.Null); + Assert.That( + outcome.Diagnostics.Any(d => d.Id is "MODELGEN030" or "MODELGEN031"), + Is.True, + "a document that is not a Thing Model or Thing Description must be rejected"); + } + + [Test] + public void ConvertPreservesTheSuppliedNodesetFileOptionsOnFailure() + { + var options = new NodesetFileOptions(); + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("Malformed.tm.json", "{"), + options, + CancellationToken.None); + + Assert.That(outcome.Options, Is.SameAs(options)); + Assert.That(outcome.NodeSetText, Is.Null); + } + + [Test] + public void ConvertProjectsConverterWarningsAsWarningDiagnostics() + { + // Source generation performs no I/O, so a tm:extends link can never + // be resolved and the converter reports an unresolved-reference + // warning that the wrapper must surface as MODELGEN032. + const string json = """ + { + "@context": "https://www.w3.org/2022/wot/td/v1.1", + "@type": "tm:ThingModel", + "title": "Derived", + "links": [ + { + "rel": "tm:extends", + "href": "https://example.test/unresolvable.tm.json", + "type": "application/tm+json" + } + ], + "properties": { + "value": { "type": "number" } + } + } + """; + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + EmbeddedText.FromContent("Derived.tm.json", json), + new NodesetFileOptions(), + CancellationToken.None); + + Assert.That( + outcome.Diagnostics.Any(d => d.Id is "MODELGEN031" or "MODELGEN032" or "MODELGEN033"), + Is.True, + "converter diagnostics must be projected onto the MODELGEN03x descriptors"); + foreach (Diagnostic diagnostic in outcome.Diagnostics) + { + Assert.That( + diagnostic.Location.GetLineSpan().Path, + Is.EqualTo("Derived.tm.json"), + "every projected diagnostic must be anchored at the WoT source file"); + } + } + + [Test] + public void ConvertAnchorsUnreadableSourceDiagnosticAtTheFileWithoutAPosition() + { + var source = new ThrowingAdditionalText( + "NoPosition.tm.json", + new InvalidOperationException("unreadable")); + + WotConversionOutcome outcome = WotNodeSetAdditionalText.Convert( + source, + new NodesetFileOptions(), + CancellationToken.None); + + Diagnostic diagnostic = SingleDiagnostic(outcome, "MODELGEN030"); + FileLinePositionSpan span = diagnostic.Location.GetLineSpan(); + Assert.That(span.Path, Is.EqualTo("NoPosition.tm.json")); + Assert.That(span.StartLinePosition.Line, Is.Zero); + Assert.That(span.StartLinePosition.Character, Is.Zero); + } + + private static Diagnostic SingleDiagnostic(WotConversionOutcome outcome, string id) + { + Diagnostic[] matches = outcome.Diagnostics.Where(d => d.Id == id).ToArray(); + Assert.That( + matches, + Has.Length.EqualTo(1), + $"expected exactly one {id} diagnostic but found " + + string.Join(", ", outcome.Diagnostics.Select(d => d.Id))); + return matches[0]; + } + + private static string WriteNodeSet(UANodeSet nodeSet) + { + using var stream = new MemoryStream(); + nodeSet.Write(stream); + string xml = Encoding.UTF8.GetString(stream.ToArray()); + if (xml.Length > 0 && xml[0] == '\uFEFF') + { + xml = xml[1..]; + } + return xml; + } + + /// + /// An AdditionalText whose content cannot be read. + /// + private sealed class ThrowingAdditionalText : AdditionalText + { + public ThrowingAdditionalText(string path, Exception exception) + { + Path = path; + m_exception = exception; + } + + public override string Path { get; } + + public override SourceText GetText(CancellationToken cancellationToken = default) + { + throw m_exception; + } + + private readonly Exception m_exception; + } + + /// + /// An AdditionalText that reports no content at all, which the Roslyn + /// contract permits when a file disappears between discovery and read. + /// + private sealed class NullTextAdditionalText : AdditionalText + { + public NullTextAdditionalText(string path) + { + Path = path; + } + + public override string Path { get; } + + public override SourceText GetText(CancellationToken cancellationToken = default) + { + return null; + } + } + } +} diff --git a/tests/Opc.Ua.Subscriptions.Tests/SessionPublishQueueConcurrencyTests.cs b/tests/Opc.Ua.Subscriptions.Tests/SessionPublishQueueConcurrencyTests.cs new file mode 100644 index 0000000000..5da528ff3e --- /dev/null +++ b/tests/Opc.Ua.Subscriptions.Tests/SessionPublishQueueConcurrencyTests.cs @@ -0,0 +1,267 @@ +/* ======================================================================== + * Copyright (c) 2005-2025 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using NUnit.Framework; +using Opc.Ua.Server; + +namespace Opc.Ua.Subscriptions.Tests +{ + /// + /// Covers queue races around publish, requeue, expiration and transfer claims. + /// + [TestFixture] + public class SessionPublishQueueConcurrencyTests + { + [Test] + public async Task ConcurrentPublishRequeueAndExpirationDoesNotDuplicateSubscriptionAsync() + { + SessionPublishQueue queue = CreateQueue(out Mock session); + Mock subscription = CreateSubscription(1, session.Object); + queue.Add(subscription.Object); + IReadOnlyList snapshot = queue.CapturePublishTimerSnapshot(); + + using var start = new Barrier(3); + using var cancellationTokenSource = new CancellationTokenSource(); + Task publishTask = Task.Run( + async () => + { + start.SignalAndWait(); + try + { + return await queue.PublishAsync( + "secure-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + cancellationTokenSource.Token) + .ConfigureAwait(false); + } + catch (OperationCanceledException) + { + return null; + } + catch (ServiceResultException exception) + when (exception.StatusCode == StatusCodes.BadNoSubscription) + { + return null; + } + }); + Task requeueTask = Task.Run( + () => + { + start.SignalAndWait(); + queue.Requeue(subscription.Object); + }); + Task expirationTask = Task.Run( + () => + { + start.SignalAndWait(); + return queue.TryRemoveForExpiration(snapshot[0]); + }); + + await Task.WhenAll(requeueTask, expirationTask).ConfigureAwait(false); + cancellationTokenSource.Cancel(); + ISubscription? publishedSubscription = await publishTask.ConfigureAwait(false); + + Assert.That( + publishedSubscription == null || ReferenceEquals(publishedSubscription, subscription.Object), + Is.True); + + if (queue.ContainsSubscription(subscription.Object)) + { + queue.Requeue(subscription.Object); + Task firstPublish = queue.PublishAsync( + "secure-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + CancellationToken.None); + Task secondPublish = queue.PublishAsync( + "secure-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + CancellationToken.None); + + // Status == RanToCompletion rather than Task.IsCompletedSuccessfully, + // which is .NET 5+ only and would break the net48/net472 builds. + Assert.That(firstPublish.Status, Is.EqualTo(TaskStatus.RanToCompletion)); + Assert.That(await firstPublish.ConfigureAwait(false), Is.SameAs(subscription.Object)); + Assert.That(secondPublish.Status, Is.Not.EqualTo(TaskStatus.RanToCompletion)); + + queue.Remove(subscription.Object, removeQueuedRequests: true); + } + else + { + Assert.That(await expirationTask.ConfigureAwait(false), Is.True); + } + } + + [Test] + public async Task TransferClaimProtectsClaimedEntryFromExpirationAndPreservesRequeueAsync() + { + SessionPublishQueue queue = CreateQueue(out Mock session); + Subscription subscription = CreateConcreteSubscription(2, session.Object); + queue.Add(subscription); + IReadOnlyList snapshot = queue.CapturePublishTimerSnapshot(); + + bool claimed = queue.TryClaimForTransfer( + subscription, + session.Object, + out SessionPublishQueue.SubscriptionTransferClaim? claim); + + Assert.That(claimed, Is.True); + Assert.That(claim, Is.Not.Null); + + using var start = new Barrier(3); + Task expirationTask = Task.Run( + () => + { + start.SignalAndWait(); + return queue.TryRemoveForExpiration(snapshot[0]); + }); + Task secondClaimTask = Task.Run( + () => + { + start.SignalAndWait(); + return queue.TryClaimForTransfer(subscription, session.Object, out _); + }); + Task requeueTask = Task.Run( + () => + { + start.SignalAndWait(); + queue.Requeue(subscription); + }); + + await Task.WhenAll(expirationTask, secondClaimTask, requeueTask).ConfigureAwait(false); + + Assert.That(await expirationTask.ConfigureAwait(false), Is.False); + Assert.That(await secondClaimTask.ConfigureAwait(false), Is.False); + Assert.That(queue.RestoreTransferClaim(claim!), Is.True); + + Task publishTask = queue.PublishAsync( + "secure-channel", + DateTime.MaxValue, + requeue: false, + parkSink: null, + CancellationToken.None); + + Assert.That(publishTask.Status, Is.EqualTo(TaskStatus.RanToCompletion)); + Assert.That(await publishTask.ConfigureAwait(false), Is.SameAs(subscription)); + } + + private static SessionPublishQueue CreateQueue(out Mock session) + { + return CreateQueue(out session, out _); + } + + private static SessionPublishQueue CreateQueue( + out Mock session, + out Mock server) + { + var telemetry = new TestTelemetryContext(); + server = new Mock(MockBehavior.Loose); + server.SetupGet(value => value.Telemetry).Returns(telemetry); + + session = new Mock(MockBehavior.Loose); + session.SetupGet(value => value.Id).Returns(new NodeId(Guid.NewGuid())); + session.SetupGet(value => value.Identity).Returns(new UserIdentity()); + session.SetupGet(value => value.IdentityToken).Returns(CreateIdentityToken().Object); + session.SetupGet(value => value.SessionDiagnostics).Returns( + new SessionDiagnosticsDataType + { + ClientDescription = new ApplicationDescription + { + ApplicationUri = "urn:test" + } + }); + session.Setup(value => value.IsSecureChannelValid(It.IsAny())).Returns(true); + + return new SessionPublishQueue(server.Object, session.Object, 10, TimeProvider.System); + } + + private static Mock CreateIdentityToken() + { + var identityToken = new Mock(MockBehavior.Loose); + identityToken.SetupGet(value => value.TokenType).Returns(UserTokenType.Anonymous); + identityToken.SetupGet(value => value.Token).Returns(new AnonymousIdentityToken()); + return identityToken; + } + + private static Mock CreateSubscription(uint id, ISession session) + { + var subscription = new Mock(MockBehavior.Loose); + subscription.SetupGet(value => value.Id).Returns(id); + subscription.SetupGet(value => value.Session).Returns(session); + subscription.SetupGet(value => value.SessionId).Returns(session.Id); + subscription.SetupGet(value => value.Priority).Returns(0); + return subscription; + } + + private static Subscription CreateConcreteSubscription(uint id, ISession session) + { + // RuntimeHelpers.GetUninitializedObject is .NET 5+ only; net48/net472 have the + // equivalent on FormatterServices, which is obsolete on modern targets. +#if NET5_0_OR_GREATER + var subscription = (Subscription)RuntimeHelpers.GetUninitializedObject(typeof(Subscription)); +#else + var subscription = (Subscription)System.Runtime.Serialization.FormatterServices + .GetUninitializedObject(typeof(Subscription)); +#endif + SetField(subscription, "m_lock", new Lock()); + SetField(subscription, "k__BackingField", id); + SetField(subscription, "k__BackingField", session); + SetField(subscription, "k__BackingField", (byte)0); + return subscription; + } + + private static void SetField(Subscription subscription, string fieldName, TValue value) + { + typeof(Subscription) + .GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic)! + .SetValue(subscription, value); + } + + private sealed class TestTelemetryContext : TelemetryContextBase + { + public TestTelemetryContext() + : base(NullLoggerFactory.Instance) + { + } + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/BuiltIn/ExtensionObjectTests.cs b/tests/Opc.Ua.Types.Tests/BuiltIn/ExtensionObjectTests.cs index dfe44125b9..e84f5450d5 100644 --- a/tests/Opc.Ua.Types.Tests/BuiltIn/ExtensionObjectTests.cs +++ b/tests/Opc.Ua.Types.Tests/BuiltIn/ExtensionObjectTests.cs @@ -28,7 +28,9 @@ * ======================================================================*/ using System; +using System.Text.Json; using NUnit.Framework; +using Opc.Ua.Tests; #pragma warning disable IDE0028 // Simplify collection initialization #pragma warning disable IDE0305 // Simplify collection initialization @@ -398,5 +400,141 @@ public void EqualsRejectsBodylessVersusBody() Assert.That(bodyless, Is.Not.EqualTo(withBody)); Assert.That(withBody, Is.Not.EqualTo(bodyless)); } + + [Test] + public void TryGetValueDecodesBinaryBodyWithContext() + { + IServiceMessageContext context = CreateMessageContext(); + var argument = new Argument(); + ExtensionObject extension = CreateBinaryArgument(context, "Binary", argument.BinaryEncodingId); + + bool success = extension.TryGetValue(out Argument actual, context); + + Assert.That(success, Is.True); + Assert.That(actual!.Name, Is.EqualTo("Binary")); + Assert.That(actual.DataType, Is.EqualTo(DataTypeIds.Double)); + } + + [Test] + public void TryGetValueDecodesXmlBodyWithContext() + { + IServiceMessageContext context = CreateMessageContext(); + ExtensionObject extension = CreateXmlArgument(context, "Xml"); + + bool success = extension.TryGetValue(out Argument actual, context); + + Assert.That(success, Is.True); + Assert.That(actual!.Name, Is.EqualTo("Xml")); + Assert.That(actual.DataType, Is.EqualTo(DataTypeIds.Double)); + } + + [Test] + public void TryGetValueDecodesJsonBodyWithContext() + { + IServiceMessageContext context = CreateMessageContext(); + ExtensionObject extension = CreateJsonArgument(context, "Json"); + + bool success = extension.TryGetValue(out Argument actual, context); + + Assert.That(success, Is.True); + Assert.That(actual!.Name, Is.EqualTo("Json")); + Assert.That(actual.DataType, Is.EqualTo(DataTypeIds.Double)); + } + + [Test] + public void TryGetValueReturnsFalseForRawBodyWithoutContext() + { + IServiceMessageContext context = CreateMessageContext(); + var argument = new Argument(); + ExtensionObject extension = CreateBinaryArgument(context, "Binary", argument.BinaryEncodingId); + + bool success = extension.TryGetValue(out Argument actual); + + Assert.That(success, Is.False); + Assert.That(actual, Is.Null); + } + + [Test] + public void TryGetValueReturnsFalseForUnknownType() + { + IServiceMessageContext context = CreateMessageContext(); + var argument = new Argument(); + ExtensionObject known = CreateBinaryArgument(context, "Unknown", argument.BinaryEncodingId); + Assert.That(known.TryGetAsBinary(out ByteString binary), Is.True); + var unknown = new ExtensionObject(new ExpandedNodeId(999_999u), binary); + + bool success = unknown.TryGetValue(out IEncodeable actual, context); + + Assert.That(success, Is.False); + Assert.That(actual, Is.Null); + } + + [Test] + public void TryGetValueMatchesDataTypeIdentifierForBinaryBody() + { + IServiceMessageContext context = CreateMessageContext(); + var argument = new Argument(); + ExtensionObject extension = CreateBinaryArgument(context, "DataType", argument.TypeId); + + bool success = extension.TryGetValue(out Argument actual, context); + + Assert.That(success, Is.True); + Assert.That(actual!.Name, Is.EqualTo("DataType")); + } + + [Test] + public void VariantTryGetStructureDelegatesToExtensionObjectDecoding() + { + IServiceMessageContext context = CreateMessageContext(); + var variant = new Variant(CreateJsonArgument(context, "Variant")); + + bool success = variant.TryGetStructure(context, out Argument actual); + + Assert.That(success, Is.True); + Assert.That(actual.Name, Is.EqualTo("Variant")); + } + + private static ServiceMessageContext CreateMessageContext() + { + return ServiceMessageContext.Create(NUnitTelemetryContext.Create()); + } + + private static Argument CreateArgument(string name) + { + return new Argument + { + Name = name, + DataType = DataTypeIds.Double, + ValueRank = ValueRanks.Scalar + }; + } + + private static ExtensionObject CreateBinaryArgument( + IServiceMessageContext context, + string name, + ExpandedNodeId typeId) + { + Argument argument = CreateArgument(name); + using var encoder = new BinaryEncoder(context); + argument.Encode(encoder); + return new ExtensionObject(typeId, ByteString.From(encoder.CloseAndReturnBuffer())); + } + + private static ExtensionObject CreateXmlArgument(IServiceMessageContext context, string name) + { + Argument argument = CreateArgument(name); + XmlElement body = EncodeableObject.EncodeXml(argument, context); + return new ExtensionObject(argument.XmlEncodingId, body); + } + + private static ExtensionObject CreateJsonArgument(IServiceMessageContext context, string name) + { + Argument argument = CreateArgument(name); + using var encoder = new JsonEncoder(context); + encoder.WriteEncodeable("UaBody", argument, argument.TypeId); + using JsonDocument document = JsonDocument.Parse(encoder.CloseAndReturnText()); + string body = document.RootElement.GetProperty("UaBody").GetRawText(); + return new ExtensionObject(argument.TypeId, body); + } } } diff --git a/tests/Opc.Ua.Types.Tests/BuiltIn/VariantCoverageTests.cs b/tests/Opc.Ua.Types.Tests/BuiltIn/VariantCoverageTests.cs index 1fd630a131..4911474544 100644 --- a/tests/Opc.Ua.Types.Tests/BuiltIn/VariantCoverageTests.cs +++ b/tests/Opc.Ua.Types.Tests/BuiltIn/VariantCoverageTests.cs @@ -30,6 +30,7 @@ using System; using System.Collections.Generic; using NUnit.Framework; +using Opc.Ua.Tests; namespace Opc.Ua.Types.Tests.BuiltIn { @@ -920,6 +921,147 @@ public void CollapseMixedTypesReturnsVariantArray() }); } + [Test] + public void TryGetStructureReturnsTypedBody() + { + IServiceMessageContext context = CreateMessageContext(); + var expected = new Argument + { + Name = "Temperature", + DataType = DataTypeIds.Double, + ValueRank = ValueRanks.Scalar + }; + var variant = new Variant(new ExtensionObject(expected)); + + bool success = variant.TryGetStructure(context, out Argument actual); + + Assert.That(success, Is.True); + Assert.That(actual, Is.SameAs(expected)); + } + + [Test] + public void TryGetStructureDecodesBinaryBody() + { + IServiceMessageContext context = CreateMessageContext(); + var variant = new Variant(CreateBinaryArgument(context, "Pressure")); + + bool success = variant.TryGetStructure(context, out Argument actual); + + Assert.That(success, Is.True); + Assert.That(actual.Name, Is.EqualTo("Pressure")); + Assert.That(actual.DataType, Is.EqualTo(DataTypeIds.Double)); + } + + [Test] + public void TryGetStructureRejectsMismatchedBody() + { + IServiceMessageContext context = CreateMessageContext(); + var variant = new Variant(new ExtensionObject(new BuildInfo + { + ProductName = "NotAnArgument" + })); + + bool success = variant.TryGetStructure(context, out Argument actual); + + Assert.That(success, Is.False); + Assert.That(actual, Is.Null); + } + + [Test] + public void TryGetStructureArrayDecodesEveryBinaryBody() + { + IServiceMessageContext context = CreateMessageContext(); + ArrayOf extensions = + [ + CreateBinaryArgument(context, "First"), + CreateBinaryArgument(context, "Second") + ]; + var variant = new Variant(extensions); + + bool success = variant.TryGetStructure(context, out ArrayOf actual); + + Assert.That(success, Is.True); + Assert.That(actual, Has.Count.EqualTo(2)); + Assert.That(actual[0].Name, Is.EqualTo("First")); + Assert.That(actual[1].Name, Is.EqualTo("Second")); + } + + [Test] + public void TryGetStructureArrayRejectsMismatchedElement() + { + IServiceMessageContext context = CreateMessageContext(); + ArrayOf extensions = + [ + CreateBinaryArgument(context, "First"), + new ExtensionObject(new BuildInfo { ProductName = "NotAnArgument" }) + ]; + var variant = new Variant(extensions); + + bool success = variant.TryGetStructure(context, out ArrayOf actual); + + Assert.That(success, Is.False); + Assert.That(actual, Is.Empty); + } + + [Test] + public void TryGetStructureRequiresMessageContext() + { + var scalar = new Variant(new ExtensionObject(new Argument())); + var array = new Variant(ArrayOf.Wrapped(new ExtensionObject(new Argument()))); + + Assert.That( + () => scalar.TryGetStructure(null!, out Argument scalarValue), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("context")); + Assert.That( + () => array.TryGetStructure(null!, out ArrayOf arrayValue), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("context")); + } + + [Test] + public void TryGetStructureArrayReturnsFalseWhenVariantHoldsNoArray() + { + IServiceMessageContext context = CreateMessageContext(); + var variant = new Variant(42); + + bool success = variant.TryGetStructure(context, out ArrayOf actual); + + Assert.That(success, Is.False); + Assert.That(actual.IsNull, Is.True); + } + + [Test] + public void TryGetStructureArrayReturnsFalseWhenVariantHoldsStringArray() + { + IServiceMessageContext context = CreateMessageContext(); + var variant = new Variant(ArrayOf.Wrapped("a", "b")); + + bool success = variant.TryGetStructure(context, out ArrayOf actual); + + Assert.That(success, Is.False); + Assert.That(actual.IsNull, Is.True); + } + + private static ServiceMessageContext CreateMessageContext() + { + return ServiceMessageContext.Create(NUnitTelemetryContext.Create()); + } + + private static ExtensionObject CreateBinaryArgument( + IServiceMessageContext context, + string name) + { + var argument = new Argument + { + Name = name, + DataType = DataTypeIds.Double, + ValueRank = ValueRanks.Scalar + }; + using var encoder = new BinaryEncoder(context); + argument.Encode(encoder); + byte[] buffer = encoder.CloseAndReturnBuffer(); + return new ExtensionObject(argument.BinaryEncodingId, ByteString.From(buffer)); + } + private static IEnumerable EqualsObjectCases { get diff --git a/tests/Opc.Ua.Types.Tests/Nodes/TypeTableTests.cs b/tests/Opc.Ua.Types.Tests/Nodes/TypeTableTests.cs index 435228d203..876cda236f 100644 --- a/tests/Opc.Ua.Types.Tests/Nodes/TypeTableTests.cs +++ b/tests/Opc.Ua.Types.Tests/Nodes/TypeTableTests.cs @@ -696,6 +696,53 @@ public void IsEncodingForExtensionObjectReturnsTrueWhenEncodingMatches() Assert.That(m_typeTable.IsEncodingFor(s_dataTypeId, ext), Is.True); } + [Test] + public void IsEncodingForExtensionObjectReturnsTrueWhenDataTypeMatches() + { + var ext = new ExtensionObject(new ExpandedNodeId(s_dataTypeId)); + + Assert.That(m_typeTable.IsEncodingFor(s_dataTypeId, ext), Is.True); + } + + [Test] + public void IsTypeOfResolvesEquivalentAbsoluteAndLocalIds() + { + const string namespaceUri = "urn:types:test"; + ushort namespaceIndex = m_namespaceTable.GetIndexOrAppend(namespaceUri); + var localTypeId = new NodeId(4000u, namespaceIndex); + m_typeTable.AddSubtype(localTypeId, NodeId.Null); + var absoluteTypeId = NodeId.ToExpandedNodeId( + localTypeId, + m_namespaceTable); + + Assert.That(m_typeTable.IsTypeOf(absoluteTypeId, localTypeId), Is.True); + } + + [Test] + public void IsInstanceOfDataTypeAcceptsKnownExtensionObjectTypeId() + { + m_typeTable.AddSubtype(Ua.DataTypeIds.Structure, NodeId.Null); + m_typeTable.AddSubtype(s_dataTypeId, Ua.DataTypeIds.Structure); + var extension = new ExtensionObject( + new ExpandedNodeId(s_dataTypeId), + ByteString.From([1, 2, 3])); + var value = new Variant(extension); + NodeId actualDataTypeId = value.TypeInfo.GetDataTypeId( + value, + m_namespaceTable, + m_typeTable); + + var typeInfo = TypeInfo.IsInstanceOfDataType( + value, + s_dataTypeId, + ValueRanks.Scalar, + m_namespaceTable, + m_typeTable); + + Assert.That(actualDataTypeId, Is.EqualTo(s_dataTypeId)); + Assert.That(typeInfo.IsUnknown, Is.False); + } + [Test] public void IsEncodingForExtensionObjectReturnsFalseWhenEncodingDoesNotMatch() { diff --git a/tests/Opc.Ua.Types.Tests/Wot/NodeSetComparerAdditionalTests.cs b/tests/Opc.Ua.Types.Tests/Wot/NodeSetComparerAdditionalTests.cs new file mode 100644 index 0000000000..6e9cc6bb0e --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/NodeSetComparerAdditionalTests.cs @@ -0,0 +1,182 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Additional tests for NodeSetComparer covering difference-reporting, + /// guards, and roundtrip-with-envelope paths. + /// + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class NodeSetComparerAdditionalTests + { + [Test] + public void DifferenceDescriptionContainsPositionInfo() + { + UANodeSet original = WotTestData.CreateReconstructableNodeSet(); + UANodeSet modified = WotTestData.CreateReconstructableNodeSet(); + modified.Items!.OfType().First().BrowseName = "1:Changed"; + + NodeSetComparisonResult result = NodeSetComparer.Compare(original, modified); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That(result.Differences, Is.Not.Empty); + Assert.That(result.Differences[0], Does.Contain("position")); + } + + [Test] + public void NodeAddedToRightIsDetected() + { + UANodeSet original = WotTestData.CreateReconstructableNodeSet(); + UANodeSet modified = WotTestData.CreateReconstructableNodeSet(); + var extraItems = modified.Items!.ToList(); + extraItems.Add(new UAObjectType { NodeId = "ns=1;i=9999", BrowseName = "1:ExtraType" }); + modified.Items = [.. extraItems]; + + NodeSetComparisonResult result = NodeSetComparer.Compare(original, modified); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That(result.Differences, Is.Not.Empty); + } + + [Test] + public void NodeRemovedFromRightIsDetected() + { + UANodeSet original = WotTestData.CreateReconstructableNodeSet(); + UANodeSet modified = WotTestData.CreateReconstructableNodeSet(); + + // Remove the last node from the right side. + if (modified.Items is { Length: > 1 }) + { + modified.Items = modified.Items.Take(modified.Items.Length - 1).ToArray(); + } + + NodeSetComparisonResult result = NodeSetComparer.Compare(original, modified); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That(result.Differences, Is.Not.Empty); + } + + [Test] + public void CompareNullLeftThrows() + { + UANodeSet right = WotTestData.CreateReconstructableNodeSet(); + + Assert.That( + () => NodeSetComparer.Compare(null!, right), + Throws.TypeOf()); + } + + [Test] + public void CompareNullRightThrows() + { + UANodeSet left = WotTestData.CreateReconstructableNodeSet(); + + Assert.That( + () => NodeSetComparer.Compare(left, null!), + Throws.TypeOf()); + } + + [Test] + public void CompareXmlDifferentLeftSpanReportsDifference() + { + byte[] right = WotTestData.Serialize(WotTestData.CreateReconstructableNodeSet()); + byte[] left = System.Text.Encoding.UTF8.GetBytes(""); + + NodeSetComparisonResult result = NodeSetComparer.CompareXml(left.AsSpan(), right.AsSpan()); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That(result.Differences, Is.Not.Empty); + } + + [Test] + public void CompareXmlDifferentRightSpanReportsDifference() + { + byte[] left = WotTestData.Serialize(WotTestData.CreateReconstructableNodeSet()); + byte[] right = System.Text.Encoding.UTF8.GetBytes(""); + + NodeSetComparisonResult result = NodeSetComparer.CompareXml(left.AsSpan(), right.AsSpan()); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That(result.Differences, Is.Not.Empty); + } + + [Test] + public void RoundtripNullSourceThrows() + { + Assert.That( + () => NodeSetComparer.Roundtrip(null!), + Throws.TypeOf()); + } + + [Test] + public void RoundtripWithAlwaysPreserveFlagsEnvelopePreserved() + { + var options = new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Always + }; + + NodeSetRoundtripReport report = NodeSetComparer.Roundtrip( + WotTestData.CreateReconstructableNodeSet(), + options); + + Assert.That(report.UsedPreservationEnvelope, Is.True); + Assert.That(report.EnvelopePreserved, Is.True); + Assert.That(report.Comparison.AreEquivalent, Is.True); + } + + [Test] + public void CompareXmlHandlesBomPrefixedDocumentCorrectly() + { + byte[] serialized = WotTestData.Serialize(WotTestData.CreateReconstructableNodeSet()); + + // Strip any existing UTF-8 BOM so that the manually-prepended BOM + // is the only one and StripPreamble removes exactly it. + byte[] xmlOnly = serialized.Length >= 3 + && serialized[0] == 0xEF && serialized[1] == 0xBB && serialized[2] == 0xBF + ? serialized.Skip(3).ToArray() + : serialized; + byte[] withBom = [0xEF, 0xBB, 0xBF, .. xmlOnly]; + + NodeSetComparisonResult result = NodeSetComparer.CompareXml(xmlOnly, withBom); + + Assert.That(result.AreEquivalent, Is.True); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/NodeSetComparerTests.cs b/tests/Opc.Ua.Types.Tests/Wot/NodeSetComparerTests.cs new file mode 100644 index 0000000000..144d5ef501 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/NodeSetComparerTests.cs @@ -0,0 +1,169 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using System.Text; +using System.Xml; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class NodeSetComparerTests + { + [Test] + public void IdenticalNodeSetsAreEquivalent() + { + NodeSetComparisonResult result = NodeSetComparer.Compare( + WotTestData.CreateReconstructableNodeSet(), + WotTestData.CreateReconstructableNodeSet()); + + Assert.That(result.AreEquivalent, Is.True); + Assert.That(result.Differences, Is.Empty); + } + + [Test] + public void SemanticChangeIsDetected() + { + UANodeSet modified = WotTestData.CreateReconstructableNodeSet(); + modified.Items!.OfType().Single().BrowseName = "1:Changed"; + + NodeSetComparisonResult result = NodeSetComparer.Compare( + WotTestData.CreateReconstructableNodeSet(), + modified); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That(result.Differences, Is.Not.Empty); + } + + [Test] + public void FormattingDifferencesAreNormalized() + { + byte[] indented = WotTestData.Serialize(WotTestData.CreateReconstructableNodeSet()); + + var document = new XmlDocument { XmlResolver = null }; + var settings = new XmlReaderSettings + { + DtdProcessing = DtdProcessing.Prohibit, + XmlResolver = null + }; + using (var stream = new System.IO.MemoryStream(indented)) + using (var reader = XmlReader.Create(stream, settings)) + { + document.Load(reader); + } + byte[] compact = Encoding.UTF8.GetBytes(document.OuterXml); + + NodeSetComparisonResult result = NodeSetComparer.CompareXml(indented.AsSpan(), compact.AsSpan()); + + Assert.That(result.AreEquivalent, Is.True); + } + + [Test] + public void CompareXmlAcceptsReadOnlySpanSlices() + { + byte[] xml = CreateNestedXml(2); + byte[] paddedLeft = [0, .. xml, 0]; + byte[] paddedRight = [1, .. xml, 1]; + + NodeSetComparisonResult result = NodeSetComparer.CompareXml( + paddedLeft.AsSpan(1, xml.Length), + paddedRight.AsSpan(1, xml.Length)); + + Assert.That(result.AreEquivalent, Is.True); + } + + [Test] + public void MaxXmlDepthAllowsDocumentAtConfiguredLimit() + { + byte[] xml = CreateNestedXml(4); + var options = new WotNodeSetConverterOptions + { + MaxXmlDepth = 4 + }; + + NodeSetComparisonResult result = NodeSetComparer.CompareXml(xml, xml, options); + + Assert.That(result.AreEquivalent, Is.True); + Assert.That(result.Differences, Is.Empty); + } + + [Test] + public void MaxXmlDepthRejectsDocumentPastConfiguredLimit() + { + byte[] xml = CreateNestedXml(5); + var options = new WotNodeSetConverterOptions + { + MaxXmlDepth = 4 + }; + + NodeSetComparisonResult result = NodeSetComparer.CompareXml(xml, xml, options); + + Assert.That(result.AreEquivalent, Is.False); + Assert.That( + result.Differences, + Has.Some.Contains("NodeSet XML exceeds the configured maximum depth of 4.")); + } + + [Test] + public void RoundtripReportConfirmsNativePreservationWithoutEnvelope() + { + NodeSetRoundtripReport report = NodeSetComparer.Roundtrip( + WotTestData.CreateRichNodeSet()); + + Assert.That(report.NativeProjectionPreserved, Is.True); + Assert.That(report.UsedPreservationEnvelope, Is.False); + Assert.That(report.EnvelopePreserved, Is.False); + Assert.That(report.Comparison.AreEquivalent, Is.True); + Assert.That( + report.Diagnostics.Any(d => d.Severity == WotDiagnosticSeverity.Error), + Is.False); + } + + private static byte[] CreateNestedXml(int depth) + { + var builder = new StringBuilder(); + for (int ii = 0; ii < depth; ii++) + { + builder.Append("'); + } + for (int ii = depth - 1; ii >= 0; ii--) + { + builder.Append("'); + } + return Encoding.UTF8.GetBytes(builder.ToString()); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotBindingReviewTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotBindingReviewTests.cs new file mode 100644 index 0000000000..e59484a096 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotBindingReviewTests.cs @@ -0,0 +1,682 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Covers the OPC UA WoT Binding review revisions: the uav:eventType + /// annotation, portable ExpandedNodeId identity, and HasComponent-subtype + /// typed reference links. + /// + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotBindingReviewTests + { + private const string Context = + "\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}],"; + + private static readonly string[] s_orderedStageIds = + [ + "nsu=urn:demo:pump;i=2001", + "nsu=urn:demo:pump;i=2002" + ]; + + private static readonly string[] s_portableBrowseNameNamespaces = + [ + "urn:opcua:wot:synthesized", + "urn:demo:pump", + "urn:demo:measurement" + ]; + + // ---- uav:eventType (Section 5.2) ----------------------------------- + + [Test] + public void EventAffordanceEmitsEventTypeAnnotationAndIsEvent() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet(WotTestData.CreateRichNodeSet()); + + JsonElement overTemp = document.Events["OverTemperatureEventType"]; + Assert.That(overTemp.GetProperty("@type").GetString(), Is.EqualTo("uav:eventType")); + Assert.That(overTemp.GetProperty("uav:isEvent").GetBoolean(), Is.True); + } + + [Test] + public void EventTypeRootProjectsEventTypeAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:demo:events"], + Models = [new ModelTableEntry { ModelUri = "urn:demo:events" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1002", + BrowseName = "1:OverTemperatureEventType", + DisplayName = [new Export.LocalizedText { Value = "OverTemperatureEventType" }], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=2041" } + ] + } + ] + }; + + using WotDocument document = WotNodeSetConverter.FromNodeSet(nodeSet); + + string[] types = document.TypeTokens.ToArray(); + Assert.That(types, Does.Contain("uav:eventType")); + Assert.That(types, Does.Not.Contain("uav:objectType")); + Assert.That( + document.RootElement.GetProperty("uav:isEvent").GetBoolean(), Is.True); + } + + [Test] + public void EventTypeAnnotatedThingModelSynthesizesBaseEventTypeSubtype() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:eventType\"]," + + "\"title\":\"OverTemperatureEventType\"," + + "\"uav:browseName\":\"1:OverTemperatureEventType\"," + + "\"uav:isEvent\":true}"; + + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + + UAObjectType root = nodeSet.Items!.OfType().Single(); + Assert.That( + root.References!.Any(r => + r.ReferenceType == "HasSubtype" && !r.IsForward && r.Value == "i=2041"), + Is.True, + "An event-type Thing Model must derive from BaseEventType (i=2041)."); + } + + [Test] + public void ContradictoryEventTypeAndIsEventFalseIsRejected() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"events\":{\"overTemp\":{\"@type\":\"uav:eventType\"," + + "\"uav:isEvent\":false,\"uav:browseName\":\"1:OverTemp\"}}}"; + + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.EventAnnotationConflict), + Is.True); + Assert.That(result.HasErrors, Is.True); + } + + // ---- Portable identity (Section 5.1.1) ----------------------------- + + [Test] + public void ForwardIdentityTermsArePortableExpandedNodeIds() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet(WotTestData.CreateRichNodeSet()); + + Assert.That( + document.RootElement.GetProperty("uav:id").GetString(), + Is.EqualTo("nsu=urn:test:model;i=1001")); + Assert.That( + document.Properties["Speed"].GetProperty("uav:id").GetString(), + Is.EqualTo("nsu=urn:test:model;i=6001")); + Assert.That( + document.Events["OverTemperatureEventType"].GetProperty("uav:id").GetString(), + Is.EqualTo("nsu=urn:test:model;i=1002")); + + // No emitted WoT-native identity uses the session-local ns= form. + string text = Encoding.UTF8.GetString(document.Utf8Json.ToArray()); + int nativeProjection = text.IndexOf( + "\"uav:nodes\"", + System.StringComparison.Ordinal); + string readable = nativeProjection < 0 + ? text + : text.Substring(0, nativeProjection); + Assert.That(readable, Does.Not.Contain("\"ns=1;")); + } + + [Test] + public void NamespaceZeroIdentityKeepsCanonicalForm() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:demo:x"], + Models = [new ModelTableEntry { ModelUri = "urn:demo:x" }], + Items = + [ + new UAObjectType + { + // A namespace-0 NodeId keeps its canonical i= form. + NodeId = "i=1500", + BrowseName = "1:CanonicalType", + DisplayName = [new Export.LocalizedText { Value = "CanonicalType" }], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=58" } + ] + } + ] + }; + + using WotDocument document = WotNodeSetConverter.FromNodeSet(nodeSet); + + Assert.That( + document.RootElement.GetProperty("uav:id").GetString(), Is.EqualTo("i=1500")); + } + + [Test] + public void ForwardBrowseNamesUsePortableQualifiedNameSyntax() + { + using WotDocument document = + WotNodeSetConverter.FromNodeSet(WotTestData.CreateRichNodeSet()); + + Assert.That( + document.RootElement.GetProperty("uav:browseName").GetString(), + Is.EqualTo("ns1:MachineType")); + Assert.That( + document.Properties["Speed"].GetProperty("uav:browseName").GetString(), + Is.EqualTo("ns1:Speed")); + } + + [Test] + public void ContextQualifiedBrowseNamesMapToNodeSetNamespaceIndexes() + { + const string json = + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"pump\":\"urn:demo:pump\"," + + "\"measurement\":\"urn:demo:measurement\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\"," + + "\"uav:browseName\":\"pump:PumpType\"," + + "\"properties\":{\"speed\":{" + + "\"uav:browseName\":\"measurement:Speed\"," + + "\"type\":\"number\"}}}"; + + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + + Assert.That( + nodeSet.NamespaceUris, + Is.EqualTo(s_portableBrowseNameNamespaces)); + Assert.That( + nodeSet.Items!.OfType().Single().BrowseName, + Is.EqualTo("2:PumpType")); + Assert.That( + nodeSet.Items!.OfType().Single().BrowseName, + Is.EqualTo("3:Speed")); + } + + [Test] + public void NumericReadableBrowseNameIsDiagnosed() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"}"; + + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = + WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.NonPortableQualifiedName), + Is.True); + } + + [Test] + public void PortableIdentityIsStableAcrossNamespaceTableReordering() + { + using WotDocument first = WotNodeSetConverter.FromNodeSet( + CreateReorderableNodeSet(["urn:demo:a", "urn:demo:b"], aIndex: 1)); + using WotDocument second = WotNodeSetConverter.FromNodeSet( + CreateReorderableNodeSet(["urn:demo:b", "urn:demo:a"], aIndex: 2)); + + // The same URI-anchored identity survives the namespace-table swap, + // even though the raw NodeSet NodeIds used different indices. + Assert.That( + first.RootElement.GetProperty("uav:id").GetString(), + Is.EqualTo("nsu=urn:demo:a;i=1001")); + Assert.That( + second.RootElement.GetProperty("uav:id").GetString(), + Is.EqualTo(first.RootElement.GetProperty("uav:id").GetString())); + Assert.That( + second.Properties["Speed"].GetProperty("uav:id").GetString(), + Is.EqualTo(first.Properties["Speed"].GetProperty("uav:id").GetString())); + } + + [Test] + public void SynthesisDiagnosesSessionLocalNsIndexInPortableField() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"uav:id\":\"ns=1;i=1001\"}"; + + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NonPortableIdentity), + Is.True); + // A non-portable identity is diagnosed, not fatal: conversion still succeeds. + Assert.That(result.Value, Is.Not.Null); + } + + // ---- HasComponent subtypes (Section 5.3) --------------------------- + + [Test] + public void HasComponentSubtypeEmitsDiscoveryAndReferenceTypeRelation() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet(CreateOrderedComponentNodeSet()); + + string[] children = document.RootElement.GetProperty("uav:hasComponent") + .EnumerateArray().Select(e => e.GetString()!).ToArray(); + Assert.That(children, Is.EquivalentTo(s_orderedStageIds)); + + JsonElement links = document.RootElement.GetProperty("links"); + Assert.That(links.GetArrayLength(), Is.EqualTo(2)); + foreach (JsonElement link in links.EnumerateArray()) + { + Assert.That( + link.GetProperty("rel").GetString(), + Is.EqualTo("ua:HasOrderedComponent")); + Assert.That(link.GetProperty("uav:refId").GetString(), Is.EqualTo("i=49")); + Assert.That(link.GetProperty("href").GetString(), Does.StartWith("nsu=urn:demo:pump;")); + Assert.That(link.GetProperty("uav:refName").GetString(), Does.StartWith("Stage_")); + } + } + + [Test] + public void ReferenceTypeRelationPinnedComponentRecreatesExactSubtype() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"uav:hasComponent\":[\"nsu=urn:demo:pump;i=2001\"]," + + "\"links\":[{\"rel\":\"ua:HasOrderedComponent\"," + + "\"href\":\"nsu=urn:demo:pump;i=2001\",\"uav:refId\":\"i=49\"," + + "\"uav:refName\":\"Stage_1\"}]}"; + + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + + UAObjectType root = nodeSet.Items!.OfType().Single(); + var toTarget = root.References! + .Where(r => r.Value == "nsu=urn:demo:pump;i=2001").ToArray(); + Assert.That(toTarget, Has.Length.EqualTo(1), + "The pinned component must not be emitted twice."); + Assert.That(toTarget[0].ReferenceType, Is.EqualTo("i=49")); + Assert.That(toTarget[0].IsForward, Is.True); + } + + [Test] + public void ReferenceTypeModelNameResolvesWithoutFallbackWhenUnique() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"uav:hasComponent\":[\"nsu=urn:demo:pump;i=2001\"]," + + "\"links\":[{\"rel\":\"ua:HasOrderedComponent\"," + + "\"href\":\"nsu=urn:demo:pump;i=2001\"," + + "\"uav:refName\":\"Stage_1\"}]}"; + + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + + UAObjectType root = nodeSet.Items!.OfType().Single(); + Reference reference = root.References! + .Single(r => r.Value == "nsu=urn:demo:pump;i=2001"); + Assert.That(reference.ReferenceType, Is.EqualTo("i=49")); + } + + [Test] + public void CustomReferenceTypeModelNameUsesExpandedNodeIdFallback() + { + const string json = + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"pump\":\"urn:demo:pump#\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"links\":[{\"rel\":\"pump:FlowsTo\"," + + "\"href\":\"nsu=urn:demo:pump;i=2001\"," + + "\"uav:refId\":\"nsu=urn:demo:pump;i=4001\"}]}"; + + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + + UAObjectType root = nodeSet.Items!.OfType().Single(); + Assert.That( + root.References!.Any(r => + r.ReferenceType == "nsu=urn:demo:pump;i=4001" && + r.Value == "nsu=urn:demo:pump;i=2001"), + Is.True); + } + + [Test] + public void ConflictingReferenceTypeNameAndNodeIdIsRejected() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"links\":[{\"rel\":\"ua:HasOrderedComponent\"," + + "\"href\":\"nsu=urn:demo:pump;i=2001\"," + + "\"uav:refId\":\"i=47\"}]}"; + + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = + WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptConflict), + Is.True); + } + + [Test] + public void TypeModelNameRemainsSemanticHintBesideExpandedNodeId() + { + const string json = + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"pump\":\"urn:demo:pump#\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"properties\":{\"speed\":{\"uav:browseName\":\"1:Speed\"," + + "\"type\":\"number\",\"uav:mapToTypeName\":\"pump:Measurement\"," + + "\"uav:mapToType\":\"nsu=urn:demo:pump;i=3010\"}}}"; + + using WotDocument source = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = + WotNodeSetConverter.ToNodeSetResult(source); + + Assert.That(result.HasErrors, Is.False); + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.NonPortableIdentity), + Is.False); + + using WotDocument restored = WotNodeSetConverter.FromNodeSet(result.Value!); + JsonElement speed = restored.RootElement + .GetProperty("properties") + .GetProperty("Speed"); + Assert.That( + speed.GetProperty("uav:mapToTypeName").GetString(), + Is.EqualTo("pump:Measurement")); + Assert.That( + speed.GetProperty("uav:mapToType").GetString(), + Is.EqualTo("nsu=urn:demo:pump;i=3010")); + } + + [TestCase("uav:mapToNodeId")] + [TestCase("uav:mapToType")] + public void MappingIdentifiersRejectCompactModelNames(string term) + { + string json = + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"pump\":\"urn:demo:pump#\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\"," + + "\"uav:browseName\":\"nsu=urn:demo:pump;PumpType\"," + + "\"properties\":{\"speed\":{\"type\":\"number\",\"" + + term + "\":\"pump:Measurement\"}}}"; + + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = + WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ValidationError), + Is.True); + } + + [Test] + public void GeneratedContextBindsBaseAndNodeSetNamespaces() + { + using WotDocument document = + WotNodeSetConverter.FromNodeSet(WotTestData.CreateRichNodeSet()); + + JsonElement prefixes = document.RootElement.GetProperty("@context")[1]; + Assert.That( + prefixes.GetProperty("ua").GetString(), + Is.EqualTo("http://opcfoundation.org/UA/")); + Assert.That( + prefixes.GetProperty("ns1").GetString(), + Is.EqualTo("urn:test:model")); + } + + [Test] + public void DefinedBindingRelationIsNotTreatedAsUnknownModelConcept() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"links\":[{\"rel\":\"uav:componentModel\"," + + "\"href\":\"nsu=urn:demo:pump;i=2001\"," + + "\"uav:refId\":\"i=47\",\"uav:refName\":\"Stage\"}]}"; + + using WotDocument document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = + WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.HasErrors, Is.False); + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved), + Is.False); + } + + [Test] + public void ExternalIriRelationIsPreservedRatherThanRejected() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"links\":[{\"rel\":\"https://schema.org/about\"," + + "\"href\":\"https://example.com/about\"}]}"; + + using WotDocument source = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = + WotNodeSetConverter.ToNodeSetResult(source); + + Assert.That(result.HasErrors, Is.False); + using WotDocument restored = WotNodeSetConverter.FromNodeSet(result.Value!); + JsonElement link = restored.RootElement.GetProperty("links")[0]; + Assert.That( + link.GetProperty("rel").GetString(), + Is.EqualTo("https://schema.org/about")); + } + + [Test] + public void UnpinnedComponentDefaultsToPlainHasComponent() + { + string json = + "{" + Context + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"uav:hasComponent\":[\"nsu=urn:demo:pump;i=2001\"]}"; + + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + + UAObjectType root = nodeSet.Items!.OfType().Single(); + Reference reference = root.References! + .Single(r => r.Value == "nsu=urn:demo:pump;i=2001"); + Assert.That(reference.ReferenceType, Is.EqualTo("HasComponent")); + Assert.That(reference.IsForward, Is.True); + } + + [Test] + public void HasComponentSubtypeRoundTripsExactlyThroughReadableMapping() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet(CreateOrderedComponentNodeSet()); + + // Rebuild a native (envelope-free) Thing Model from the emitted + // readable surface and confirm the ordered components survive. + string readable = BuildReadableOnly(document); + UANodeSet restored = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(readable)); + + UAObjectType root = restored.Items!.OfType().Single(); + int ordered = root.References!.Count(r => r.ReferenceType == "i=49" && r.IsForward); + Assert.That(ordered, Is.EqualTo(2)); + Assert.That( + root.References!.Any(r => r.ReferenceType == "HasComponent" && r.IsForward), + Is.False, + "A pinned ordered component must not degrade to plain HasComponent."); + } + + private static string BuildReadableOnly(WotDocument document) + { + // Strip the preservation envelope and native projection so ToNodeSet + // exercises the synthesis (reverse conversion) path rather than the + // exact envelope restore. + using var stream = new System.IO.MemoryStream(); + using (var writer = new Utf8JsonWriter(stream)) + { + writer.WriteStartObject(); + foreach (JsonProperty member in document.RootElement.EnumerateObject()) + { + if (member.Name is "uav:nodeSet" or "uav:nodes") + { + continue; + } + writer.WritePropertyName(member.Name); + member.Value.WriteTo(writer); + } + writer.WriteEndObject(); + } + return Encoding.UTF8.GetString(stream.ToArray()); + } + + private static UANodeSet CreateReorderableNodeSet(string[] namespaceUris, int aIndex) + { + string prefix = "ns=" + aIndex.ToString(System.Globalization.CultureInfo.InvariantCulture) + ";"; + return new UANodeSet + { + NamespaceUris = namespaceUris, + Models = [new ModelTableEntry { ModelUri = "urn:demo:a" }], + Items = + [ + new UAObjectType + { + NodeId = prefix + "i=1001", + BrowseName = aIndex + ":PumpType", + DisplayName = [new Export.LocalizedText { Value = "PumpType" }], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=58" }, + new Reference { ReferenceType = "HasComponent", IsForward = true, Value = prefix + "i=6001" } + ] + }, + new UAVariable + { + NodeId = prefix + "i=6001", + BrowseName = aIndex + ":Speed", + DisplayName = [new Export.LocalizedText { Value = "Speed" }], + DataType = "Double", + AccessLevel = 1, + ParentNodeId = prefix + "i=1001", + References = + [ + new Reference { ReferenceType = "HasTypeDefinition", IsForward = true, Value = "i=63" }, + new Reference { ReferenceType = "HasComponent", IsForward = false, Value = prefix + "i=1001" } + ] + } + ] + }; + } + + private static UANodeSet CreateOrderedComponentNodeSet() + { + return new UANodeSet + { + NamespaceUris = ["urn:demo:pump"], + Models = [new ModelTableEntry { ModelUri = "urn:demo:pump" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1001", + BrowseName = "1:PumpType", + DisplayName = [new Export.LocalizedText { Value = "PumpType" }], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=58" }, + new Reference { ReferenceType = "HasOrderedComponent", IsForward = true, Value = "ns=1;i=2001" }, + new Reference { ReferenceType = "HasOrderedComponent", IsForward = true, Value = "ns=1;i=2002" } + ] + }, + new UAObject + { + NodeId = "ns=1;i=2001", + BrowseName = "1:Stage_1", + DisplayName = [new Export.LocalizedText { Value = "Stage_1" }], + References = + [ + new Reference { ReferenceType = "HasTypeDefinition", IsForward = true, Value = "i=58" }, + new Reference { ReferenceType = "HasOrderedComponent", IsForward = false, Value = "ns=1;i=1001" } + ] + }, + new UAObject + { + NodeId = "ns=1;i=2002", + BrowseName = "1:Stage_2", + DisplayName = [new Export.LocalizedText { Value = "Stage_2" }], + References = + [ + new Reference { ReferenceType = "HasTypeDefinition", IsForward = true, Value = "i=58" }, + new Reference { ReferenceType = "HasOrderedComponent", IsForward = false, Value = "ns=1;i=1001" } + ] + } + ] + }; + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotConverterPreservationTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotConverterPreservationTests.cs new file mode 100644 index 0000000000..22a9c4ed51 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotConverterPreservationTests.cs @@ -0,0 +1,436 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Tests for WotNodeSetConverter preservation modes, byte-archival fallback, + /// and reconstruction paths. + /// + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotConverterPreservationTests + { + [Test] + public void PreservationModeAlwaysEmitsEnvelopeEvenForCompleteNodeSet() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Always + }; + + using WotDocument document = WotNodeSetConverter.FromNodeSet(nodeSet, null, options); + + Assert.That(document.TryGetEnvelope(out _), Is.True); + } + + [Test] + public void PreservationModeNeverSucceedsWhenNativeProjectionIsComplete() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, null, options); + + Assert.That(result.Value, Is.Not.Null); + Assert.That(result.HasErrors, Is.False); + } + + [Test] + public void PreservationModeNeverFailsWhenNativeProjectionIncomplete() + { + // MaxNodeCount=2 forces a NodeCountExceeded error during Write, + // making nativeComplete=false and triggering NativeProjectionIncomplete. + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions + { + MaxNodeCount = 2, + PreservationMode = WotNodeSetPreservationMode.Never + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, null, options); + + Assert.That(result.Value, Is.Null); + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionIncomplete), + Is.True); + } + + [Test] + public void PreservationModeWhenRequiredOmitsEnvelopeForCompleteNodeSet() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }; + + using WotDocument document = WotNodeSetConverter.FromNodeSet(nodeSet, null, options); + + Assert.That(document.TryGetEnvelope(out _), Is.False); + } + + [Test] + public void PreservationModeWhenRequiredEmitsEnvelopeWithWarningWhenIncomplete() + { + // MaxNodeCount=2 forces incomplete native projection. + // WhenRequired mode should emit envelope + warning (not error). + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions + { + MaxNodeCount = 2, + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, null, options); + + Assert.That(result.Value, Is.Not.Null); + Assert.That(result.HasErrors, Is.False); + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.NativeProjectionIncomplete && + d.Severity == WotDiagnosticSeverity.Warning), + Is.True); + using WotDocument document = result.Value!; + Assert.That(document.TryGetEnvelope(out _), Is.True); + } + + [Test] + public void FromNodeSetResultRejectsNodeSetExceedingMaxNodeSetSize() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions { MaxNodeSetSize = 1 }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, null, options); + + Assert.That(result.Value, Is.Null); + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NodeSetTooLarge), + Is.True); + } + + [Test] + public void ToNodeSetFromBytesReconstructsNodeSet() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + null, + new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Always + }); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document.Utf8Json); + + Assert.That(WotTestData.Serialize(restored), Is.EqualTo(WotTestData.Serialize(source))); + } + + [Test] + public void ToNodeSetFromDocumentWithNativeProjectionReconstructsNodes() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + using WotDocument document = WotNodeSetConverter.FromNodeSet(source); + + Assert.That(document.TryGetNativeProjection(out _), Is.True); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document); + + Assert.That( + NodeSetComparer.Compare(source, restored).AreEquivalent, + Is.True); + } + + [Test] + public void ConversionResultSuccessIsTrueWhenNoErrors() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult(nodeSet); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value, Is.Not.Null); + result.Value?.Dispose(); + } + + [Test] + public void ConversionResultSuccessIsFalseWhenErrors() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions { MaxNodeSetSize = 1 }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, null, options); + + Assert.That(result.Success, Is.False); + Assert.That(result.Value, Is.Null); + } + + [Test] + public void UnknownDocumentKindProducesNoConvertibleContentDiagnostic() + { + // A document with no @type, no uav:nodeSet, and no uav:nodes is Unknown. + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"no-type-document\"}"); + using var document = WotDocument.Parse(json); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NoConvertibleContent), + Is.True); + } + + [Test] + public void UnsupportedContentTypeInEnvelopeProducesDiagnostic() + { + const string json = + "{\"@type\":\"tm:ThingModel\",\"uav:nodeSet\":{" + + "\"@type\":\"uav:nodeSet\"," + + "\"contentType\":\"application/xml\"," + + "\"encoding\":\"base64\"," + + "\"sha256\":\"0000000000000000000000000000000000000000000000000000000000000000\"," + + "\"data\":\"AA==\"}}"; + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedContentType), + Is.True); + } + + [Test] + public void TrySelectProjectionRootReturnsNullForEmptyNodeSet() + { + var emptyNodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Items = [] + }; + + ExpandedNodeId root = WotNodeSetConverter.TrySelectProjectionRoot(emptyNodeSet); + + Assert.That(root.IsNull, Is.True); + } + + [Test] + public void TrySelectProjectionRootReturnsExpandedNodeIdForRootedNodeSet() + { + UANodeSet nodeSet = WotTestData.CreateRichNodeSet(); + + ExpandedNodeId root = WotNodeSetConverter.TrySelectProjectionRoot(nodeSet); + + Assert.That(root.IsNull, Is.False); + } + + [Test] + public void TrySelectProjectionRootNullArgThrows() + { + Assert.That( + () => WotNodeSetConverter.TrySelectProjectionRoot(null!), + Throws.TypeOf()); + } + + [Test] + public void ToNodeSetResultSuccessPathFromThingModelJson() + { + // A minimal ThingModel with uav:nodes can be reconstructed. + UANodeSet source = WotTestData.CreateRichNodeSet(); + using WotDocument document = WotNodeSetConverter.FromNodeSet(source); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value, Is.Not.Null); + } + + [Test] + public void RestoreFromEnvelopeRejectsUnsupportedEncoding() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes(encoding: "hex"); + using var document = WotDocument.Parse(bytes); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedEncoding), + Is.True); + } + + [Test] + public void RestoreFromEnvelopeRejectsMissingDataField() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes(omitData: true); + using var document = WotDocument.Parse(bytes); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.EnvelopeInvalid), + Is.True); + } + + [Test] + public void RestoreFromEnvelopeRejectsInvalidBase64Data() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes(dataOverride: "not!valid!base64==="); + using var document = WotDocument.Parse(bytes); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.InvalidBase64), + Is.True); + } + + [Test] + public void RestoreFromEnvelopeRejectsDecodedNodeSetExceedingMaxSize() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes(); + using var document = WotDocument.Parse(bytes); + + var options = new WotNodeSetConverterOptions { MaxNodeSetSize = 1 }; + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document, options); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NodeSetTooLarge), + Is.True); + } + + [Test] + public void RestoreFromEnvelopeRejectsMissingSha256Field() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes(omitSha256: true); + using var document = WotDocument.Parse(bytes); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.InvalidDigest), + Is.True); + } + + [Test] + public void RestoreFromEnvelopeRejectsInvalidDigestFormat() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes(sha256Override: "not-a-hex-digest"); + using var document = WotDocument.Parse(bytes); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.InvalidDigest), + Is.True); + } + + [Test] + public void RestoreFromEnvelopeRejectsDigestMismatch() + { + byte[] bytes = BuildMinimalEnvelopeDocumentBytes( + sha256Override: new string('0', 64)); + using var document = WotDocument.Parse(bytes); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.DigestMismatch), + Is.True); + } + + private static byte[] BuildMinimalEnvelopeDocumentBytes( + string contentType = "application/opcua-nodeset+xml", + string encoding = "base64", + bool omitData = false, + bool omitSha256 = false, + string sha256Override = null, + string dataOverride = null) + { + var nodeSet = new Opc.Ua.Export.UANodeSet + { + Models = [] + }; + using var ms = new MemoryStream(); + nodeSet.Write(ms); + byte[] nodeSetBytes = ms.ToArray(); +#if NETFRAMEWORK + // SHA256.HashData is not available on .NET Framework. + using var sha = SHA256.Create(); + byte[] hash = sha.ComputeHash(nodeSetBytes); +#else + byte[] hash = SHA256.HashData(nodeSetBytes); +#endif + string hashHex = string.Concat( + Array.ConvertAll( + hash, + b => b.ToString("x2", System.Globalization.CultureInfo.InvariantCulture))); + string base64 = Convert.ToBase64String(nodeSetBytes); + + string json = + "{\"@type\":\"tm:ThingModel\",\"title\":\"T\",\"uav:nodeSet\":{" + + "\"@type\":\"uav:nodeSet\"" + + ",\"contentType\":\"" + contentType + "\"" + + ",\"encoding\":\"" + encoding + "\"" + + (!omitData ? ",\"data\":\"" + (dataOverride ?? base64) + "\"" : string.Empty) + + (!omitSha256 ? ",\"sha256\":\"" + (sha256Override ?? hashHex) + "\"" : string.Empty) + + "}}"; + return Encoding.UTF8.GetBytes(json); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotDocumentKindTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotDocumentKindTests.cs new file mode 100644 index 0000000000..47c4b6166d --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotDocumentKindTests.cs @@ -0,0 +1,284 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Additional tests for WotDocument covering ThingDescription kind, + /// Unknown kind, Forms property, and null-guard paths. + /// + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotDocumentKindTests + { + [Test] + public void KindIsThingDescriptionForUavObjectToken() + { + byte[] json = Encoding.UTF8.GetBytes("{\"@type\":\"uav:object\",\"title\":\"T\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingDescription)); + } + + [Test] + public void KindIsThingDescriptionForUavVariableToken() + { + byte[] json = Encoding.UTF8.GetBytes("{\"@type\":\"uav:variable\",\"title\":\"T\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingDescription)); + } + + [Test] + public void KindIsThingDescriptionForUavMethodToken() + { + byte[] json = Encoding.UTF8.GetBytes("{\"@type\":\"uav:method\",\"title\":\"T\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingDescription)); + } + + [Test] + public void KindIsThingModelForUavVariableTypeToken() + { + byte[] json = Encoding.UTF8.GetBytes("{\"@type\":\"uav:variableType\",\"title\":\"T\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingModel)); + } + + [Test] + public void KindIsUnknownWhenTypeTokenIsUnrecognized() + { + byte[] json = Encoding.UTF8.GetBytes("{\"@type\":\"vendor:SomeThing\",\"title\":\"T\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.Unknown)); + } + + [Test] + public void KindIsUnknownWhenTypeMemberIsAbsent() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"no-type-at-all\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.Unknown)); + } + + [Test] + public void FormsPropertyReturnsArrayElements() + { + byte[] json = Encoding.UTF8.GetBytes( + "{\"@type\":\"tm:ThingModel\"," + + "\"forms\":[{\"href\":\"coap://example.com/sensor\"},{\"href\":\"http://example.com/s\"}]}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Forms, Has.Count.EqualTo(2)); + Assert.That( + document.Forms[0].GetProperty("href").GetString(), + Is.EqualTo("coap://example.com/sensor")); + } + + [Test] + public void FormsPropertyReturnsEmptyListWhenAbsent() + { + byte[] json = Encoding.UTF8.GetBytes("{\"@type\":\"tm:ThingModel\",\"title\":\"T\"}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Forms, Is.Empty); + } + + [Test] + public void TryGetUavNullArgThrows() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + + Assert.That( + () => document.TryGetUav(null!, out _), + Throws.TypeOf()); + } + + [Test] + public void TryEvaluatePointerInstanceNullArgThrows() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + + Assert.That( + () => document.TryEvaluatePointer(null!, out _), + Throws.TypeOf()); + } + + [Test] + public void TryEvaluatePointerStaticNullArgThrows() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + JsonElement root = document.RootElement; + + Assert.That( + () => WotDocument.TryEvaluatePointer(root, null!, out _), + Throws.TypeOf()); + } + + [Test] + public void TryEvaluatePointerEmptyStringAddressesRoot() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + + bool found = document.TryEvaluatePointer(string.Empty, out JsonElement value); + + Assert.That(found, Is.True); + Assert.That(value.ValueKind, Is.EqualTo(JsonValueKind.Object)); + } + + [Test] + public void TryEvaluatePointerReturnsFalseForLeadingNonSlash() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + + bool found = document.TryEvaluatePointer("title", out _); + + Assert.That(found, Is.False); + } + + [Test] + public void WriteCanonicalWritesToStream() + { + byte[] json = Encoding.UTF8.GetBytes("{\"b\":2,\"a\":1}"); + using var document = WotDocument.Parse(json); + using var stream = new MemoryStream(); + + document.WriteCanonical(stream); + + Assert.That(stream.Length, Is.GreaterThan(0)); + string canonical = Encoding.UTF8.GetString(stream.ToArray()); + Assert.That(canonical, Does.StartWith("{\"a\"")); + } + + [Test] + public void WriteCanonicalNullStreamThrows() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + + Assert.That( + () => document.WriteCanonical(null!), + Throws.TypeOf()); + } + + [Test] + public void WriteNullStreamThrows() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + using var document = WotDocument.Parse(json); + + Assert.That( + () => document.Write(null!), + Throws.TypeOf()); + } + + [Test] + public void ParseThrowsFormatExceptionWhenJsonExceedsMaxJsonDocumentSize() + { + byte[] json = Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + var options = new WotNodeSetConverterOptions { MaxJsonDocumentSize = 1 }; + + Assert.That( + () => WotDocument.Parse(json, options), + Throws.TypeOf()); + } + + [Test] + public void TryEvaluatePointerFollowsArrayByNumericIndex() + { + byte[] json = Encoding.UTF8.GetBytes("{\"items\":[\"alpha\",\"beta\",\"gamma\"]}"); + using var document = WotDocument.Parse(json); + + bool found = document.TryEvaluatePointer("/items/1", out JsonElement element); + + Assert.That(found, Is.True); + Assert.That(element.GetString(), Is.EqualTo("beta")); + } + + [Test] + public void TryEvaluatePointerReturnsFalseWhenIntermediateNodeIsScalar() + { + byte[] json = Encoding.UTF8.GetBytes("{\"a\":42}"); + using var document = WotDocument.Parse(json); + + bool found = document.TryEvaluatePointer("/a/nested", out _); + + Assert.That(found, Is.False); + } + + [Test] + public void TryEvaluatePointerUnescapesTilde1AsSlashInPropertyName() + { + byte[] json = Encoding.UTF8.GetBytes("{\"a/b\":99}"); + using var document = WotDocument.Parse(json); + + bool found = document.TryEvaluatePointer("/a~1b", out JsonElement element); + + Assert.That(found, Is.True); + Assert.That(element.GetInt32(), Is.EqualTo(99)); + } + + [Test] + public void TryEvaluatePointerReturnsFalseForArrayIndexWithLeadingZero() + { + byte[] json = Encoding.UTF8.GetBytes("{\"items\":[\"a\",\"b\"]}"); + using var document = WotDocument.Parse(json); + + bool found = document.TryEvaluatePointer("/items/01", out _); + + Assert.That(found, Is.False); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotDocumentTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotDocumentTests.cs new file mode 100644 index 0000000000..8cd010034c --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotDocumentTests.cs @@ -0,0 +1,144 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotDocumentTests + { + [Test] + public void ParseAndWritePreservesUnknownMembersExactly() + { + byte[] json = Encoding.UTF8.GetBytes( + /*lang=json,strict*/ + "{\"@context\":[],\"title\":\"T\",\"vendor:unknown\":{\"b\":2,\"a\":1}}"); + + using var document = WotDocument.Parse(json); + using var output = new System.IO.MemoryStream(); + document.Write(output); + + Assert.That(output.ToArray(), Is.EqualTo(json)); + } + + [Test] + public void LexicalSurfaceExposesTypedAccess() + { + byte[] json = Encoding.UTF8.GetBytes( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"id\":\"urn:pump\"," + + "\"uav:browseName\":\"1:PumpType\"," + + "\"properties\":{\"speed\":{\"type\":\"number\"}}," + + "\"actions\":{\"reset\":{}},\"events\":{\"hot\":{}}," + + "\"links\":[{\"rel\":\"tm:extends\",\"href\":\"x\"}]," + + "\"securityDefinitions\":{\"nosec_sc\":{\"scheme\":\"nosec\"}}," + + "\"schemaDefinitions\":{\"S\":{\"type\":\"object\"}}}"); + + using var document = WotDocument.Parse(json); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingModel)); + Assert.That(document.Title, Is.EqualTo("PumpType")); + Assert.That(document.Id, Is.EqualTo("urn:pump")); + Assert.That(document.TypeTokens, Does.Contain("uav:objectType")); + Assert.That(document.Properties.ContainsKey("speed"), Is.True); + Assert.That(document.Actions.ContainsKey("reset"), Is.True); + Assert.That(document.Events.ContainsKey("hot"), Is.True); + Assert.That(document.Links, Has.Count.EqualTo(1)); + Assert.That(document.SecurityDefinitions.ContainsKey("nosec_sc"), Is.True); + Assert.That(document.SchemaDefinitions.ContainsKey("S"), Is.True); + Assert.That(document.TryGetUav("browseName", out JsonElement browseName), Is.True); + Assert.That(browseName.GetString(), Is.EqualTo("1:PumpType")); + } + + [Test] + public void JsonPointerResolvesNestedMembersIncludingEscapes() + { + byte[] json = Encoding.UTF8.GetBytes( + /*lang=json,strict*/ + "{\"properties\":{\"speed\":{\"uav:unit~x\":\"rpm\",\"items\":[10,20]}}}"); + + using var document = WotDocument.Parse(json); + + Assert.That( + document.TryEvaluatePointer("/properties/speed/items/1", out JsonElement item), + Is.True); + Assert.That(item.GetInt32(), Is.EqualTo(20)); + + Assert.That( + document.TryEvaluatePointer("/properties/speed/uav:unit~0x", out JsonElement unit), + Is.True); + Assert.That(unit.GetString(), Is.EqualTo("rpm")); + + Assert.That(document.TryEvaluatePointer("/missing", out _), Is.False); + } + + [Test] + public void CanonicalWriterProducesDeterministicSortedOutput() + { + byte[] first = Encoding.UTF8.GetBytes( + /*lang=json,strict*/ + "{ \"b\": 2, \"a\": 1, \"nested\": { \"y\": 2, \"x\": 1 } }"); + byte[] second = Encoding.UTF8.GetBytes( + /*lang=json,strict*/ + "{\"a\":1,\"nested\":{\"x\":1,\"y\":2},\"b\":2}"); + + using var firstDocument = WotDocument.Parse(first); + using var secondDocument = WotDocument.Parse(second); + + byte[] firstCanonical = firstDocument.ToCanonicalUtf8(); + byte[] secondCanonical = secondDocument.ToCanonicalUtf8(); + + Assert.That(firstCanonical, Is.EqualTo(secondCanonical)); + Assert.That( + Encoding.UTF8.GetString(firstCanonical), + Is.EqualTo(/*lang=json,strict*/ "{\"a\":1,\"b\":2,\"nested\":{\"x\":1,\"y\":2}}")); + } + + [Test] + public void CanonicalWriterIsSeparateFromExactWrite() + { + byte[] json = Encoding.UTF8.GetBytes(/*lang=json,strict*/ "{ \"b\" : 2, \"a\" : 1 }"); + using var document = WotDocument.Parse(json); + + using var exact = new System.IO.MemoryStream(); + document.Write(exact); + + Assert.That(exact.ToArray(), Is.EqualTo(json)); + Assert.That(document.ToCanonicalUtf8(), Is.Not.EqualTo(json)); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotEnvelopeTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotEnvelopeTests.cs new file mode 100644 index 0000000000..a8c07014f3 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotEnvelopeTests.cs @@ -0,0 +1,322 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Text.RegularExpressions; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotEnvelopeTests + { + [Test] + public void EnvelopeRoundTripsAllNodeClassesAndExtensions() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: AlwaysPreserve()); + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document); + + Assert.That(WotTestData.Serialize(restored), Is.EqualTo(WotTestData.Serialize(source))); + } + + [Test] + public void EnvelopeDigestIsLowercaseHex() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateRichNodeSet(), + options: AlwaysPreserve()); + + string digest = document.RootElement + .GetProperty("uav:nodeSet") + .GetProperty("sha256") + .GetString()!; + + Assert.That(digest, Has.Length.EqualTo(64)); + Assert.That(digest, Does.Match("^[0-9a-f]{64}$")); + } + + [Test] + public void FromNodeSetEmitsNativeAffordances() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet(WotTestData.CreateRichNodeSet()); + + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingModel)); + + Assert.That(document.Properties.ContainsKey("Speed"), Is.True); + JsonElement speed = document.Properties["Speed"]; + Assert.That(speed.GetProperty("@type").GetString(), Is.EqualTo("uav:variableType")); + Assert.That(speed.GetProperty("type").GetString(), Is.EqualTo("number")); + Assert.That(speed.GetProperty("observable").GetBoolean(), Is.True); + Assert.That(speed.GetProperty("uav:modellingRule").GetString(), Is.EqualTo("Mandatory")); + + Assert.That(document.Actions.ContainsKey("Reset"), Is.True); + Assert.That( + document.Actions["Reset"].GetProperty("uav:modellingRule").GetString(), + Is.EqualTo("Optional")); + + Assert.That(document.Events.ContainsKey("OverTemperatureEventType"), Is.True); + Assert.That( + document.Events["OverTemperatureEventType"].GetProperty("uav:isEvent").GetBoolean(), + Is.True); + } + + [Test] + public void FromNodeSetEmitsNativeProjectionForEveryNode() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet(WotTestData.CreateRichNodeSet()); + + Assert.That(document.TryGetNativeProjection(out JsonElement projection), Is.True); + JsonElement nodes = projection.GetProperty("nodes"); + Assert.That(nodes.GetArrayLength(), Is.EqualTo(WotTestData.CreateRichNodeSet().Items!.Length)); + + JsonElement objectType = nodes.EnumerateArray() + .First(n => n.GetProperty("nodeId").GetString() == "ns=1;i=1001"); + Assert.That(objectType.GetProperty("nodeClass").GetString(), Is.EqualTo("ObjectType")); + Assert.That(objectType.GetProperty("browseName").GetString(), Is.EqualTo("1:MachineType")); + } + + [Test] + public void DigestMismatchProducesDiagnostic() + { + using WotDocument original = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateRichNodeSet(), + options: AlwaysPreserve()); + string json = Encoding.UTF8.GetString(original.Utf8Json.ToArray()); + const string marker = "\"data\": \""; + int index = json.IndexOf(marker, StringComparison.Ordinal) + marker.Length; + char[] characters = json.ToCharArray(); + characters[index] = characters[index] == 'A' ? 'B' : 'A'; + + using var tampered = WotDocument.Parse( + Encoding.UTF8.GetBytes(new string(characters))); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(tampered); + + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.DigestMismatch), + Is.True); + } + + [Test] + public void NativeProjectionConflictIsReportedNotSilentlyResolved() + { + using WotDocument original = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateRichNodeSet(), + options: AlwaysPreserve()); + string json = Encoding.UTF8.GetString(original.Utf8Json.ToArray()); + + // Rewrite the plaintext BrowseName; the base64 envelope keeps the + // authoritative value so the native projection now conflicts. + string conflicted = json.Replace("1:MachineType", "1:Tampered", StringComparison.Ordinal); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(conflicted)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionConflict), + Is.True); + Assert.That(result.HasErrors, Is.True); + } + + [Test] + public void EnvelopeRebuildsExactNodeSetForSourceGeneratorConsumption() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: AlwaysPreserve()); + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document.Utf8Json); + + Assert.That(WotTestData.Serialize(restored), Is.EqualTo(WotTestData.Serialize(source))); + } + + [Test] + public void MissingDigestIsRejectedAsMandatory() + { + using WotDocument original = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateReconstructableNodeSet(), + options: AlwaysPreserve()); + string json = Encoding.UTF8.GetString(original.Utf8Json.ToArray()); + string withoutDigest = RemoveJsonStringProperty(json, "sha256"); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(withoutDigest)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.InvalidDigest), + Is.True); + } + + [Test] + public void MalformedDigestIsRejected() + { + using WotDocument original = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateReconstructableNodeSet(), + options: AlwaysPreserve()); + string json = Encoding.UTF8.GetString(original.Utf8Json.ToArray()); + string malformed = ReplaceJsonStringProperty(json, "sha256", "not-a-valid-digest"); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(malformed)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.InvalidDigest), + Is.True); + } + + [Test] + public void MalformedNodeSetXmlProducesDiagnosticInsteadOfThrowing() + { + byte[] payload = Encoding.UTF8.GetBytes("this is not a valid NodeSet2 XML document at all"); + string json = BuildEnvelopeJson(payload); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + + WotConversionResult result = null; + Assert.That( + () => result = WotNodeSetConverter.ToNodeSetResult(document), + Throws.Nothing); + Assert.That(result!.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.MalformedNodeSet), + Is.True); + } + + [Test] + public void UnsupportedEncodingIsRejected() + { + using WotDocument original = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateReconstructableNodeSet(), + options: AlwaysPreserve()); + string json = Encoding.UTF8.GetString(original.Utf8Json.ToArray()); + string tampered = ReplaceJsonStringProperty(json, "encoding", "base64url"); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(tampered)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedEncoding), + Is.True); + } + + [Test] + public void Base64IsTheOnlyAcceptedEncodingPerSpecAndRoundTrips() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: AlwaysPreserve()); + + string encoding = document.RootElement + .GetProperty("uav:nodeSet") + .GetProperty("encoding") + .GetString()!; + Assert.That(encoding, Is.EqualTo("base64")); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document); + Assert.That(WotTestData.Serialize(restored), Is.EqualTo(WotTestData.Serialize(source))); + } + + private static string RemoveJsonStringProperty(string json, string propertyName) + { + return Regex.Replace( + json, + "\"" + Regex.Escape(propertyName) + "\":\\s*\"[^\"]*\",?\\s*", + string.Empty); + } + + private static WotNodeSetConverterOptions AlwaysPreserve() + { + return new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Always + }; + } + + private static string ReplaceJsonStringProperty(string json, string propertyName, string newValue) + { + return Regex.Replace( + json, + "\"" + Regex.Escape(propertyName) + "\":\\s*\"[^\"]*\"", + "\"" + propertyName + "\": \"" + newValue + "\""); + } + + private static string BuildEnvelopeJson(byte[] nodeSetBytes) + { + byte[] digest = ComputeSha256(nodeSetBytes); + return "{\"@type\":\"tm:ThingModel\",\"uav:nodeSet\":{" + + "\"@type\":\"uav:nodeSet\",\"contentType\":\"application/opcua-nodeset+xml\"," + + "\"encoding\":\"base64\"," + + "\"sha256\":\"" + + ToLowerHexString(digest) + + "\"," + + "\"data\":\"" + + Convert.ToBase64String(nodeSetBytes) + + "\"}}"; + } + + private static byte[] ComputeSha256(byte[] data) + { +#if NET6_0_OR_GREATER + return SHA256.HashData(data); +#else + using var sha256 = SHA256.Create(); + return sha256.ComputeHash(data); +#endif + } + + private static string ToLowerHexString(byte[] data) + { + var builder = new StringBuilder(data.Length * 2); + foreach (byte value in data) + { + builder.Append(value.ToString("x2", CultureInfo.InvariantCulture)); + } + return builder.ToString(); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotJsonResidueTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotJsonResidueTests.cs new file mode 100644 index 0000000000..7f5d222a03 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotJsonResidueTests.cs @@ -0,0 +1,922 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; +using SysXmlDocument = System.Xml.XmlDocument; +using SysXmlElement = System.Xml.XmlElement; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotJsonResidueTests + { + private const string s_ns = WotNodeSetConverter.VocabularyNamespace; + + [Test] + public void ApplyWithNullExtensionsReturnsOriginalBytes() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + var nodeSet = new UANodeSet { Extensions = null }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.EqualTo(json)); + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void ApplyWithNoMatchingExtensionReturnsOriginalBytes() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + var doc = new SysXmlDocument { XmlResolver = null }; + SysXmlElement unrelated = doc.CreateElement("vendor", "Custom", "urn:vendor"); + var nodeSet = new UANodeSet { Extensions = [unrelated] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.EqualTo(json)); + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void ApplyRejectsUnsupportedVersion() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement ext = CreateResidueExtension( + "99.0", + CreateResidueMember("/extra", "\"hello\"")); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.EqualTo(json)); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyRejectsNonBase64Encoding() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateResidueMember("/extra", "\"hello\""); + member.SetAttribute("Encoding", "hex"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyRejectsInvalidBase64Content() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement ext = CreateResidueExtension("1.0"); + SysXmlElement member = ext.OwnerDocument!.CreateElement("uav", "Member", s_ns); + member.SetAttribute("Pointer", "/extra"); + member.SetAttribute("Encoding", "base64"); + member.SetAttribute("Sha256", new string('0', 64)); + member.InnerText = "not!valid!base64==="; + ext.AppendChild(member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyRejectsDigestMismatch() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateResidueMember( + "/extra", + "\"hello\"", + sha256Override: new string('a', 64)); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyRejectsInvalidJsonPointerWithoutLeadingSlash() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateResidueMember("noleadingslash", "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyRejectsPointerExceedingMaxDepth() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + string deepPointer = "/" + string.Join("/", Enumerable.Repeat("a", 130)); + SysXmlElement member = CreateResidueMember(deepPointer, "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var options = new WotNodeSetConverterOptions { MaxJsonDepth = 128 }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, options, diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyRejectsOversizedResidue() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + string largeJson = "\"" + new string('x', 200) + "\""; + SysXmlElement member = CreateResidueMember("/extra", largeJson); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var options = new WotNodeSetConverterOptions { MaxJsonDocumentSize = 100 }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, options, diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.JsonDocumentTooLarge), + Is.True); + } + + [Test] + public void ApplyAddsNewMemberToObjectDocument() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateResidueMember("/vendor:extra", "{\"key\":\"value\"}"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("vendor:extra")); + Assert.That(resultJson, Does.Contain("\"key\"")); + } + + [Test] + public void ApplyAppendsToLinksArrayWithDashPointer() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\",\"links\":[{\"rel\":\"existing\",\"href\":\"urn:x\"}]}"); + string linkJson = "{\"rel\":\"extra\",\"href\":\"urn:y\"}"; + SysXmlElement member = CreateResidueMember("/links/-", linkJson); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("urn:y")); + Assert.That(resultJson, Does.Contain("urn:x")); + } + + [Test] + public void ApplyReportsConflictWhenMemberValueDiffers() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\",\"vendor:x\":\"original\"}"); + SysXmlElement member = CreateResidueMember("/vendor:x", "\"conflicting\""); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueConflict), + Is.True); + } + + [Test] + public void ApplyReportsInvalidTargetPointerForNonObjectRoot() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateResidueMember("/title/nested", "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => + d.Code == WotDiagnosticCode.ResidueInvalid || + d.Code == WotDiagnosticCode.ResidueConflict), + Is.True); + } + + [Test] + public void ApplyHandlesInvalidJsonInGeneratedDocument() + { + byte[] invalidJson = WotTestData.Utf8("{ not valid json"); + SysXmlElement member = CreateResidueMember("/extra", "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply( + invalidJson, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.EqualTo(invalidJson)); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyHandlesNullJsonTokenAsGeneratedDocument() + { + byte[] nullJson = WotTestData.Utf8("null"); + SysXmlElement member = CreateResidueMember("/extra", "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply( + nullJson, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.EqualTo(nullJson)); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyInvalidJsonInResidueEntryIsSkipped() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + byte[] badJson = WotTestData.Utf8("{broken json"); + string sha256 = ComputeSha256Hex(badJson); + SysXmlElement ext = CreateResidueExtension("1.0"); + var doc = ext.OwnerDocument!; + SysXmlElement member = doc.CreateElement("uav", "Member", s_ns); + member.SetAttribute("Pointer", "/extra"); + member.SetAttribute("Encoding", "base64"); + member.SetAttribute("Sha256", sha256); + member.InnerText = Convert.ToBase64String(badJson); + ext.AppendChild(member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ReplacePreservesUnrelatedExtensions() + { + var doc = new SysXmlDocument { XmlResolver = null }; + SysXmlElement unrelated = doc.CreateElement("vendor", "Custom", "urn:vendor"); + + var nodeSet = new UANodeSet { Extensions = [unrelated] }; + byte[] trivialJson = WotTestData.Utf8("{\"title\":\"T\"}"); + using WotDocument document = WotDocument.Parse(trivialJson); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(nodeSet.Extensions, Is.Not.Null); + Assert.That( + nodeSet.Extensions!.Any(e => + string.Equals(e.LocalName, "Custom", StringComparison.Ordinal)), + Is.True); + } + + [Test] + public void ReplaceDropsExistingResidueExtension() + { + SysXmlElement residue = CreateResidueExtension("1.0", CreateResidueMember("/old", "1")); + var nodeSet = new UANodeSet { Extensions = [residue] }; + + byte[] emptyDocument = WotTestData.Utf8("{\"title\":\"T\"}"); + using WotDocument document = WotDocument.Parse(emptyDocument); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(nodeSet.Extensions, Is.Null.Or.Empty); + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void ReplaceReportsOversizedResidueWhenCapturing() + { + string largeUnknown = "\"" + new string('x', 200) + "\""; + byte[] docJson = WotTestData.Utf8("{\"title\":\"T\",\"vendor:big\":" + largeUnknown + "}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var options = new WotNodeSetConverterOptions { MaxJsonDocumentSize = 50 }; + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, options, diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.JsonDocumentTooLarge), + Is.True); + } + + [Test] + public void ReplaceRoundTripsUnknownRootMembersViaApply() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"vendor:meta\":{\"count\":42,\"tag\":\"test\"}}"); + using WotDocument document = WotDocument.Parse(docJson); + + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + Assert.That(diagnostics, Is.Empty); + + byte[] baseJson = WotTestData.Utf8("{\"title\":\"T\"}"); + var applyDiagnostics = new List(); + byte[] result = WotJsonResidue.Apply( + baseJson, nodeSet, new WotNodeSetConverterOptions(), applyDiagnostics); + + Assert.That(applyDiagnostics, Is.Empty); + string resultText = Encoding.UTF8.GetString(result); + Assert.That(resultText, Does.Contain("vendor:meta")); + Assert.That(resultText, Does.Contain("42")); + } + + [Test] + public void ReplaceCapturableBrowseNameWithNsuPrefix() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"properties\":{\"prop\":{" + + "\"uav:browseName\":\"nsu=urn:test;MyProp\"," + + "\"vendor:extra\":99}}}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + SysXmlElement residue = nodeSet.Extensions! + .FirstOrDefault(e => string.Equals(e.LocalName, "WoTJsonResidue", StringComparison.Ordinal)); + Assert.That(residue, Is.Not.Null); + string xml = residue!.OuterXml; + Assert.That(xml, Does.Contain("MyProp")); + } + + [Test] + public void ReplaceCapturableBrowseNameWithoutColonUsesFullName() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"properties\":{\"prop\":{" + + "\"uav:browseName\":\"NoPrefixName\"," + + "\"vendor:extra\":99}}}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void ReplaceCapturableBrowseNameWithNsuPrefixMissingSemicolon() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"properties\":{\"prop\":{" + + "\"uav:browseName\":\"nsu=urn:testwithnosemicolon\"," + + "\"vendor:extra\":99}}}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void ApplyCreatesIntermediateObjectForDeepPointer() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateResidueMember("/nested/deep", "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("\"nested\"")); + Assert.That(resultJson, Does.Contain("\"deep\"")); + Assert.That(resultJson, Does.Contain("42")); + } + + [Test] + public void ApplySetsArrayElementAtNumericIndex() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\",\"items\":[\"a\",\"b\",\"c\"]}"); + SysXmlElement member = CreateResidueMember("/items/3", "\"d\""); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("\"d\"")); + } + + [Test] + public void ApplyMultipleEntriesWithinSingleResidueExtension() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement ext = CreateResidueExtension( + "1.0", + CreateResidueMember("/vendor:a", "1"), + CreateResidueMember("/vendor:b", "2")); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("vendor:a")); + Assert.That(resultJson, Does.Contain("vendor:b")); + } + + [Test] + public void ApplyEntryTraversesArrayParentByNumericIndex() + { + byte[] json = WotTestData.Utf8("{\"matrix\":[[1,2],[3,4]]}"); + SysXmlElement member = CreateResidueMember("/matrix/0/2", "99"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("99")); + } + + [Test] + public void ApplyEntryNoConflictWhenValueMatchesExistingMember() + { + byte[] json = WotTestData.Utf8("{\"vendor:x\":\"original\"}"); + SysXmlElement member = CreateResidueMember("/vendor:x", "\"original\""); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("original")); + } + + [Test] + public void ApplyEntryArrayIndexConflictEmitsResidueConflict() + { + byte[] json = WotTestData.Utf8("{\"items\":[\"existing-value\"]}"); + SysXmlElement member = CreateResidueMember("/items/0", "\"different-value\""); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueConflict), + Is.True); + } + + [Test] + public void ApplyEntryOutOfRangeArrayIndexEmitsResidueInvalid() + { + byte[] json = WotTestData.Utf8("{\"items\":[\"a\",\"b\",\"c\"]}"); + SysXmlElement member = CreateResidueMember("/items/5", "\"x\""); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyLinkEntryCreatesNewLinkAndLinksArrayWhenAbsent() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateLinkResidueMember("my-rel", "urn:x", "{}"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("my-rel")); + Assert.That(resultJson, Does.Contain("urn:x")); + } + + [Test] + public void ApplyLinkEntryAddsExtrasToNewLink() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateLinkResidueMember( + "custom:rel", + "urn:new", + "{\"custom-field\":\"custom-value\"}"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("custom-field")); + Assert.That(resultJson, Does.Contain("custom-value")); + } + + [Test] + public void ApplyLinkEntryMergesExtrasIntoExistingExactMatchLink() + { + byte[] json = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":[{\"rel\":\"my-rel\",\"href\":\"urn:x\"}]}"); + SysXmlElement member = CreateLinkResidueMember( + "my-rel", + "urn:x", + "{\"extra-field\":\"extra-value\"}"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + byte[] result = WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + string resultJson = Encoding.UTF8.GetString(result); + Assert.That(resultJson, Does.Contain("extra-field")); + } + + [Test] + public void ApplyLinkEntryFindsLinkByRefIdWhenRelDiffers() + { + byte[] json = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":" + + "[{\"rel\":\"server-rel\",\"href\":\"urn:x\",\"uav:refId\":\"my-ref\"}]}"); + SysXmlElement member = CreateLinkResidueMember( + "client-rel", + "urn:x", + "{}", + refId: "my-ref"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + } + + [Test] + public void ApplyLinkEntryReportsConflictForNonArrayLinksKey() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\",\"links\":\"not-an-array\"}"); + SysXmlElement member = CreateLinkResidueMember("my-rel", "urn:x", "{}"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueConflict), + Is.True); + } + + [Test] + public void ApplyLinkEntryReportsInvalidWhenExtrasValueIsNotJsonObject() + { + byte[] json = WotTestData.Utf8("{\"title\":\"T\"}"); + SysXmlElement member = CreateLinkResidueMember("my-rel", "urn:x", "42"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ApplyLinkEntryReportsConflictWhenRefIdMismatch() + { + byte[] json = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":" + + "[{\"rel\":\"my-rel\",\"href\":\"urn:x\",\"uav:refId\":\"old-id\"}]}"); + SysXmlElement member = CreateLinkResidueMember( + "my-rel", + "urn:x", + "{}", + refId: "new-id"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueConflict), + Is.True); + } + + [Test] + public void ApplyLinkEntryReportsConflictWhenExtraPropertyMismatch() + { + byte[] json = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":" + + "[{\"rel\":\"my-rel\",\"href\":\"urn:x\",\"custom\":\"existing-val\"}]}"); + SysXmlElement member = CreateLinkResidueMember( + "my-rel", + "urn:x", + "{\"custom\":\"different-val\"}"); + SysXmlElement ext = CreateResidueExtension("1.0", member); + var nodeSet = new UANodeSet { Extensions = [ext] }; + var diagnostics = new List(); + + WotJsonResidue.Apply(json, nodeSet, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueConflict), + Is.True); + } + + [Test] + public void ReplaceCaptureSetsNonArrayContextAsResidueEntry() + { + byte[] docJson = WotTestData.Utf8("{\"title\":\"T\",\"@context\":\"urn:custom-ctx\"}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + string xml = nodeSet.Extensions![0].OuterXml; + Assert.That(xml, Does.Contain("@context")); + } + + [Test] + public void ReplaceCapturesNonObjectAffordanceMapAsWholeEntry() + { + byte[] docJson = WotTestData.Utf8("{\"title\":\"T\",\"properties\":\"not-an-object\"}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void ReplaceCapturesCollidingAffordanceNamesWithUniqueSuffix() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"properties\":{" + + "\"a\":{\"uav:browseName\":\"1:SameName\",\"vendor:x\":1}," + + "\"b\":{\"uav:browseName\":\"2:SameName\",\"vendor:y\":2}}}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + string xml = nodeSet.Extensions![0].OuterXml; + Assert.That(xml, Does.Contain("SameName")); + Assert.That(xml, Does.Contain("SameName_2")); + } + + [Test] + public void ReplaceCapturesNonArrayLinksAsWholeEntry() + { + byte[] docJson = WotTestData.Utf8("{\"title\":\"T\",\"links\":\"string-not-array\"}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void ReplaceCapturesMappedLinkExtrasForNsGeneratedNamespacePrefix() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":" + + "[{\"rel\":\"ns123:ref\",\"href\":\"urn:x\",\"custom-field\":\"custom-value\"}]}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + string xml = nodeSet.Extensions![0].OuterXml; + Assert.That(xml, Does.Contain("ns123:ref")); + } + + [Test] + public void ReplaceAndApplyRoundTripsLinkExtrasForMappedLink() + { + byte[] docJson = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":" + + "[{\"rel\":\"uav:reference\",\"href\":\"urn:x\",\"vendor:score\":42}]}"); + using WotDocument document = WotDocument.Parse(docJson); + var nodeSet = new UANodeSet(); + var diagnostics = new List(); + + WotJsonResidue.Replace(nodeSet, document, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(diagnostics, Is.Empty); + Assert.That(nodeSet.Extensions, Is.Not.Null.And.Not.Empty); + + byte[] baseJson = WotTestData.Utf8( + "{\"title\":\"T\",\"links\":[{\"rel\":\"uav:reference\",\"href\":\"urn:x\"}]}"); + var applyDiagnostics = new List(); + byte[] result = WotJsonResidue.Apply( + baseJson, nodeSet, new WotNodeSetConverterOptions(), applyDiagnostics); + + Assert.That(applyDiagnostics, Is.Empty); + string resultStr = Encoding.UTF8.GetString(result); + Assert.That(resultStr, Does.Contain("vendor:score")); + } + + private static SysXmlElement CreateResidueExtension( + string version, + params SysXmlElement[] members) + { + var doc = new SysXmlDocument { XmlResolver = null }; + SysXmlElement root = doc.CreateElement("uav", "WoTJsonResidue", s_ns); + root.SetAttribute("Version", version); + foreach (SysXmlElement m in members) + { + root.AppendChild(doc.ImportNode(m, true)); + } + + return root; + } + + private static SysXmlElement CreateResidueMember( + string pointer, + string json, + string sha256Override = null) + { + var doc = new SysXmlDocument { XmlResolver = null }; + SysXmlElement member = doc.CreateElement("uav", "Member", s_ns); + member.SetAttribute("Pointer", pointer); + member.SetAttribute("Encoding", "base64"); + byte[] bytes = Encoding.UTF8.GetBytes(json); + member.SetAttribute("Sha256", sha256Override ?? ComputeSha256Hex(bytes)); + member.InnerText = Convert.ToBase64String(bytes); + return member; + } + + private static SysXmlElement CreateLinkResidueMember( + string rel, + string href, + string extrasJson, + string refId = null, + string refName = null) + { + var doc = new SysXmlDocument { XmlResolver = null }; + SysXmlElement member = doc.CreateElement("uav", "Member", s_ns); + member.SetAttribute("Pointer", "/links/-"); + member.SetAttribute("Encoding", "base64"); + member.SetAttribute("LinkRel", rel); + if (href != null) + { + member.SetAttribute("LinkHref", href); + } + + if (refId != null) + { + member.SetAttribute("LinkRefId", refId); + } + + if (refName != null) + { + member.SetAttribute("LinkRefName", refName); + } + + byte[] bytes = Encoding.UTF8.GetBytes(extrasJson); + member.SetAttribute("Sha256", ComputeSha256Hex(bytes)); + member.InnerText = Convert.ToBase64String(bytes); + return member; + } + + private static string ComputeSha256Hex(byte[] data) + { +#if NETFRAMEWORK + // SHA256.HashData is not available on .NET Framework. + using var sha = SHA256.Create(); + byte[] hash = sha.ComputeHash(data); +#else + byte[] hash = SHA256.HashData(data); +#endif + return string.Concat( + Array.ConvertAll(hash, b => b.ToString("x2", CultureInfo.InvariantCulture))); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotMappingAdditionalTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotMappingAdditionalTests.cs new file mode 100644 index 0000000000..a9f38c27bb --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotMappingAdditionalTests.cs @@ -0,0 +1,1933 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Additional coverage for WotNodeSetConverter.Mapping.cs paths not + /// exercised by the first two rounds of Wot tests. + /// + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotMappingAdditionalTests + { + private const string s_uavCtx = "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\""; + private const string s_wotCtx = "\"https://www.w3.org/2022/wot/td/v1.1\""; + + private static byte[] ThingModelJson(string extra = "") + { + string json = + "{\"@context\":[" + s_wotCtx + ",{" + s_uavCtx + "}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"" + + (string.IsNullOrEmpty(extra) ? string.Empty : "," + extra) + + "}"; + return Encoding.UTF8.GetBytes(json); + } + + private static byte[] ThingModelWithContextJson(string extraContext, string extra = "") + { + string json = + "{\"@context\":[" + s_wotCtx + ",{" + s_uavCtx + "," + extraContext + "}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"" + + (string.IsNullOrEmpty(extra) ? string.Empty : "," + extra) + + "}"; + return Encoding.UTF8.GetBytes(json); + } + + [Test] + public void FromNodeSetUAObjectRootEmitsObjectAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObject + { + NodeId = "ns=1;i=1", + BrowseName = "1:MyObj", + DisplayName = [new Export.LocalizedText { Value = "MyObj" }] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That( + document.TypeTokens.Contains("uav:object"), + Is.True, + "A UAObject root should produce @type uav:object."); + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingDescription)); + } + + [Test] + public void FromNodeSetUAVariableRootEmitsVariableAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAVariable + { + NodeId = "ns=1;i=2", + BrowseName = "1:MyVar", + DisplayName = [new Export.LocalizedText { Value = "MyVar" }], + DataType = "Double" + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That( + document.TypeTokens.Contains("uav:variable"), + Is.True, + "A UAVariable root should produce @type uav:variable."); + Assert.That(document.Kind, Is.EqualTo(WotDocumentKind.ThingDescription)); + } + + [Test] + public void FromNodeSetEmptyItemsProducesDefaultThingModelAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = [] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That( + document.TypeTokens.Contains("tm:ThingModel"), + Is.True, + "A null root (empty Items) should produce @type tm:ThingModel string."); + } + + [Test] + public void FromNodeSetDataTypeRootFallsToDefaultThingModelAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UADataType + { + NodeId = "ns=1;i=10", + BrowseName = "1:MyEnum", + DisplayName = [new Export.LocalizedText { Value = "MyEnum" }] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That( + document.TypeTokens.Contains("tm:ThingModel"), + Is.True, + "A UADataType root should fall through to the default @type tm:ThingModel."); + } + + [Test] + public void ToNodeSetAddsOrganizesReferenceForUavReferenceLink() + { + byte[] json = ThingModelJson( + "\"links\":[{\"rel\":\"uav:reference\",\"href\":\"i=47\"}]"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + bool hasOrganizes = root.References != null && + root.References.Any(r => + r.IsForward && + string.Equals(r.ReferenceType, "Organizes", StringComparison.Ordinal) && + string.Equals(r.Value, "i=47", StringComparison.Ordinal)); + Assert.That( + hasOrganizes, + Is.True, + "uav:reference link should synthesize an Organizes reference."); + } + + [Test] + public void ToNodeSetAddsHasComponentForUavComponentModelLink() + { + byte[] json = ThingModelJson( + "\"links\":[{\"rel\":\"uav:componentModel\",\"href\":\"i=58\"}]"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + bool hasHasComponent = root.References != null && + root.References.Any(r => + r.IsForward && + string.Equals(r.ReferenceType, "HasComponent", StringComparison.Ordinal) && + string.Equals(r.Value, "i=58", StringComparison.Ordinal)); + Assert.That( + hasHasComponent, + Is.True, + "uav:componentModel link should synthesize a HasComponent reference."); + } + + [Test] + public void ToNodeSetReportsCustomNamespaceRelationUnresolvable() + { + byte[] json = ThingModelWithContextJson( + "\"ns1\":\"urn:custom:ns\"", + "\"links\":[{\"rel\":\"ns1:MyRef\",\"href\":\"nsu=urn:custom:ns;i=99\"}]"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("ns1:MyRef", StringComparison.Ordinal)), + Is.True, + "A relation whose namespace is not OPC UA and has no refId fallback should produce a diagnostic."); + } + + [Test] + public void ToNodeSetAddsSuperTypeFromTmExtendsLink() + { + byte[] json = ThingModelJson( + "\"links\":[{\"rel\":\"tm:extends\",\"href\":\"nsu=urn:base;i=1\"}]"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + bool hasSupertype = root.References != null && + root.References.Any(r => + !r.IsForward && + string.Equals(r.ReferenceType, "HasSubtype", StringComparison.Ordinal)); + Assert.That( + hasSupertype, + Is.True, + "tm:extends with a NodeId href should produce a HasSubtype backward reference."); + } + + [Test] + public void ToNodeSetWarnsAboutNonNodeIdHrefWithoutResolver() + { + byte[] json = ThingModelJson( + "\"links\":[{\"rel\":\"uav:reference\",\"href\":\"https://example.com/other-thing\"}]"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.UnresolvedReference), + Is.True, + "A non-NodeId href without a resolver should produce an UnresolvedReference warning."); + } + + [Test] + public void ToNodeSetReportsAffordanceCountExceededWhenBudgetReached() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"prop1\":{\"type\":\"number\"}," + + "\"prop2\":{\"type\":\"string\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult( + document, + options: new WotNodeSetConverterOptions { MaxAffordanceCount = 1 }); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.AffordanceCountExceeded), + Is.True, + "Exceeding MaxAffordanceCount should produce an AffordanceCountExceeded diagnostic."); + } + + [Test] + public void ToNodeSetReportsMapToTypeNameWithPrefixNotInContext() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"uav:mapToTypeName\":\"ns1:SomeType\"," + + "\"uav:mapToType\":\"nsu=urn:test;i=1\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("ns1:SomeType", StringComparison.Ordinal)), + Is.True, + "A uav:mapToTypeName with a prefix not bound in @context should produce a diagnostic."); + } + + [Test] + public void ToNodeSetReportsNonStringCongruentTypeName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"uav:congruentTypeName\":42," + + "\"uav:congruentType\":\"nsu=urn:test;i=1\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ModelConceptUnresolved), + Is.True, + "A non-string uav:congruentTypeName should produce a ModelConceptUnresolved diagnostic."); + } + + [Test] + public void ToNodeSetWarnsAboutNumericPrefixedBrowseName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:browseName\":\"1:MyType\"," + + "\"properties\":{\"p1\":{\"uav:browseName\":\"1:Prop1\"}}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NonPortableQualifiedName), + Is.True, + "A uav:browseName with a numeric namespace index should produce a NonPortableQualifiedName warning."); + } + + [Test] + public void ToNodeSetReportsUnboundContextPrefixInBrowseName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{\"p1\":{\"uav:browseName\":\"unbound:Prop1\"}}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.NonPortableQualifiedName && + d.Message.Contains("unbound", StringComparison.Ordinal)), + Is.True, + "A uav:browseName with an unbound context prefix should produce a NonPortableQualifiedName error."); + } + + [Test] + public void ToNodeSetSynthesizesUaHasSubtypeRefViaContextNamespace() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"links\":[{\"rel\":\"ua:HasSubtype\",\"href\":\"i=58\",\"uav:refId\":\"i=45\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + bool hasForwardRef = root.References != null && + root.References.Any(r => + r.IsForward && + string.Equals(r.Value, "i=58", StringComparison.Ordinal)); + Assert.That( + hasForwardRef, + Is.True, + "A ua:HasSubtype link should add a forward reference pointing at the href target."); + } + + [Test] + public void ToNodeSetResolvesUaHasComponentRelViaContextNamespace() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"links\":[{\"rel\":\"ua:HasComponent\",\"href\":\"i=58\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + bool hasComponent = root.References != null && + root.References.Any(r => + r.IsForward && + string.Equals(r.Value, "i=58", StringComparison.Ordinal)); + Assert.That( + hasComponent, + Is.True, + "A ua:HasComponent link resolved via OPC UA context namespace should add a forward reference."); + } + + [Test] + public void ToNodeSetAppliesNsuBrowseNameViaNsu() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:browseName\":\"nsu=urn:test;MyType\"," + + "\"uav:id\":\"nsu=urn:test;i=5000\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + Assert.That(root, Is.Not.Null); + Assert.That( + root.BrowseName.Contains("MyType", StringComparison.Ordinal), + Is.True, + "nsu= browseName should produce a valid qualified name."); + } + + [Test] + public void ToNodeSetHandlesOpcUaNsBrowseNameWithNsu() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:browseName\":\"nsu=http://opcfoundation.org/UA/;BaseObjectType\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + Assert.That( + string.Equals(root.BrowseName, "BaseObjectType", StringComparison.Ordinal), + Is.True, + "nsu= form with OPC UA namespace should strip the prefix and keep only the local name."); + } + + [Test] + public void ToNodeSetSynthesizesEventAffordanceAsObjectType() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"events\":{\"alarm\":{\"uav:isEvent\":true,\"uav:browseName\":\"1:Alarm\"}}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + bool hasEventType = result.Value!.Items!.OfType().Count() >= 2; + Assert.That( + hasEventType, + Is.True, + "An event affordance should synthesize an additional UAObjectType in the NodeSet."); + } + + [Test] + public void ToNodeSetSynthesizesActionAffordanceAsUAMethod() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"actions\":{\"start\":{\"title\":\"Start\",\"uav:browseName\":\"1:Start\"}}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + bool hasMethod = result.Value!.Items!.OfType().Any(); + Assert.That( + hasMethod, + Is.True, + "An action affordance should synthesize a UAMethod node."); + } + + [Test] + public void ToNodeSetHandlesNsuMalformedBrowseName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:browseName\":\"nsu=malformed-no-semicolon\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NonPortableQualifiedName), + Is.True, + "A malformed nsu= browseName (no semicolon) should produce a NonPortableQualifiedName diagnostic."); + } + + [Test] + public void FromNodeSetObjectTypeNonEventEmitsObjectTypeArray() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=100", + BrowseName = "1:MyDeviceType", + DisplayName = [new Export.LocalizedText { Value = "MyDeviceType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + } + ] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That( + document.TypeTokens.Contains("uav:objectType"), + Is.True, + "A non-event UAObjectType root should produce uav:objectType in @type array."); + Assert.That( + document.TypeTokens.Contains("tm:ThingModel"), + Is.True, + "A non-event UAObjectType root should have tm:ThingModel in @type array."); + } + + [Test] + public void ToNodeSetSynthesizesDescriptionFromRootDescription() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"description\":\"A test device type.\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items!.OfType().First(); + Assert.That(root.Description, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void ToNodeSetWarnsAboutPropertyWithExternalSchema() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"data\":{\"uav:externalSchema\":\"https://example.com/schema.json\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedSchema), + Is.True, + "A property with uav:externalSchema should produce an UnsupportedSchema warning."); + } + + [Test] + public void ToNodeSetWarnsAboutObjectTypeDataSchema() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"config\":{\"type\":\"object\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedSchema), + Is.True, + "A property with type 'object' DataSchema should produce an UnsupportedSchema warning."); + } + + [Test] + public void ToNodeSetWarnsAboutArrayTypeDataSchema() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"items\":{\"type\":\"array\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedSchema), + Is.True, + "A property with type 'array' DataSchema should produce an UnsupportedSchema warning."); + } + + [Test] + public void ToNodeSetAddsModellingRuleForPropertyWithModellingRule() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"value\":{\"type\":\"number\",\"uav:modellingRule\":\"Mandatory\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable property = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(property, Is.Not.Null); + bool hasModellingRule = property!.References != null && + property.References.Any(r => + r.IsForward && + string.Equals(r.ReferenceType, "HasModellingRule", StringComparison.Ordinal)); + Assert.That( + hasModellingRule, + Is.True, + "A property with uav:modellingRule should add a HasModellingRule reference."); + } + + [Test] + public void ToNodeSetSynthesizesPropertyWithReadOnlyAccessLevel() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"reading\":{\"type\":\"number\",\"readOnly\":true}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable property = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(property, Is.Not.Null); + Assert.That(property!.AccessLevel & 1u, Is.Not.Zero, "ReadOnly=true should set AccessLevel read bit."); + Assert.That(property.AccessLevel & 2u, Is.Zero, "ReadOnly=true should not set the write bit."); + } + + [Test] + public void ToNodeSetSynthesizesPropertyWithWriteOnlyAccessLevel() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"command\":{\"type\":\"string\",\"writeOnly\":true}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable property = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(property, Is.Not.Null); + Assert.That(property!.AccessLevel & 2u, Is.Not.Zero, "WriteOnly=true should set AccessLevel write bit."); + Assert.That(property.AccessLevel & 1u, Is.Zero, "WriteOnly=true should not set the read bit."); + } + + [Test] + public void FromNodeSetVariableTypeEmitsPortableBrowseName() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=200", + BrowseName = "1:SensorType", + DisplayName = [new Export.LocalizedText { Value = "SensorType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasProperty", + IsForward = true, + Value = "ns=1;i=201" + } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=201", + BrowseName = "1:Temperature", + DisplayName = [new Export.LocalizedText { Value = "Temperature" }], + DataType = "Double", + AccessLevel = 1 + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Properties, Is.Not.Empty, + "A UAVariable child via HasProperty should produce a WoT property affordance."); + } + + [Test] + public void ToNodeSetReportsModelConceptConflictWhenRefIdDisagreesWithModelName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"links\":[{\"rel\":\"ua:HasComponent\",\"href\":\"i=58\",\"uav:refId\":\"i=99\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ModelConceptConflict), + Is.True, + "A ua:HasComponent link whose resolved NodeId disagrees with uav:refId should produce a ModelConceptConflict."); + } + + [Test] + public void ToNodeSetReportsEventAnnotationConflict() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"events\":{" + + "\"alarm\":{\"@type\":\"uav:eventType\",\"uav:isEvent\":false}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.EventAnnotationConflict), + Is.True, + "An event affordance with @type uav:eventType and uav:isEvent:false should produce EventAnnotationConflict."); + } + + [Test] + public void ToNodeSetDeriveModelUriFromNsuId() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:id\":\"nsu=urn:my:namespace;i=1\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + Assert.That( + result.Value!.NamespaceUris != null && + result.Value.NamespaceUris.Any( + ns => string.Equals(ns, "urn:my:namespace", StringComparison.Ordinal)), + Is.True, + "The model URI should be extracted from the nsu= form of uav:id."); + } + + [Test] + public void ToNodeSetDeriveModelUriFromDocumentId() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"id\":\"urn:example:my-model\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + bool hasExpectedNamespace = result.Value!.NamespaceUris != null && + result.Value.NamespaceUris.Any( + ns => string.Equals(ns, "urn:example:my-model", StringComparison.Ordinal)); + bool hasModelUri = result.Value.Models != null && + result.Value.Models.Any( + m => string.Equals(m.ModelUri, "urn:example:my-model", StringComparison.Ordinal)); + Assert.That( + hasExpectedNamespace || hasModelUri, + Is.True, + "The model URI should be derived from the document @id."); + } + + [Test] + public void FromNodeSetWriteOnlyVariableEmitsWriteOnlyAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=300", + BrowseName = "1:ActuatorType", + DisplayName = [new Export.LocalizedText { Value = "ActuatorType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasProperty", + IsForward = true, + Value = "ns=1;i=301" + } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=301", + BrowseName = "1:SetPoint", + DisplayName = [new Export.LocalizedText { Value = "SetPoint" }], + DataType = "Double", + AccessLevel = 2 + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Properties, Is.Not.Empty); + bool hasWriteOnly = document.RootElement.TryGetProperty("properties", out var props) && + props.EnumerateObject().Any(p => + p.Value.TryGetProperty("writeOnly", out var wo) && + wo.ValueKind == JsonValueKind.True); + Assert.That( + hasWriteOnly, + Is.True, + "A UAVariable with write-only AccessLevel should produce a writeOnly property."); + } + + [Test] + public void FromNodeSetDuplicateLocalBrowseNameGetsUniqueSuffix() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=400", + BrowseName = "1:MultiPropType", + DisplayName = [new Export.LocalizedText { Value = "MultiPropType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasProperty", + IsForward = true, + Value = "ns=1;i=401" + }, + new Reference + { + ReferenceType = "HasProperty", + IsForward = true, + Value = "ns=1;i=402" + } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=401", + BrowseName = "1:Value", + DisplayName = [new Export.LocalizedText { Value = "Value" }], + DataType = "Double", + AccessLevel = 1 + }, + new UAVariable + { + NodeId = "ns=1;i=402", + BrowseName = "1:Value", + DisplayName = [new Export.LocalizedText { Value = "Value" }], + DataType = "Double", + AccessLevel = 1 + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Properties, Has.Count.EqualTo(2), + "Two properties with the same local BrowseName should both appear with unique keys."); + } + + [Test] + public void ToNodeSetSynthesizesThingDescriptionAsUAObject() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":\"uav:object\"," + + "\"title\":\"SensorDevice\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + bool hasObject = result.Value!.Items!.OfType().Any(); + Assert.That( + hasObject, + Is.True, + "A ThingDescription with @type uav:object should synthesize a UAObject root."); + } + + [Test] + public void ToNodeSetReadOnlyAndWriteOnlyTogetherProducesReadAccess() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"val\":{\"type\":\"number\",\"readOnly\":true,\"writeOnly\":true}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable property = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(property, Is.Not.Null); + Assert.That( + property!.AccessLevel & 1u, + Is.Not.Zero, + "When both readOnly and writeOnly are true, read access should be preserved as a fallback."); + } + + [Test] + public void FromNodeSetEmitsEventAffordanceForGeneratesEventReference() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=500", + BrowseName = "1:AlarmSource", + DisplayName = [new Export.LocalizedText { Value = "AlarmSource" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "GeneratesEvent", + IsForward = true, + Value = "ns=1;i=501" + } + ] + }, + new UAObjectType + { + NodeId = "ns=1;i=501", + BrowseName = "1:AlarmType", + DisplayName = [new Export.LocalizedText { Value = "AlarmType" }] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Events, Has.Count.EqualTo(1), + "A GeneratesEvent reference to a node in the index should produce an event affordance."); + } + + [Test] + public void FromNodeSetEmitsActionAffordanceForUAMethod() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=600", + BrowseName = "1:RobotType", + DisplayName = [new Export.LocalizedText { Value = "RobotType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasComponent", + IsForward = true, + Value = "ns=1;i=601" + } + ] + }, + new UAMethod + { + NodeId = "ns=1;i=601", + BrowseName = "1:MoveArm", + DisplayName = [new Export.LocalizedText { Value = "MoveArm" }], + References = + [ + new Reference + { + ReferenceType = "HasComponent", + IsForward = false, + Value = "ns=1;i=600" + } + ] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Actions, Has.Count.EqualTo(1), + "A HasComponent reference to a UAMethod in the index should produce an action affordance."); + } + + [Test] + public void FromNodeSetEmitsTypedComponentLinksForHasOrderedComponent() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=700", + BrowseName = "1:ListType", + DisplayName = [new Export.LocalizedText { Value = "ListType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasOrderedComponent", + IsForward = true, + Value = "ns=1;i=701" + } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=701", + BrowseName = "1:Item", + DisplayName = [new Export.LocalizedText { Value = "Item" }], + DataType = "Double", + AccessLevel = 1 + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + bool hasComponentLink = document.Links.Any(l => + l.TryGetProperty("rel", out JsonElement rel) && + rel.GetString()!.StartsWith("ua:Has", StringComparison.Ordinal)); + Assert.That( + hasComponentLink, + Is.True, + "A HasOrderedComponent reference should produce a typed component link with rel=ua:HasOrderedComponent."); + } + + [Test] + public void ToNodeSetSynthesizesHasComponentArrayAsForwardReferences() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:hasComponent\":[\"i=47\",\"i=48\"]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UANode root1266 = result.Value!.Items?.FirstOrDefault(); + Assert.That(root1266, Is.Not.Null); + bool hasForwardComponents = root1266.References?.Any(r => + r.IsForward && string.Equals(r.ReferenceType, "HasComponent", StringComparison.Ordinal)) ?? false; + Assert.That( + hasForwardComponents, + Is.True, + "uav:hasComponent entries should become forward HasComponent references on the root node."); + } + + [Test] + public void ToNodeSetSynthesizesComponentOfArrayAsBackwardReferences() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:componentOf\":[\"i=200\"]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UANode root1290 = result.Value!.Items?.FirstOrDefault(); + Assert.That(root1290, Is.Not.Null); + bool hasBackwardComponent = root1290.References?.Any(r => + !r.IsForward && string.Equals(r.ReferenceType, "HasComponent", StringComparison.Ordinal)) ?? false; + Assert.That( + hasBackwardComponent, + Is.True, + "uav:componentOf entries should become backward HasComponent references on the root node."); + } + + [Test] + public void ToNodeSetEventAnnotationConflictDetectedWhenTypeIsArray() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"events\":{" + + "\"alarm\":{\"@type\":[\"uav:eventType\",\"saref:Event\"],\"uav:isEvent\":false}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.EventAnnotationConflict), + Is.True, + "An event with @type array containing uav:eventType and uav:isEvent:false should produce EventAnnotationConflict."); + } + + [Test] + public void ToNodeSetSanitizesSpecialCharTitleToNull() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"!@#$%\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UANode root1334 = result.Value!.Items?.FirstOrDefault(); + Assert.That(root1334, Is.Not.Null); + Assert.That( + root1334.BrowseName, + Does.Contain("Thing"), + "A title with only special chars should fall back to 'Thing' as the sanitized name."); + } + + [Test] + public void ToNodeSetDeriveModelUriDefaultsToSynthesized() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + bool hasSynthesizedUri = result.Value!.NamespaceUris?.Any( + ns => ns.Contains("opcua", StringComparison.OrdinalIgnoreCase) || + ns.Contains("synthesized", StringComparison.OrdinalIgnoreCase) || + ns.Contains("wot", StringComparison.OrdinalIgnoreCase)) ?? false; + Assert.That( + result.Value.NamespaceUris, + Is.Not.Null.And.Not.Empty, + "A ThingModel without a uav:id or @id should still get a model URI namespace."); + } + + [Test] + public void ToNodeSetLocalNameExtractedFromNsuBrowseName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"sensor\":{\"type\":\"number\"," + + "\"uav:browseName\":\"nsu=urn:example:ns;SensorValue\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable variable = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(variable, Is.Not.Null); + Assert.That( + variable.BrowseName, + Does.Contain("SensorValue"), + "Local name from nsu= browseName form should be 'SensorValue'."); + } + + [Test] + public void ToNodeSetLocalNameFallsBackToKeyWhenNsuBrowseNameHasNoSemicolon() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"mykey\":{\"type\":\"number\"," + + "\"uav:browseName\":\"nsu=urn:example:ns\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable variable = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(variable, Is.Not.Null, + "A property with nsu= browseName without semicolon should still produce a UAVariable."); + } + + [Test] + public void ToNodeSetSynthesizesActionWithTitle() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"actions\":{" + + "\"start\":{\"title\":\"Start Motor\",\"@type\":\"uav:method\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAMethod method = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(method, Is.Not.Null); + Assert.That( + method.DisplayName != null && method.DisplayName.Length > 0 && + method.DisplayName[0].Value == "Start Motor", + Is.True, + "An action with a title should populate the UAMethod DisplayName."); + } + + [Test] + public void ToNodeSetSynthesizesEventWithTitle() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"events\":{" + + "\"alarm\":{\"title\":\"High Temp Alarm\",\"uav:isEvent\":true}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType eventType = result.Value!.Items!.OfType() + .Skip(1).FirstOrDefault(); + Assert.That(eventType, Is.Not.Null); + Assert.That( + eventType.DisplayName != null && eventType.DisplayName.Length > 0 && + eventType.DisplayName[0].Value == "High Temp Alarm", + Is.True, + "An event affordance with a title should populate the UAObjectType DisplayName."); + } + + [Test] + public void FromNodeSetVariableWithNoDataTypeEmitsNoJsonType() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=800", + BrowseName = "1:SensorType", + DisplayName = [new Export.LocalizedText { Value = "SensorType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasProperty", + IsForward = true, + Value = "ns=1;i=801" + } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=801", + BrowseName = "1:RawValue", + DisplayName = [new Export.LocalizedText { Value = "RawValue" }], + DataType = "UnknownCustomType", + AccessLevel = 1 + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Properties, Is.Not.Empty); + bool hasTypeField = document.RootElement.TryGetProperty("properties", out var props) && + props.EnumerateObject().Any(p => + p.Value.TryGetProperty("type", out var _)); + Assert.That( + !hasTypeField, + Is.True, + "A property with an unrecognized DataType should not emit a JSON 'type' field."); + } + + [Test] + public void FromNodeSetVariableTypeRootEmitsVariableTypeModel() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAVariableType + { + NodeId = "ns=1;i=900", + BrowseName = "1:TemperatureVariableType", + DisplayName = [new Export.LocalizedText { Value = "TemperatureVariableType" }], + DataType = "Double", + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=62" + } + ] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + bool isVariableType = document.RootElement.TryGetProperty("@type", out JsonElement typeEl) && + typeEl.ValueKind == JsonValueKind.Array && + typeEl.EnumerateArray().Any(t => + t.ValueKind == JsonValueKind.String && + t.GetString() == "uav:variableType"); + Assert.That( + isVariableType, + Is.True, + "A UAVariableType root should produce @type containing 'uav:variableType'."); + } + + [Test] + public void ToNodeSetValidatesUndefinedUavBindingRelation() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"links\":[{\"rel\":\"uav:unknownBinding\",\"href\":\"i=47\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("uav:unknownBinding", StringComparison.Ordinal)), + Is.True, + "A link with a uav:-prefixed relation that is not a known binding relation should produce ModelConceptUnresolved."); + } + + [Test] + public void ToNodeSetValidatesUnboundNsRelationPrefix() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"links\":[{\"rel\":\"ns99:MyRefType\",\"href\":\"i=47\",\"uav:refId\":\"i=47\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("ns99:MyRefType", StringComparison.Ordinal)), + Is.True, + "A link with a ns: prefix not bound in @context should produce ModelConceptUnresolved."); + } + + [Test] + public void ToNodeSetValidatesMapToTypeNameRequiresMapToType() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"val\":{\"type\":\"number\"," + + "\"uav:mapToTypeName\":\"ua:AnalogItemType\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("uav:mapToTypeName", StringComparison.Ordinal) && + d.Message.Contains("uav:mapToType", StringComparison.Ordinal)), + Is.True, + "uav:mapToTypeName without uav:mapToType should produce ModelConceptUnresolved."); + } + + [Test] + public void ToNodeSetValidatesCongruentTypeNameRequiresCongruentType() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"val\":{\"type\":\"number\"," + + "\"uav:congruentTypeName\":\"ua:BaseDataVariableType\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("uav:congruentTypeName", StringComparison.Ordinal) && + d.Message.Contains("uav:congruentType", StringComparison.Ordinal)), + Is.True, + "uav:congruentTypeName without uav:congruentType should produce ModelConceptUnresolved."); + } + + [Test] + public void ToNodeSetSilentlyIgnoresExternalPrefixRelations() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"links\":[{\"rel\":\"https://example.org/rels/parent\",\"href\":\"i=47\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.All(d => d.Code != WotDiagnosticCode.ModelConceptUnresolved || + !d.Message.Contains("example.org", StringComparison.Ordinal)), + Is.True, + "A link with https:-prefixed rel should not trigger ModelConceptUnresolved."); + } + + [Test] + public void ToNodeSetWarnWhenHasComponentEntryUsesSessionLocalNsForm() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:hasComponent\":[\"ns=2;i=100\"]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.NonPortableIdentity && + d.Message.Contains("ns=2;i=100", StringComparison.Ordinal)), + Is.True, + "A uav:hasComponent entry with session-local ns= form should produce NonPortableIdentity warning."); + } + + [Test] + public void ToNodeSetWarnWhenHrefQueryIdUsesSessionLocalNsForm() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"links\":[{\"rel\":\"ua:HasComponent\"," + + "\"href\":\"https://example.org/td?id=ns=2;i=100\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.NonPortableIdentity && + d.Message.Contains("ns=2;i=100", StringComparison.Ordinal)), + Is.True, + "An href with ?id=ns= query should produce NonPortableIdentity warning."); + } + + [Test] + public void ToNodeSetQualifiedNameResolvesNsuOpcUaNamespaceToBareName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"val\":{\"type\":\"number\"," + + "\"uav:browseName\":\"nsu=http://opcfoundation.org/UA/;BaseDataVariableType\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable variable = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(variable, Is.Not.Null); + Assert.That( + variable.BrowseName, + Is.EqualTo("BaseDataVariableType"), + "nsu= with OPC UA namespace should strip the namespace and return just the local name."); + } + + [Test] + public void ToNodeSetNodeIdResolvesNsuOpcUaNamespaceToIdentifierOnly() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:id\":\"nsu=http://opcfoundation.org/UA/;i=1\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UANode root = result.Value!.Items?.FirstOrDefault(); + Assert.That(root, Is.Not.Null); + Assert.That( + root.NodeId, + Is.EqualTo("i=1"), + "nsu= with OPC UA namespace for uav:id should resolve to bare 'i=' form."); + } + + [Test] + public void ToNodeSetNodeIdResolvesNsuCustomNamespaceToIndexedForm() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"uav:id\":\"nsu=urn:custom:ns;i=42\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UANode root = result.Value!.Items?.FirstOrDefault(); + Assert.That(root, Is.Not.Null); + Assert.That( + root.NodeId, + Does.StartWith("ns=").And.EndWith(";i=42"), + "nsu= with custom namespace for uav:id should resolve to 'ns=;i=42' form."); + } + + [Test] + public void ToNodeSetQualifiedNameResolvesContextPrefixToOpcUaName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\"," + + "\"properties\":{" + + "\"val\":{\"type\":\"number\"," + + "\"uav:browseName\":\"ua:AnalogItemType\"}" + + "}}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAVariable variable = result.Value!.Items!.OfType().FirstOrDefault(); + Assert.That(variable, Is.Not.Null); + Assert.That( + variable.BrowseName, + Is.EqualTo("AnalogItemType"), + "ua: context prefix for OPC UA namespace should resolve to bare local name."); + } + + [Test] + public void FromNodeSetWritesDescriptionFromNode() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1000", + BrowseName = "1:MotorType", + DisplayName = [new Export.LocalizedText { Value = "MotorType" }], + Description = [new Export.LocalizedText { Value = "A type for electric motors." }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + } + ] + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + bool hasDescription = document.RootElement.TryGetProperty("description", out JsonElement desc) && + desc.ValueKind == JsonValueKind.String && + desc.GetString() == "A type for electric motors."; + Assert.That( + hasDescription, + Is.True, + "A UANode with a Description should emit a 'description' field in the WoT document."); + } + + [Test] + public void FromNodeSetPortableBrowseNameStripsNamespace0Prefix() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1100", + BrowseName = "1:SensorType", + DisplayName = [new Export.LocalizedText { Value = "SensorType" }], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + }, + new Reference + { + ReferenceType = "HasProperty", + IsForward = true, + Value = "ns=1;i=1101" + } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=1101", + BrowseName = "0:Namespace0Prop", + DisplayName = [new Export.LocalizedText { Value = "Namespace0Prop" }], + DataType = "Double", + AccessLevel = 1 + } + ] + }; + + WotConversionResult result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.Properties, Is.Not.Empty); + bool hasNs0BrowseName = document.RootElement.TryGetProperty("properties", out var props) && + props.EnumerateObject().Any(p => + p.Value.TryGetProperty("uav:browseName", out var bn) && + bn.GetString() == "Namespace0Prop"); + Assert.That( + hasNs0BrowseName, + Is.True, + "A BrowseName with namespace index 0 should produce a bare 'Name' portable browse name."); + } + } +} + + diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotMappingValidationTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotMappingValidationTests.cs new file mode 100644 index 0000000000..c6d7d554cd --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotMappingValidationTests.cs @@ -0,0 +1,392 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotMappingValidationTests + { + [Test] + public void FromNodeSetEmitsEventTypeAnnotationForEventTypeRoot() + { + UANodeSet nodeSet = CreateEventTypeNodeSet("OverTempType", "ns=1;i=1001"); + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That( + document.TypeTokens.Contains("uav:eventType"), + Is.True, + "Event type root should carry the uav:eventType annotation."); + Assert.That( + document.RootElement.GetProperty("uav:isEvent").GetBoolean(), + Is.True); + } + + [Test] + public void FromNodeSetEmitsEventTypeAnnotationRatherThanObjectType() + { + UANodeSet nodeSet = CreateEventTypeNodeSet("MyEventType", "ns=1;i=1002"); + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(document.TypeTokens.Contains("uav:objectType"), Is.False); + Assert.That(document.TypeTokens.Contains("uav:eventType"), Is.True); + } + + [Test] + public void ToNodeSetSynthesizesFromTitleWithSpecialCharacters() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"My Device (v2) - Test!\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + UAObjectType root = result.Value?.Items?.OfType().FirstOrDefault(); + Assert.That(root, Is.Not.Null); + string browseName = root!.BrowseName; + Assert.That(browseName, Is.Not.Null); + Assert.That( + browseName!.IndexOf(' ', StringComparison.Ordinal) < 0, + Is.True, + "BrowseName derived from SanitizeName should have no spaces."); + Assert.That( + browseName.IndexOf('(', StringComparison.Ordinal) < 0, + Is.True, + "BrowseName derived from SanitizeName should have no parentheses."); + } + + [Test] + public void ToNodeSetSynthesizesFromTitleWithAllSpecialChars() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"!@#$%^&*()=+[]{}|;':,./<>?\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + UAObjectType root = result.Value?.Items?.OfType().FirstOrDefault(); + Assert.That(root, Is.Not.Null); + Assert.That(root!.BrowseName, Is.Not.Null); + } + + [Test] + public void ToNodeSetSynthesizesHasComponentReferencesFromUavHasComponent() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"MyType\",\"uav:browseName\":\"1:MyType\"," + + "\"uav:hasComponent\":[\"nsu=urn:test;i=99\",\"nsu=urn:test;i=100\"]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items?.OfType().FirstOrDefault(); + Assert.That(root, Is.Not.Null); + var forwardRefs = root!.References? + .Where(r => r.IsForward && r.ReferenceType == "HasComponent") + .ToList(); + Assert.That(forwardRefs, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void ToNodeSetSynthesizesComponentOfReferences() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"MyType\",\"uav:browseName\":\"1:MyType\"," + + "\"uav:componentOf\":[\"nsu=urn:test;i=50\"]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items?.OfType().FirstOrDefault(); + Assert.That(root, Is.Not.Null); + var backwardRefs = root!.References? + .Where(r => !r.IsForward && r.ReferenceType == "HasComponent") + .ToList(); + Assert.That(backwardRefs, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void ToNodeSetReportsUndefinedUavRelationInLink() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"links\":[{\"rel\":\"uav:unknownBindingRel\",\"href\":\"urn:x\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("uav:unknownBindingRel", StringComparison.Ordinal)), + Is.True, + "An undefined uav:-prefixed relation should produce a diagnostic."); + } + + [Test] + public void ToNodeSetReportsUnboundPrefixInLinkRelation() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"links\":[{\"rel\":\"unbound:SomeRel\",\"href\":\"urn:x\",\"uav:refId\":\"i=47\"}]}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved), + Is.True, + "A non-HTTP/URN relation with an unbound prefix should produce a diagnostic."); + } + + [Test] + public void ToNodeSetReportsMapToTypeNameNotCompactModelName() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"uav:mapToTypeName\":\"not-a-compact-name\"," + + "\"uav:mapToType\":\"i=58\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved), + Is.True, + "A uav:mapToTypeName that is not a compact model name should produce a diagnostic."); + } + + [Test] + public void ToNodeSetReportsMapToTypeNameMissingDefinitiveMember() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"uav:mapToTypeName\":\"ua:BaseObjectType\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("uav:mapToType", StringComparison.Ordinal)), + Is.True, + "uav:mapToTypeName without the required uav:mapToType should produce a diagnostic."); + } + + [Test] + public void FromNodeSetRoundTripPreservesEventTypeIsEvent() + { + UANodeSet source = CreateEventTypeNodeSet("AlertType", "ns=1;i=2001"); + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + UAObjectType root = result.Value!.Items?.OfType().FirstOrDefault(); + Assert.That(root, Is.Not.Null); + Assert.That(root!.BrowseName, Is.EqualTo("1:AlertType")); + } + + [Test] + public void ToNodeSetSynthesizesVariableTypeRootAsObjectType() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:variableType\"]," + + "\"title\":\"SpeedType\",\"uav:browseName\":\"1:SpeedType\"," + + "\"uav:id\":\"nsu=urn:test;i=3001\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + Assert.That( + result.Value!.Items?.OfType().Any(), + Is.True, + "A uav:variableType ThingModel currently synthesizes as a UAObjectType."); + } + + [Test] + public void FromNodeSetVariableTypeEmitsVariableTypeAnnotation() + { + var nodeSet = new UANodeSet + { + NamespaceUris = ["urn:test"], + Models = [new ModelTableEntry { ModelUri = "urn:test" }], + Items = + [ + new UAVariableType + { + NodeId = "ns=1;i=3001", + BrowseName = "1:SpeedType", + DisplayName = [new Export.LocalizedText { Value = "SpeedType" }], + DataType = "Double", + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=62" + } + ] + } + ] + }; + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + nodeSet, + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }); + + Assert.That(document.TypeTokens.Contains("uav:variableType"), Is.True); + } + + [Test] + public void ToNodeSetReportsCongruentTypeNameMissingDefinitiveMember() + { + byte[] json = WotTestData.Utf8( + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"uav:congruentTypeName\":\"ua:BaseObjectType\"}"); + + using WotDocument document = WotDocument.Parse(json); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => + d.Code == WotDiagnosticCode.ModelConceptUnresolved && + d.Message.Contains("uav:congruentType", StringComparison.Ordinal)), + Is.True, + "uav:congruentTypeName without the required uav:congruentType should produce a diagnostic."); + } + + private static UANodeSet CreateEventTypeNodeSet(string browseName, string nodeId) + { + return new UANodeSet + { + NamespaceUris = ["urn:test:model"], + Models = + [ + new ModelTableEntry + { + ModelUri = "urn:test:model", + Version = "1.0.0" + } + ], + Items = + [ + new UAObjectType + { + NodeId = nodeId, + BrowseName = "1:" + browseName, + DisplayName = + [ + new Export.LocalizedText { Value = browseName } + ], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=2041" + } + ] + } + ] + }; + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotNativeFirstRoundtripTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotNativeFirstRoundtripTests.cs new file mode 100644 index 0000000000..cfd6e4aa0a --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotNativeFirstRoundtripTests.cs @@ -0,0 +1,371 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotNativeFirstRoundtripTests + { + [Test] + public void CompleteReadableMappingOmitsStructuredFallback() + { + var source = new UANodeSet + { + NamespaceUris = ["urn:test:readable"], + Models = [new ModelTableEntry { ModelUri = "urn:test:readable" }], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;s=ReadableType", + BrowseName = "1:ReadableType", + DisplayName = + [ + new Opc.Ua.Export.LocalizedText + { + Value = "ReadableType" + } + ], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + } + ] + } + ] + }; + + using WotDocument document = WotNodeSetConverter.FromNodeSet(source); + + Assert.That(document.TryGetNativeProjection(out _), Is.False); + Assert.That(document.TryGetEnvelope(out _), Is.False); + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document); + Assert.That(NodeSetComparer.Compare(source, restored).AreEquivalent, Is.True); + } + + [Test] + public void IncompleteReadableMappingUsesStructuredFallbackWithoutEnvelope() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + + using WotDocument document = WotNodeSetConverter.FromNodeSet(source); + + Assert.That(document.TryGetNativeProjection(out JsonElement projection), Is.True); + Assert.That( + projection.GetProperty("profileVersion").GetString(), + Is.EqualTo("1.0")); + Assert.That(document.TryGetEnvelope(out _), Is.False); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document); + NodeSetComparisonResult comparison = NodeSetComparer.Compare(source, restored); + Assert.That( + comparison.AreEquivalent, + Is.True, + string.Join("; ", comparison.Differences)); + } + + [Test] + public void NeverModeProvesCompleteSchemaRoundtripWithoutFallback() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + var options = new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }; + + WotConversionResult result = + WotNodeSetConverter.FromNodeSetResult(source, options: options); + + Assert.That(result.HasErrors, Is.False); + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.TryGetEnvelope(out _), Is.False); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document, options); + Assert.That( + WotTestData.Serialize(restored), + Is.EqualTo(WotTestData.Serialize(source))); + } + + [Test] + public void WhenRequiredFallsBackOnlyWhenNativeProjectionIsBounded() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + var fallback = new WotNodeSetConverterOptions + { + MaxNodeCount = 1, + PreservationMode = WotNodeSetPreservationMode.WhenRequired + }; + + WotConversionResult result = + WotNodeSetConverter.FromNodeSetResult(source, options: fallback); + + Assert.That(result.HasErrors, Is.False); + Assert.That(result.Value, Is.Not.Null); + using WotDocument document = result.Value!; + Assert.That(document.TryGetEnvelope(out _), Is.True); + Assert.That( + result.Diagnostics.Any( + d => d.Code == WotDiagnosticCode.NativeProjectionIncomplete), + Is.True); + + var nativeOnly = new WotNodeSetConverterOptions + { + MaxNodeCount = 1, + PreservationMode = WotNodeSetPreservationMode.Never + }; + WotConversionResult rejected = + WotNodeSetConverter.FromNodeSetResult(source, options: nativeOnly); + Assert.That(rejected.Value, Is.Null); + Assert.That(rejected.HasErrors, Is.True); + } + + [Test] + public void UnknownJsonLdResidueSurvivesTwoEnvelopeFreeRoundtrips() + { + const string json = + "{" + + "\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"vendor\":\"urn:vendor:\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"vendor:root\":{\"b\":2,\"a\":1}," + + "\"properties\":{\"speed\":{" + + "\"@type\":\"uav:variableType\",\"uav:browseName\":\"1:Speed\"," + + "\"type\":\"number\",\"readOnly\":true,\"observable\":true," + + "\"forms\":[{\"href\":\"opc.tcp://example.test:4840\"," + + "\"op\":[\"readproperty\"]}]," + + "\"vendor:quality\":{\"mode\":\"good\"}}}}"; + + UANodeSet firstNodeSet = + WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + Assert.That( + firstNodeSet.Extensions!.Any(e => + e.LocalName == "WoTJsonResidue" && + e.NamespaceURI == WotNodeSetConverter.VocabularyNamespace), + Is.True); + + using WotDocument first = WotNodeSetConverter.FromNodeSet(firstNodeSet); + Assert.That(first.TryGetEnvelope(out _), Is.False); + AssertResidue(first); + + UANodeSet secondNodeSet = WotNodeSetConverter.ToNodeSet(first); + using WotDocument second = WotNodeSetConverter.FromNodeSet(secondNodeSet); + Assert.That(second.TryGetEnvelope(out _), Is.False); + AssertResidue(second); + } + + [Test] + public void ContextAndMappedLinkResidueUseStableSelectors() + { + const string json = + "{" + + "\"@context\":[{\"vendor\":\"urn:vendor:\"}," + + "\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"extra\":\"urn:extra:\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"links\":[{\"rel\":\"tm:extends\"," + + "\"href\":\"nsu=urn:base;i=1001\",\"hreflang\":\"en\"}]}"; + + UANodeSet nodeSet = + WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + using WotDocument restored = WotNodeSetConverter.FromNodeSet(nodeSet); + + JsonElement context = restored.RootElement.GetProperty("@context"); + Assert.That( + context[1].GetProperty("extra").GetString(), + Is.EqualTo("urn:extra:")); + Assert.That( + context.EnumerateArray().Any(item => + item.ValueKind == JsonValueKind.Object && + item.TryGetProperty("vendor", out JsonElement vendor) && + vendor.GetString() == "urn:vendor:"), + Is.True); + + JsonElement links = restored.RootElement.GetProperty("links"); + Assert.That(links.GetArrayLength(), Is.EqualTo(1)); + Assert.That(links[0].GetProperty("rel").GetString(), Is.EqualTo("tm:extends")); + Assert.That( + links[0].GetProperty("href").GetString(), + Is.EqualTo("nsu=urn:base;i=1001")); + Assert.That(links[0].GetProperty("hreflang").GetString(), Is.EqualTo("en")); + + UANodeSet secondNodeSet = WotNodeSetConverter.ToNodeSet(restored); + using WotDocument second = WotNodeSetConverter.FromNodeSet(secondNodeSet); + JsonElement secondLink = second.RootElement.GetProperty("links")[0]; + Assert.That(secondLink.GetProperty("rel").GetString(), Is.EqualTo("tm:extends")); + Assert.That(secondLink.GetProperty("hreflang").GetString(), Is.EqualTo("en")); + } + + [Test] + public void ResidueHonorsConfiguredDepthAboveFrameworkDefault() + { + const int depth = 70; + var nested = new StringBuilder(); + for (int ii = 0; ii < depth; ii++) + { + nested.Append("{\"next\":"); + } + nested.Append("\"leaf\""); + for (int ii = 0; ii < depth; ii++) + { + nested.Append('}'); + } + + string json = + "{" + + "\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"DeepType\",\"uav:browseName\":\"1:DeepType\"," + + "\"vendor:deep\":" + nested + "}"; + var options = new WotNodeSetConverterOptions { MaxJsonDepth = 96 }; + + using WotDocument source = WotDocument.Parse( + Encoding.UTF8.GetBytes(json), + options); + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(source, options); + using WotDocument restored = + WotNodeSetConverter.FromNodeSet(nodeSet, options: options); + + JsonElement current = restored.RootElement.GetProperty("vendor:deep"); + for (int ii = 0; ii < depth; ii++) + { + current = current.GetProperty("next"); + } + Assert.That(current.GetString(), Is.EqualTo("leaf")); + } + + [Test] + public void ResiduePointerBeyondConfiguredDepthProducesDiagnostic() + { + const string json = + "{" + + "\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"BoundedType\",\"uav:browseName\":\"1:BoundedType\"," + + "\"vendor:value\":1}"; + + UANodeSet nodeSet = + WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + System.Xml.XmlElement residue = nodeSet.Extensions!.Single(e => + e.LocalName == "WoTJsonResidue"); + System.Xml.XmlElement member = residue.ChildNodes + .OfType() + .Single(); + member.SetAttribute("Pointer", string.Concat(Enumerable.Repeat("/x", 12))); + + var options = new WotNodeSetConverterOptions { MaxJsonDepth = 8 }; + WotConversionResult result = null; + Assert.That( + () => result = WotNodeSetConverter.FromNodeSetResult( + nodeSet, + options: options), + Throws.Nothing); + using WotDocument document = result!.Value!; + Assert.That(result.HasErrors, Is.True); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ResidueInvalid), + Is.True); + } + + [Test] + public void ResidueUsesSameAffordanceCollisionKeysAsReadableMapping() + { + const string json = + "{" + + "\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\",{" + + "\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"CollisionType\",\"uav:browseName\":\"1:CollisionType\"," + + "\"properties\":{" + + "\"first\":{\"uav:browseName\":\"1:Temp\",\"type\":\"number\"," + + "\"vendor:value\":\"first\"}," + + "\"second\":{\"uav:browseName\":\"2:Temp\",\"type\":\"number\"," + + "\"vendor:value\":\"second\"}}}"; + + UANodeSet nodeSet = + WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json)); + using WotDocument restored = WotNodeSetConverter.FromNodeSet(nodeSet); + + JsonElement properties = restored.RootElement.GetProperty("properties"); + Assert.That( + properties.GetProperty("Temp").GetProperty("vendor:value").GetString(), + Is.EqualTo("first")); + Assert.That( + properties.GetProperty("Temp_2").GetProperty("vendor:value").GetString(), + Is.EqualTo("second")); + } + + private static void AssertResidue(WotDocument document) + { + JsonElement root = document.RootElement; + Assert.That( + root.GetProperty("vendor:root").GetProperty("b").GetInt32(), + Is.EqualTo(2)); + + JsonElement speed = root + .GetProperty("properties") + .GetProperty("Speed"); + Assert.That( + speed.TryGetProperty("vendor:quality", out JsonElement quality), + Is.True, + Encoding.UTF8.GetString(document.Utf8Json.ToArray())); + Assert.That( + quality.GetProperty("mode").GetString(), + Is.EqualTo("good")); + Assert.That( + speed.GetProperty("forms")[0].GetProperty("op")[0].GetString(), + Is.EqualTo("readproperty")); + + JsonElement context = root.GetProperty("@context"); + Assert.That( + context[1].GetProperty("vendor").GetString(), + Is.EqualTo("urn:vendor:")); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotNativeProjectionErrorTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotNativeProjectionErrorTests.cs new file mode 100644 index 0000000000..1ee2e4d0f4 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotNativeProjectionErrorTests.cs @@ -0,0 +1,379 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotNativeProjectionErrorTests + { + [Test] + public void ReadRejectsProjectionWithWrongAtType() + { + using JsonDocument doc = Parse( + "{\"@type\":\"wrong:type\",\"profileVersion\":\"1.0\",\"nodes\":[]}"); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadRejectsProjectionThatIsNotAnObject() + { + using JsonDocument doc = Parse("[\"notAnObject\"]"); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadRejectsProjectionWithWrongVersion() + { + using JsonDocument doc = Parse( + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"99.0\",\"nodes\":[]}"); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadRejectsMissingNodesArray() + { + using JsonDocument doc = Parse( + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"}"); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadRejectsNodesPropertyThatIsNotAnArray() + { + using JsonDocument doc = Parse( + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\",\"nodes\":{}}"); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadEnforcesNodeCountLimit() + { + string twoNodes = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"nodes\":[" + + "{\"nodeClass\":\"ObjectType\",\"nodeId\":\"ns=1;i=1001\",\"browseName\":\"1:A\"}," + + "{\"nodeClass\":\"ObjectType\",\"nodeId\":\"ns=1;i=1002\",\"browseName\":\"1:B\"}" + + "]}"; + + using JsonDocument doc = Parse(twoNodes); + var options = new WotNodeSetConverterOptions { MaxNodeCount = 1 }; + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read(doc.RootElement, options, diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NodeCountExceeded), + Is.True); + } + + [Test] + public void ReadRejectsUnknownNodeClass() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"nodes\":[{\"nodeClass\":\"UnknownClass\",\"nodeId\":\"ns=1;i=1001\"}]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadReportsInvalidAliasEntryMissingAlias() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"aliases\":[{\"value\":\"i=47\"}]," + + "\"nodes\":[]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True, + "An alias entry missing the 'alias' field should produce a diagnostic."); + } + + [Test] + public void ReadReportsInvalidAliasEntryMissingValue() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"aliases\":[{\"alias\":\"MyAlias\"}]," + + "\"nodes\":[]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True, + "An alias entry missing the 'value' field should produce a diagnostic."); + } + + [Test] + public void ReadRoundTripsAllNodeClasses() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + byte[] projectionJson = WotNativeProjection.Write( + source, + new WotNodeSetConverterOptions(), + new List()); + + using JsonDocument doc = JsonDocument.Parse(projectionJson); + var diagnostics = new List(); + + UANodeSet restored = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(restored, Is.Not.Null); + Assert.That(diagnostics.Any(d => d.Severity == WotDiagnosticSeverity.Error), Is.False); + Assert.That(restored!.Items, Has.Length.EqualTo(source.Items!.Length)); + } + + [Test] + public void ReadHandlesMalformedXmlInNodeExtensions() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + byte[] projectionJson = WotNativeProjection.Write( + source, + new WotNodeSetConverterOptions(), + new List()); + + string projectionText = Encoding.UTF8.GetString(projectionJson); + + int extensionsIdx = projectionText.IndexOf( + "\"extensions\"", + System.StringComparison.Ordinal); + + string patchedText; + if (extensionsIdx < 0) + { + string objectTypePattern = "\"nodeClass\": \"ObjectType\""; + int ot = projectionText.IndexOf(objectTypePattern, System.StringComparison.Ordinal); + Assert.That(ot, Is.GreaterThan(0)); + string insertionJson = + ",\"extensions\":[\"\"]"; + patchedText = string.Concat( + projectionText.Substring(0, ot + objectTypePattern.Length), + insertionJson, + projectionText.Substring(ot + objectTypePattern.Length)); + } + else + { + patchedText = projectionText; + } + + using JsonDocument doc = JsonDocument.Parse(patchedText); + var diagnostics = new List(); + + WotNativeProjection.Read(doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(patchedText, Is.Not.Empty); + } + + [Test] + public void ReadAcceptsValidAliasArray() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"aliases\":[{\"alias\":\"HasComponent\",\"value\":\"i=47\"}," + + "{\"alias\":\"Organizes\",\"value\":\"i=35\"}]," + + "\"nodes\":[]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Not.Null); + Assert.That(diagnostics.Any(d => d.Severity == WotDiagnosticSeverity.Error), Is.False); + Assert.That(result!.Aliases, Is.Not.Null); + Assert.That(result.Aliases, Has.Length.EqualTo(2)); + } + + [Test] + public void ReadRejectsProjectionWithNullAtType() + { + using JsonDocument doc = Parse( + "{\"profileVersion\":\"1.0\",\"nodes\":[]}"); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Null); + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True); + } + + [Test] + public void ReadAcceptsEmptyNodesArray() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\",\"nodes\":[]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Not.Null); + Assert.That(diagnostics.Any(d => d.Severity == WotDiagnosticSeverity.Error), Is.False); + Assert.That(result!.Items, Is.Empty); + } + + [Test] + public void ReadAcceptsValidDataTypeNode() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"nodes\":[{" + + "\"nodeClass\":\"DataType\"," + + "\"nodeId\":\"ns=1;i=3001\"," + + "\"browseName\":\"1:MyMode\"," + + "\"definition\":{" + + "\"name\":\"1:MyMode\"," + + "\"fields\":[{\"name\":\"Stopped\",\"value\":0}," + + "{\"name\":\"Running\",\"value\":1}]}" + + "}]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + UANodeSet result = WotNativeProjection.Read( + doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That(result, Is.Not.Null); + UADataType dt = result!.Items?.OfType().FirstOrDefault(); + Assert.That(dt, Is.Not.Null); + Assert.That(dt!.Definition, Is.Not.Null); + Assert.That(dt.Definition!.Field, Has.Length.EqualTo(2)); + } + + [Test] + public void ReadReportsDataTypeDefinitionFieldMissingName() + { + string json = + "{\"@type\":\"uav:NodeModel\",\"profileVersion\":\"1.0\"," + + "\"nodes\":[{" + + "\"nodeClass\":\"DataType\"," + + "\"nodeId\":\"ns=1;i=3001\"," + + "\"browseName\":\"1:Mode\"," + + "\"definition\":{" + + "\"name\":\"1:Mode\"," + + "\"fields\":[{\"value\":0}]}" + + "}]}"; + + using JsonDocument doc = Parse(json); + var diagnostics = new List(); + + WotNativeProjection.Read(doc.RootElement, new WotNodeSetConverterOptions(), diagnostics); + + Assert.That( + diagnostics.Any(d => d.Code == WotDiagnosticCode.NativeProjectionInvalid), + Is.True, + "A DataType definition field missing 'name' should produce a diagnostic."); + } + + private static JsonDocument Parse(string json) + { + return JsonDocument.Parse(json); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotNativeProjectionTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotNativeProjectionTests.cs new file mode 100644 index 0000000000..979befc2cb --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotNativeProjectionTests.cs @@ -0,0 +1,172 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotNativeProjectionTests + { + [Test] + public void NativeProjectionReconstructsNodeSetWithoutEnvelope() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + byte[] json = BuildNativeOnlyDocument(source); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(json); + + NodeSetComparisonResult comparison = NodeSetComparer.Compare(source, restored); + Assert.That( + comparison.AreEquivalent, + Is.True, + string.Join("; ", comparison.Differences)); + } + + [Test] + public void NativeReconstructionPreservesNodeClassesAndReferences() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + byte[] json = BuildNativeOnlyDocument(source); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(json); + + Assert.That(restored.Items, Has.Length.EqualTo(3)); + UAVariable variable = restored.Items!.OfType().Single(); + Assert.That(variable.BrowseName, Is.EqualTo("1:PumpSpeed")); + Assert.That(variable.DataType, Is.EqualTo("Double")); + Assert.That(variable.AccessLevel, Is.EqualTo(3)); + Assert.That( + variable.References!.Any(r => + r.ReferenceType == "HasModellingRule" && r.Value == "i=78"), + Is.True); + + UAMethod method = restored.Items!.OfType().Single(); + Assert.That(method.BrowseName, Is.EqualTo("1:Reset")); + } + + [Test] + public void NativeReconstructionIsDeterministic() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + byte[] json = BuildNativeOnlyDocument(source); + + UANodeSet first = WotNodeSetConverter.ToNodeSet(json); + UANodeSet second = WotNodeSetConverter.ToNodeSet(json); + + Assert.That(WotTestData.Serialize(first), Is.EqualTo(WotTestData.Serialize(second))); + } + + [Test] + public void NativeProjectionExposesDerivedTypeInformation() + { + UANodeSet source = WotTestData.CreateReconstructableNodeSet(); + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: NativeOnly()); + JsonElement nodes = document.RootElement + .GetProperty("uav:nodes") + .GetProperty("nodes"); + + JsonElement variable = nodes.EnumerateArray() + .Single(n => n.GetProperty("nodeClass").GetString() == "Variable"); + Assert.That(variable.GetProperty("typeDefinition").GetString(), Is.EqualTo("i=63")); + Assert.That(variable.GetProperty("modellingRule").GetString(), Is.EqualTo("Mandatory")); + + JsonElement objectType = nodes.EnumerateArray() + .Single(n => n.GetProperty("nodeClass").GetString() == "ObjectType"); + Assert.That(objectType.GetProperty("superType").GetString(), Is.EqualTo("i=58")); + } + + [Test] + public void NativeReconstructionPreservesReferenceTypeInverseName() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + byte[] json = BuildNativeOnlyDocument(source); + + UANodeSet restored = WotNodeSetConverter.ToNodeSet(json); + + UAReferenceType referenceType = restored.Items!.OfType().Single(); + Assert.That(referenceType.BrowseName, Is.EqualTo("1:Controls")); + Assert.That(referenceType.Symmetric, Is.False); + // The InverseName must be restored exactly, not silently dropped. + Assert.That(referenceType.InverseName, Is.Not.Null, + "A non-symmetric ReferenceType must retain its InverseName across the native projection."); + Assert.That(referenceType.InverseName!, Has.Length.EqualTo(1)); + Assert.That(referenceType.InverseName[0].Value, Is.EqualTo("IsControlledBy")); + } + + [Test] + public void NativeReconstructionPreservesLocalizedInverseName() + { + UANodeSet source = WotTestData.CreateRichNodeSet(); + UAReferenceType sourceReference = source.Items!.OfType().Single(); + // Exercise the localized-entry path: a locale plus a second entry. + sourceReference.InverseName = + [ + new Export.LocalizedText { Locale = "en", Value = "IsControlledBy" }, + new Export.LocalizedText { Locale = "de", Value = "WirdGesteuertVon" } + ]; + + byte[] json = BuildNativeOnlyDocument(source); + UANodeSet restored = WotNodeSetConverter.ToNodeSet(json); + + UAReferenceType referenceType = restored.Items!.OfType().Single(); + Assert.That(referenceType.InverseName!, Has.Length.EqualTo(2)); + Assert.That(referenceType.InverseName![0].Locale, Is.EqualTo("en")); + Assert.That(referenceType.InverseName[0].Value, Is.EqualTo("IsControlledBy")); + Assert.That(referenceType.InverseName[1].Locale, Is.EqualTo("de")); + Assert.That(referenceType.InverseName[1].Value, Is.EqualTo("WirdGesteuertVon")); + } + + private static byte[] BuildNativeOnlyDocument(UANodeSet source) + { + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: NativeOnly()); + Assert.That(document.TryGetEnvelope(out _), Is.False); + return document.Utf8Json.ToArray(); + } + + private static WotNodeSetConverterOptions NativeOnly() + { + return new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Never + }; + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotNodeSetConverterTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotNodeSetConverterTests.cs new file mode 100644 index 0000000000..2d14c79a8c --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotNodeSetConverterTests.cs @@ -0,0 +1,180 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text; +using System.Xml; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotNodeSetConverterTests + { + [Test] + public void PreservationEnvelopeRoundTripsCanonicalNodeSet() + { + UANodeSet source = CreateNodeSet(); + + using WotDocument document = WotNodeSetConverter.FromNodeSet( + source, + options: AlwaysPreserve()); + UANodeSet restored = WotNodeSetConverter.ToNodeSet(document); + + Assert.That(Write(restored), Is.EqualTo(Write(source))); + Assert.That( + document.RootElement.GetProperty("uav:nodeSet").GetProperty("encoding").GetString(), + Is.EqualTo("base64")); + } + + [Test] + public void GeneratedEnvelopeIsDeterministic() + { + UANodeSet source = CreateNodeSet(); + + using WotDocument first = WotNodeSetConverter.FromNodeSet( + source, + options: AlwaysPreserve()); + using WotDocument second = WotNodeSetConverter.FromNodeSet( + source, + options: AlwaysPreserve()); + + Assert.That(first.Utf8Json.ToArray(), Is.EqualTo(second.Utf8Json.ToArray())); + } + + [Test] + public void WotDocumentPreservesUnknownMembersLexically() + { + byte[] json = Encoding.UTF8.GetBytes( + /*lang=json,strict*/ + "{\"@context\":[],\"title\":\"T\",\"vendor:unknown\":{\"b\":2,\"a\":1}}"); + + using var document = WotDocument.Parse(json); + using var output = new MemoryStream(); + document.Write(output); + + Assert.That(output.ToArray(), Is.EqualTo(json)); + } + + [Test] + public void DigestMismatchIsRejected() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet( + CreateNodeSet(), + options: AlwaysPreserve()); + string json = Encoding.UTF8.GetString(document.Utf8Json.ToArray()); + const string marker = "\"data\": \""; + int valueIndex = json.IndexOf(marker, StringComparison.Ordinal) + marker.Length; + char[] characters = json.ToCharArray(); + characters[valueIndex] = characters[valueIndex] == 'A' ? 'B' : 'A'; + json = new string(characters); + + Assert.Throws( + () => WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(json))); + } + + private static UANodeSet CreateNodeSet() + { + var xml = new XmlDocument(); + System.Xml.XmlElement extension = xml.CreateElement("test", "Metadata", "urn:test"); + extension.SetAttribute("key", "value"); + extension.InnerText = "payload"; + + return new UANodeSet + { + NamespaceUris = ["urn:test:model"], + Models = + [ + new ModelTableEntry + { + ModelUri = "urn:test:model", + Version = "1.0.0", + PublicationDate = new DateTime(2026, 7, 20, 0, 0, 0, DateTimeKind.Utc), + PublicationDateSpecified = true + } + ], + Extensions = [extension], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1001", + BrowseName = "1:MachineType", + SymbolicName = "MachineType", + DisplayName = + [ + new Export.LocalizedText + { + Value = "MachineType" + } + ], + Description = + [ + new Export.LocalizedText + { + Locale = "en", + Value = "A test type." + } + ], + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=58" + } + ] + } + ] + }; + } + + private static WotNodeSetConverterOptions AlwaysPreserve() + { + return new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Always + }; + } + + private static byte[] Write(UANodeSet nodeSet) + { + using var stream = new MemoryStream(); + nodeSet.Write(stream); + return stream.ToArray(); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotResolverAdditionalTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotResolverAdditionalTests.cs new file mode 100644 index 0000000000..6eeee0b399 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotResolverAdditionalTests.cs @@ -0,0 +1,299 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Additional tests for WotResolver covering NullWotResolver interface methods, + /// WotResolverOptions validation, WotResolutionContext state properties, + /// WotResolverResult factory methods, and resolution kind messaging. + /// + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotResolverAdditionalTests + { + [Test] + public async Task NullResolverContextReturnsNotFound() + { + var context = new WotResolutionContext(); + WotResolverResult result = await NullWotResolver.Instance.ResolveContextAsync( + "https://example.com/ctx.jsonld", + context, + CancellationToken.None); + + Assert.That(result.Found, Is.False); + } + + [Test] + public async Task NullResolverSchemaReturnsNotFound() + { + var context = new WotResolutionContext(); + WotResolverResult result = await NullWotResolver.Instance.ResolveSchemaAsync( + "https://example.com/schema.json", + context, + CancellationToken.None); + + Assert.That(result.Found, Is.False); + } + + [Test] + public void NullResolverSharedInstanceIsNotNull() + { + Assert.That(NullWotResolver.Instance, Is.Not.Null); + } + + [Test] + public void NullResolverInstanceIsNullWotResolverType() + { + Assert.That(NullWotResolver.Instance, Is.InstanceOf()); + } + + [Test] + public void WotResolverOptionsDefaultsArePositive() + { + var options = new WotResolverOptions(); + + Assert.That(options.MaxDepth, Is.GreaterThan(0)); + Assert.That(options.MaxDocuments, Is.GreaterThan(0)); + Assert.That(options.MaxDocumentBytes, Is.GreaterThan(0)); + Assert.That(options.MaxTotalBytes, Is.GreaterThan(0)); + } + + [Test] + public void WotResolverOptionsValidateSucceedsWithDefaultValues() + { + var options = new WotResolverOptions(); + + Assert.That(options.Validate, Throws.Nothing); + } + + [Test] + public void WotResolverOptionsValidateRejectsZeroMaxTotalBytes() + { + var options = new WotResolverOptions { MaxTotalBytes = 0 }; + + Assert.That( + options.Validate, + Throws.TypeOf()); + } + + [Test] + public void WotResolverOptionsValidateRejectsNegativeMaxDepth() + { + var options = new WotResolverOptions { MaxDepth = -1 }; + + Assert.That( + options.Validate, + Throws.TypeOf()); + } + + [Test] + public void ResolutionContextDepthIncreasesOnEnterDecreasesOnLeave() + { + var context = new WotResolutionContext(); + + Assert.That(context.Depth, Is.Zero); + context.TryEnter(WotResolutionKind.Thing, "urn:a", out _); + Assert.That(context.Depth, Is.EqualTo(1)); + context.Leave("urn:a"); + Assert.That(context.Depth, Is.Zero); + } + + [Test] + public void ResolutionContextDocumentCountIncreasesOnEnter() + { + var context = new WotResolutionContext(); + + Assert.That(context.DocumentCount, Is.Zero); + context.TryEnter(WotResolutionKind.Context, "urn:ctx", out _); + Assert.That(context.DocumentCount, Is.EqualTo(1)); + context.Leave("urn:ctx"); + context.TryEnter(WotResolutionKind.Schema, "urn:schema", out _); + Assert.That(context.DocumentCount, Is.EqualTo(2)); + } + + [Test] + public void ResolutionContextTotalBytesTrackedAfterAddBytes() + { + var options = new WotResolverOptions + { + MaxTotalBytes = 1000, + MaxDocumentBytes = 500, + MaxDepth = 10 + }; + var context = new WotResolutionContext(options); + + context.TryEnter(WotResolutionKind.Context, "urn:ctx", out _); + context.TryAddBytes("urn:ctx", 42, out _); + + Assert.That(context.TotalBytes, Is.EqualTo(42)); + } + + [Test] + public void TryAddBytesReturnsTrueAndUpdatesTotalBytesWithinLimits() + { + var options = new WotResolverOptions + { + MaxTotalBytes = 1000, + MaxDocumentBytes = 500, + MaxDepth = 10 + }; + var context = new WotResolutionContext(options); + context.TryEnter(WotResolutionKind.Thing, "urn:test", out _); + + bool result = context.TryAddBytes("urn:test", 100, out WotDiagnostic diagnostic); + + Assert.That(result, Is.True); + Assert.That(diagnostic, Is.Null); + Assert.That(context.TotalBytes, Is.EqualTo(100)); + } + + [Test] + public void TryAddBytesReturnsFalseWhenCumulativeTotalLimitExceeded() + { + var options = new WotResolverOptions + { + MaxTotalBytes = 10, + MaxDocumentBytes = 100, + MaxDepth = 10, + MaxDocuments = 100 + }; + var context = new WotResolutionContext(options); + + context.TryEnter(WotResolutionKind.Thing, "urn:a", out _); + context.TryAddBytes("urn:a", 6, out _); + context.Leave("urn:a"); + + context.TryEnter(WotResolutionKind.Schema, "urn:b", out _); + bool result = context.TryAddBytes("urn:b", 6, out WotDiagnostic diagnostic); + + Assert.That(result, Is.False); + Assert.That(diagnostic, Is.Not.Null); + Assert.That(diagnostic!.Code, Is.EqualTo(WotDiagnosticCode.ResolverLimitExceeded)); + } + + [Test] + public void WotResolverResultFromBytesCreatesFoundResult() + { + byte[] content = System.Text.Encoding.UTF8.GetBytes("{\"title\":\"T\"}"); + WotResolverResult result = WotResolverResult.FromBytes( + content, + contentType: "application/json"); + + Assert.That(result.Found, Is.True); + Assert.That(result.Content.Length, Is.EqualTo(content.Length)); + Assert.That(result.ContentType, Is.EqualTo("application/json")); + } + + [Test] + public void WotResolverResultNotFoundHasFoundFalse() + { + WotResolverResult result = WotResolverResult.NotFound; + + Assert.That(result.Found, Is.False); + Assert.That(result.Content.Length, Is.Zero); + Assert.That(result.ContentType, Is.Null); + } + + [Test] + public void TryEnterWithContextKindIncludesKindNameInDiagnosticMessage() + { + // With MaxDepth=1, the second entry hits the depth limit. + var options = new WotResolverOptions { MaxDepth = 1 }; + var context = new WotResolutionContext(options); + + context.TryEnter(WotResolutionKind.Context, "urn:first", out _); + context.TryEnter( + WotResolutionKind.Context, + "urn:second", + out WotDiagnostic diagnostic); + + Assert.That(diagnostic, Is.Not.Null); + Assert.That( + diagnostic!.Message, + Does.Contain(nameof(WotResolutionKind.Context))); + } + + [Test] + public void TryEnterWithSchemaKindIncludesKindNameInDiagnosticMessage() + { + // Cycle detection also embeds the kind name in its message. + var context = new WotResolutionContext(); + + context.TryEnter(WotResolutionKind.Schema, "urn:schema", out _); + context.TryEnter( + WotResolutionKind.Schema, + "urn:schema", + out WotDiagnostic diagnostic); + + Assert.That(diagnostic, Is.Not.Null); + Assert.That( + diagnostic!.Message, + Does.Contain(nameof(WotResolutionKind.Schema))); + } + + [Test] + public void ResolutionContextWithNullOptionsUsesDefaultValues() + { + var context = new WotResolutionContext(null); + + Assert.That(context.Options.MaxDepth, Is.GreaterThan(0)); + Assert.That(context.Options.MaxDocuments, Is.GreaterThan(0)); + } + + [Test] + public void ResolutionContextDiagnosticsAreEmptyInitially() + { + var context = new WotResolutionContext(); + + Assert.That(context.Diagnostics, Is.Empty); + } + + [Test] + public void ResolutionContextDiagnosticsAccumulateOnFailure() + { + var options = new WotResolverOptions { MaxDepth = 1 }; + var context = new WotResolutionContext(options); + + context.TryEnter(WotResolutionKind.Context, "urn:a", out _); + context.TryEnter(WotResolutionKind.Context, "urn:b", out _); + + Assert.That(context.Diagnostics, Is.Not.Empty); + Assert.That(context.Diagnostics[0].Code, Is.EqualTo(WotDiagnosticCode.ResolverDepthExceeded)); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotResolverAndBoundsTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotResolverAndBoundsTests.cs new file mode 100644 index 0000000000..9e4fccde3c --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotResolverAndBoundsTests.cs @@ -0,0 +1,457 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotResolverAndBoundsTests + { + [Test] + public void ResolutionContextDetectsCycles() + { + var context = new WotResolutionContext(); + + Assert.That(context.TryEnter(WotResolutionKind.Thing, "urn:a", out _), Is.True); + Assert.That(context.TryEnter(WotResolutionKind.Thing, "urn:a", out WotDiagnostic diagnostic), Is.False); + Assert.That(diagnostic!.Code, Is.EqualTo(WotDiagnosticCode.ResolverCycle)); + } + + [Test] + public void ResolutionContextEnforcesDepthLimit() + { + var context = new WotResolutionContext(new WotResolverOptions { MaxDepth = 1 }); + + Assert.That(context.TryEnter(WotResolutionKind.Thing, "urn:a", out _), Is.True); + Assert.That(context.TryEnter(WotResolutionKind.Thing, "urn:b", out WotDiagnostic diagnostic), Is.False); + Assert.That(diagnostic!.Code, Is.EqualTo(WotDiagnosticCode.ResolverDepthExceeded)); + } + + [Test] + public void ResolutionContextEnforcesDocumentAndByteLimits() + { + var context = new WotResolutionContext( + new WotResolverOptions { MaxDocuments = 1, MaxDepth = 10, MaxDocumentBytes = 5 }); + + Assert.That(context.TryEnter(WotResolutionKind.Thing, "urn:a", out _), Is.True); + Assert.That(context.TryAddBytes("urn:a", 10, out WotDiagnostic byteLimit), Is.False); + Assert.That(byteLimit!.Code, Is.EqualTo(WotDiagnosticCode.ResolverLimitExceeded)); + + context.Leave("urn:a"); + Assert.That(context.TryEnter(WotResolutionKind.Thing, "urn:b", out WotDiagnostic documentLimit), Is.False); + Assert.That(documentLimit!.Code, Is.EqualTo(WotDiagnosticCode.ResolverLimitExceeded)); + } + + [Test] + public async Task NullResolverNeverResolves() + { + var context = new WotResolutionContext(); + WotResolverResult result = await NullWotResolver.Instance.ResolveThingAsync( + "urn:a", + context, + CancellationToken.None); + Assert.That(result.Found, Is.False); + } + + [Test] + public async Task ResolverDrivenLinkResolutionFollowsRedirect() + { + var resolver = new MapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:a"] = /*lang=json,strict*/ "{\"uav:congruentType\":\"urn:b\"}", + ["urn:b"] = /*lang=json,strict*/ "{\"uav:congruentType\":\"urn:c\"}", + ["urn:c"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=99\"}" + }); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(LinkModel("urn:a"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, null, resolver); + + UAObjectType root = result.Value!.Items!.OfType().Single(); + Assert.That(root.References!.Any(r => r.Value == "ns=2;i=99"), Is.True); + } + + [Test] + public async Task AsyncResolverCanResolveLinkTargetEndToEnd() + { + var resolver = new AsyncMapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:target"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=77\"}" + }); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(LinkModel("urn:target"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, + null, + resolver); + + UAObjectType root = result.Value!.Items!.OfType().Single(); + Assert.That(root.References!.Any(r => r.Value == "ns=2;i=77"), Is.True); + } + + [Test] + public async Task ResolverDrivenLinkResolutionDetectsCycle() + { + var resolver = new MapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:a"] = /*lang=json,strict*/ "{\"uav:congruentType\":\"urn:b\"}", + ["urn:b"] = /*lang=json,strict*/ "{\"uav:congruentType\":\"urn:a\"}" + }); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(LinkModel("urn:a"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, null, resolver, new WotResolutionContext()); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ResolverCycle), + Is.True); + } + + [Test] + public async Task ResolverDrivenLinkResolutionReportsNotFound() + { + var resolver = new MapResolver([]); + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(LinkModel("urn:missing"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, + null, + resolver); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ResolverNotFound), + Is.True); + } + + [Test] + public void LinkResolutionWithoutResolverReportsUnresolvedReference() + { + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(LinkModel("urn:missing"))); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnresolvedReference), + Is.True); + } + + [Test] + public void AsyncResolverCancellationPropagates() + { + var resolver = new AsyncMapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:target"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=77\"}" + }); + using var cts = new CancellationTokenSource(); + cts.Cancel(); + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(LinkModel("urn:target"))); + + Func act = async () => await WotNodeSetConverter.ToNodeSetResultAsync( + document, + null, + resolver, + null, + cts.Token); + + Assert.That(act, Throws.InstanceOf()); + } + + [Test] + public async Task OneResolutionContextIsCreatedPerTopLevelConversionNotPerLink() + { + // Regression test: TryResolveTargetNodeId used to fall back to + // `new WotResolutionContext()` whenever it was handed a null + // context, and that fallback ran once per resolved link. With + // three sibling links sharing the same conversion, a document + // budget of two must therefore be exhausted by the third link, + // proving all links share one context seeded up front rather than + // each silently getting a fresh, unbounded context of its own. + var resolver = new MapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:a"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=101\"}", + ["urn:b"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=102\"}", + ["urn:c"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=103\"}" + }); + var options = new WotNodeSetConverterOptions { MaxResolverDocuments = 2 }; + + using var document = WotDocument.Parse( + Encoding.UTF8.GetBytes(MultiLinkModel("urn:a", "urn:b", "urn:c"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, + options, + resolver); + + UAObjectType root = result.Value!.Items!.OfType().Single(); + Assert.That( + root.References!.Count(r => r.Value is "ns=2;i=101" or "ns=2;i=102"), + Is.EqualTo(2)); + Assert.That(root.References!.Any(r => r.Value == "ns=2;i=103"), Is.False); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ResolverLimitExceeded), + Is.True); + } + + [Test] + public async Task MultipleLinksAccumulateAggregateByteLimitAcrossTheSameConversion() + { + // Both resolved documents are 23 bytes; a 30 byte total budget + // allows the first but must reject the second. If a fresh + // context were created per link (the bug this guards against), + // both would fit under the budget individually and no diagnostic + // would ever be produced. + var resolver = new MapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:a"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=101\"}", + ["urn:b"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=102\"}" + }); + var options = new WotNodeSetConverterOptions { MaxResolverTotalBytes = 30 }; + + using var document = WotDocument.Parse( + Encoding.UTF8.GetBytes(MultiLinkModel("urn:a", "urn:b"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, + options, + resolver); + + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ResolverLimitExceeded), + Is.True); + } + + [Test] + public async Task SiblingLinkCycleDoesNotBlockAnUnrelatedSiblingLinkButIsStillReported() + { + var resolver = new MapResolver(new Dictionary(StringComparer.Ordinal) + { + ["urn:ok"] = /*lang=json,strict*/ "{\"uav:id\":\"ns=2;i=201\"}", + ["urn:cyclic-a"] = /*lang=json,strict*/ "{\"uav:congruentType\":\"urn:cyclic-b\"}", + ["urn:cyclic-b"] = /*lang=json,strict*/ "{\"uav:congruentType\":\"urn:cyclic-a\"}" + }); + + using var document = WotDocument.Parse( + Encoding.UTF8.GetBytes(MultiLinkModel("urn:ok", "urn:cyclic-a"))); + WotConversionResult result = await WotNodeSetConverter.ToNodeSetResultAsync( + document, + null, + resolver); + + UAObjectType root = result.Value!.Items!.OfType().Single(); + Assert.That(root.References!.Any(r => r.Value == "ns=2;i=201"), Is.True); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.ResolverCycle), + Is.True); + } + + [Test] + public void ConverterOptionsProjectToMatchingResolverOptions() + { + var options = new WotNodeSetConverterOptions + { + MaxResolverDepth = 3, + MaxResolverDocuments = 4, + MaxResolverDocumentBytes = 5, + MaxResolverTotalBytes = 6 + }; + + WotResolverOptions resolverOptions = options.ToResolverOptions(); + + Assert.That(resolverOptions.MaxDepth, Is.EqualTo(3)); + Assert.That(resolverOptions.MaxDocuments, Is.EqualTo(4)); + Assert.That(resolverOptions.MaxDocumentBytes, Is.EqualTo(5)); + Assert.That(resolverOptions.MaxTotalBytes, Is.EqualTo(6)); + } + + [Test] + public void OptionsValidateRejectsNonPositiveResolverLimits() + { + Assert.That( + () => new WotNodeSetConverterOptions { MaxResolverDocuments = 0 }.Validate(), + Throws.TypeOf()); + Assert.That( + () => new WotNodeSetConverterOptions { MaxResolverDocumentBytes = 0 }.Validate(), + Throws.TypeOf()); + Assert.That( + () => new WotNodeSetConverterOptions { MaxResolverTotalBytes = 0 }.Validate(), + Throws.TypeOf()); + } + + [Test] + public void OptionsValidateRejectsNonPositiveLimits() + { + var options = new WotNodeSetConverterOptions { MaxJsonDepth = 0 }; + Assert.That(options.Validate, Throws.TypeOf()); + } + + [Test] + public void ParseRejectsOversizedDocuments() + { + var options = new WotNodeSetConverterOptions { MaxJsonDocumentSize = 8 }; + byte[] json = Encoding.UTF8.GetBytes(/*lang=json,strict*/ "{\"title\":\"a rather long value\"}"); + + Assert.That( + () => WotDocument.Parse(json, options), + Throws.TypeOf()); + } + + [Test] + public void ParseEnforcesDepthLimit() + { + var options = new WotNodeSetConverterOptions { MaxJsonDepth = 2 }; + byte[] json = Encoding.UTF8.GetBytes(/*lang=json,strict*/ "{\"a\":{\"b\":{\"c\":1}}}"); + + Assert.That( + () => WotDocument.Parse(json, options), + Throws.InstanceOf()); + } + + [Test] + public void MalformedJsonThrows() + { + Assert.That( + () => WotDocument.Parse(Encoding.UTF8.GetBytes("{ not json")), + Throws.InstanceOf()); + } + + [Test] + public void InvalidBase64EnvelopeIsReported() + { + const string json = + "{\"@type\":\"tm:ThingModel\",\"uav:nodeSet\":{" + + "\"@type\":\"uav:nodeSet\",\"contentType\":\"application/opcua-nodeset+xml\"," + + "\"encoding\":\"base64\",\"data\":\"not*valid*base64\"}}"; + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(json)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.InvalidBase64), + Is.True); + } + + [Test] + public void DecodedNodeSetExceedingLimitIsReported() + { + using WotDocument document = WotNodeSetConverter.FromNodeSet( + WotTestData.CreateReconstructableNodeSet(), + options: new WotNodeSetConverterOptions + { + PreservationMode = WotNodeSetPreservationMode.Always + }); + var options = new WotNodeSetConverterOptions { MaxNodeSetSize = 16 }; + + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document, options); + + Assert.That(result.Value, Is.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.NodeSetTooLarge), + Is.True); + } + + private static string LinkModel(string href) + { + return MultiLinkModel(href); + } + + private static string MultiLinkModel(params string[] hrefs) + { + string links = string.Join( + ",", + hrefs.Select(href => + "{\"rel\":\"ua:HasComponent\",\"href\":\"" + + href + + "\",\"uav:refId\":\"i=47\"}")); + return + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"," + + "\"ua\":\"http://opcfoundation.org/UA/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"T\",\"uav:browseName\":\"1:T\"," + + "\"links\":[" + + links + + "]}"; + } + + private sealed class MapResolver : IWotThingResolver + { + private readonly Dictionary m_map; + + public MapResolver(Dictionary map) + { + m_map = map; + } + + public ValueTask ResolveThingAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken) + { + WotResolverResult result = m_map.TryGetValue(reference, out string json) + ? WotResolverResult.FromBytes(Encoding.UTF8.GetBytes(json)) + : WotResolverResult.NotFound; + return new ValueTask(result); + } + } + + private sealed class AsyncMapResolver : IWotThingResolver + { + private readonly Dictionary m_map; + + public AsyncMapResolver(Dictionary map) + { + m_map = map; + } + + public async ValueTask ResolveThingAsync( + string reference, + WotResolutionContext context, + CancellationToken cancellationToken) + { + await Task.Yield(); + cancellationToken.ThrowIfCancellationRequested(); + WotResolverResult result = m_map.TryGetValue(reference, out string json) + ? WotResolverResult.FromBytes(Encoding.UTF8.GetBytes(json)) + : WotResolverResult.NotFound; + return result; + } + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotSynthesisTests.cs b/tests/Opc.Ua.Types.Tests/Wot/WotSynthesisTests.cs new file mode 100644 index 0000000000..58e17783d3 --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotSynthesisTests.cs @@ -0,0 +1,161 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.Types.Tests.Wot +{ + [TestFixture] + [Category("WoT")] + [Parallelizable] + public class WotSynthesisTests + { + private const string ThingModel = + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":[\"tm:ThingModel\",\"uav:objectType\"]," + + "\"title\":\"PumpType\",\"uav:browseName\":\"1:PumpType\"," + + "\"uav:id\":\"nsu=http://example.com/demo/pump;i=1001\"," + + "\"properties\":{\"pumpSpeed\":{\"@type\":\"uav:variableType\"," + + "\"uav:browseName\":\"1:PumpSpeed\",\"type\":\"number\"," + + "\"uav:modellingRule\":\"Mandatory\",\"readOnly\":true}}," + + "\"actions\":{\"reset\":{\"@type\":\"uav:method\"," + + "\"uav:browseName\":\"1:Reset\",\"uav:modellingRule\":\"Optional\"}}," + + "\"events\":{\"overTemp\":{\"uav:isEvent\":true,\"uav:browseName\":\"1:OverTemp\"}}}"; + + private const string ThingDescription = + "{\"@context\":[\"https://www.w3.org/2022/wot/td/v1.1\"," + + "{\"uav\":\"http://opcfoundation.org/UA/WoT-Binding/\"}]," + + "\"@type\":\"uav:object\",\"title\":\"Pump01\"," + + "\"uav:browseName\":\"1:Pump\"," + + "\"properties\":{\"speed\":{\"@type\":\"uav:variable\"," + + "\"uav:browseName\":\"1:Speed\",\"type\":\"number\",\"readOnly\":true}}}"; + + [Test] + public void ThingModelSynthesizesObjectTypeWithMembers() + { + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(ThingModel)); + + Assert.That(nodeSet.Models, Is.Not.Null); + Assert.That(nodeSet.Models![0].ModelUri, Is.EqualTo("http://example.com/demo/pump")); + + UAObjectType root = nodeSet.Items!.OfType() + .Single(t => t.BrowseName == "1:PumpType"); + Assert.That(root.NodeId, Is.EqualTo("ns=1;i=1001")); + Assert.That( + root.References!.Any(r => r.ReferenceType == "HasSubtype" && !r.IsForward && r.Value == "i=58"), + Is.True); + Assert.That( + root.References!.Any(r => r.ReferenceType == "HasComponent" && r.IsForward && r.Value == "ns=1;s=PumpType/PumpSpeed"), + Is.True); + Assert.That( + root.References!.Any(r => r.ReferenceType == "GeneratesEvent" && r.IsForward), + Is.True); + + UAVariable variable = nodeSet.Items!.OfType().Single(); + Assert.That(variable.NodeId, Is.EqualTo("ns=1;s=PumpType/PumpSpeed")); + Assert.That(variable.DataType, Is.EqualTo("i=11")); + Assert.That(variable.AccessLevel, Is.EqualTo(1)); + Assert.That( + variable.References!.Any(r => r.ReferenceType == "HasModellingRule" && r.Value == "i=78"), + Is.True); + + UAMethod method = nodeSet.Items!.OfType().Single(); + Assert.That(method.NodeId, Is.EqualTo("ns=1;s=PumpType/Reset")); + Assert.That( + method.References!.Any(r => r.ReferenceType == "HasModellingRule" && r.Value == "i=80"), + Is.True); + + UAObjectType eventType = nodeSet.Items!.OfType() + .Single(t => t.BrowseName == "1:OverTemp"); + Assert.That( + eventType.References!.Any(r => r.ReferenceType == "HasSubtype" && !r.IsForward && r.Value == "i=2041"), + Is.True); + } + + [Test] + public void ThingDescriptionSynthesizesObjectWithTypeDefinition() + { + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(ThingDescription)); + + UAObject root = nodeSet.Items!.OfType().Single(); + Assert.That(root.NodeId, Is.EqualTo("ns=1;s=Pump")); + Assert.That( + root.References!.Any(r => r.ReferenceType == "HasTypeDefinition" && r.IsForward && r.Value == "i=58"), + Is.True); + + UAVariable variable = nodeSet.Items!.OfType().Single(); + Assert.That(variable.NodeId, Is.EqualTo("ns=1;s=Pump/Speed")); + Assert.That(variable.AccessLevel, Is.EqualTo(1)); + } + + [Test] + public void SynthesisIsDeterministic() + { + UANodeSet first = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(ThingModel)); + UANodeSet second = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(ThingModel)); + + Assert.That(WotTestData.Serialize(first), Is.EqualTo(WotTestData.Serialize(second))); + } + + [Test] + public void UnsupportedSchemaProducesDiagnostic() + { + const string model = + "{\"@type\":[\"tm:ThingModel\",\"uav:objectType\"],\"title\":\"T\"," + + "\"uav:browseName\":\"1:T\",\"properties\":{\"blob\":{" + + "\"@type\":\"uav:variableType\",\"uav:browseName\":\"1:Blob\"," + + "\"uav:externalSchema\":\"https://example.com/schema.json\"}}}"; + + using var document = WotDocument.Parse(Encoding.UTF8.GetBytes(model)); + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult(document); + + Assert.That(result.Value, Is.Not.Null); + Assert.That( + result.Diagnostics.Any(d => d.Code == WotDiagnosticCode.UnsupportedSchema), + Is.True); + } + + [Test] + public void SynthesizedNodeSetSerializesToValidXml() + { + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet(Encoding.UTF8.GetBytes(ThingModel)); + byte[] xml = WotTestData.Serialize(nodeSet); + + using var stream = new System.IO.MemoryStream(xml); + bool valid = UANodeSet.Validate(stream, out System.Collections.Generic.IReadOnlyList errors); + Assert.That(valid, Is.True, string.Join("; ", errors)); + } + } +} diff --git a/tests/Opc.Ua.Types.Tests/Wot/WotTestData.cs b/tests/Opc.Ua.Types.Tests/Wot/WotTestData.cs new file mode 100644 index 0000000000..b566d1e86b --- /dev/null +++ b/tests/Opc.Ua.Types.Tests/Wot/WotTestData.cs @@ -0,0 +1,419 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text; +using System.Xml; +using Opc.Ua.Export; + +namespace Opc.Ua.Types.Tests.Wot +{ + /// + /// Shared NodeSet2 fixtures for the WoT conversion tests. + /// + internal static class WotTestData + { + /// + /// Builds a NodeSet exercising several NodeClasses, references, + /// modelling rules, a NodeSet-level extension and a node-level extension. + /// + public static UANodeSet CreateRichNodeSet() + { + var xml = new XmlDocument(); + System.Xml.XmlElement modelExtension = xml.CreateElement("test", "Metadata", "urn:test"); + modelExtension.SetAttribute("key", "value"); + modelExtension.InnerText = "payload"; + + var nodeExtensionDoc = new XmlDocument(); + System.Xml.XmlElement nodeExtension = nodeExtensionDoc.CreateElement("vendor", "Note", "urn:vendor"); + nodeExtension.InnerText = "annotation"; + + var valueDocument = new XmlDocument(); + System.Xml.XmlElement variableValue = valueDocument.CreateElement( + "uax", + "Double", + Namespaces.OpcUaXsd); + variableValue.InnerText = "42.5"; + + var variableTypeValueDocument = new XmlDocument(); + System.Xml.XmlElement variableTypeValue = variableTypeValueDocument.CreateElement( + "uax", + "String", + Namespaces.OpcUaXsd); + variableTypeValue.InnerText = "default"; + + return new UANodeSet + { + NamespaceUris = ["urn:test:model"], + ServerUris = ["urn:test:server"], + Models = + [ + new ModelTableEntry + { + ModelUri = "urn:test:model", + XmlSchemaUri = "urn:test:model:schema", + Version = "1.0.0", + ModelVersion = "1.0.0+build.7", + AccessRestrictions = 3, + PublicationDate = new DateTime(2026, 7, 20, 0, 0, 0, DateTimeKind.Utc), + PublicationDateSpecified = true, + RolePermissions = + [ + new RolePermission { Value = "i=15644", Permissions = 65 } + ], + RequiredModel = + [ + new ModelTableEntry + { + ModelUri = "http://opcfoundation.org/UA/", + Version = "1.05.03", + PublicationDate = new DateTime(2023, 12, 15, 0, 0, 0, DateTimeKind.Utc), + PublicationDateSpecified = true + } + ] + }, + new ModelTableEntry + { + ModelUri = "urn:test:model:secondary", + Version = "1.0.0" + } + ], + Aliases = + [ + new NodeIdAlias { Alias = "MachineTypeAlias", Value = "ns=1;i=1001" } + ], + Extensions = [modelExtension], + LastModified = new DateTime(2026, 7, 21, 12, 34, 56, DateTimeKind.Utc), + LastModifiedSpecified = true, + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1001", + BrowseName = "1:MachineType", + SymbolicName = "MachineType", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "MachineType" }], + Description = [new Opc.Ua.Export.LocalizedText { Locale = "en", Value = "A test type." }], + Category = ["Test", "Machine"], + Documentation = "https://example.test/MachineType", + WriteMask = 1, + UserWriteMask = 2, + AccessRestrictions = 3, + AccessRestrictionsSpecified = true, + RolePermissions = + [ + new RolePermission { Value = "i=15644", Permissions = 1 } + ], + ReleaseStatus = ReleaseStatus.Draft, + Extensions = [nodeExtension], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=58" }, + new Reference { ReferenceType = "HasComponent", IsForward = true, Value = "ns=1;i=6001" }, + new Reference { ReferenceType = "HasComponent", IsForward = true, Value = "ns=1;i=7001" }, + new Reference { ReferenceType = "GeneratesEvent", IsForward = true, Value = "ns=1;i=1002" } + ] + }, + new UAObjectType + { + NodeId = "ns=1;i=1002", + BrowseName = "1:OverTemperatureEventType", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "OverTemperatureEventType" }], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=2041" } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=6001", + BrowseName = "1:Speed", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "Speed" }], + DataType = "Double", + AccessLevel = 3, + UserAccessLevel = 2, + MinimumSamplingInterval = 125.5, + Historizing = true, + DesignToolOnly = true, + Value = variableValue, + Translation = + [ + new TranslationType + { + Items = + [ + new Opc.Ua.Export.LocalizedText + { + Locale = "en", + Value = "Speed" + }, + new StructureTranslationType + { + Name = "Value", + Text = + [ + new Opc.Ua.Export.LocalizedText + { + Locale = "de", + Value = "Drehzahl" + } + ] + } + ] + } + ], + ParentNodeId = "ns=1;i=1001", + References = + [ + new Reference { ReferenceType = "HasTypeDefinition", IsForward = true, Value = "i=63" }, + new Reference { ReferenceType = "HasModellingRule", IsForward = true, Value = "i=78" }, + new Reference { ReferenceType = "HasComponent", IsForward = false, Value = "ns=1;i=1001" } + ] + }, + new UAMethod + { + NodeId = "ns=1;i=7001", + BrowseName = "1:Reset", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "Reset" }], + ParentNodeId = "ns=1;i=1001", + Executable = false, + UserExecutable = false, + MethodDeclarationId = "ns=1;i=7000", + ArgumentDescription = + [ + new UAMethodArgument + { + Name = "Reason", + Description = + [ + new Opc.Ua.Export.LocalizedText + { + Locale = "en", + Value = "Reset reason" + } + ] + } + ], + References = + [ + new Reference { ReferenceType = "HasModellingRule", IsForward = true, Value = "i=80" }, + new Reference { ReferenceType = "HasComponent", IsForward = false, Value = "ns=1;i=1001" } + ] + }, + new UAObject + { + NodeId = "ns=1;i=5001", + BrowseName = "1:Machine", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "Machine" }], + EventNotifier = 1, + References = + [ + new Reference { ReferenceType = "HasTypeDefinition", IsForward = true, Value = "ns=1;i=1001" } + ] + }, + new UAReferenceType + { + NodeId = "ns=1;i=4001", + BrowseName = "1:Controls", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "Controls" }], + InverseName = [new Opc.Ua.Export.LocalizedText { Value = "IsControlledBy" }], + Symmetric = false, + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=47" } + ] + }, + new UAVariableType + { + NodeId = "ns=1;i=3001", + BrowseName = "1:ConfiguredStringType", + DisplayName = + [ + new Opc.Ua.Export.LocalizedText { Value = "ConfiguredStringType" } + ], + IsAbstract = true, + DataType = "String", + ValueRank = 1, + ArrayDimensions = "4", + Value = variableTypeValue, + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=62" + } + ] + }, + new UADataType + { + NodeId = "ns=1;i=3002", + BrowseName = "1:MachineMode", + DisplayName = + [ + new Opc.Ua.Export.LocalizedText { Value = "MachineMode" } + ], + Purpose = DataTypePurpose.CodeGenerator, + Definition = new Opc.Ua.Export.DataTypeDefinition + { + Name = "1:MachineMode", + SymbolicName = "MachineMode", + IsOptionSet = true, + Field = + [ + new Opc.Ua.Export.DataTypeField + { + Name = "Stopped", + SymbolicName = "Stopped", + Value = 0, + DisplayName = + [ + new Opc.Ua.Export.LocalizedText + { + Locale = "en", + Value = "Stopped" + } + ] + }, + new Opc.Ua.Export.DataTypeField + { + Name = "Running", + SymbolicName = "Running", + Value = 1, + IsOptional = true, + AllowSubTypes = true, + DataType = "i=6", + ValueRank = 1, + ArrayDimensions = "2", + MaxStringLength = 32 + } + ] + }, + References = + [ + new Reference + { + ReferenceType = "HasSubtype", + IsForward = false, + Value = "i=29" + } + ] + }, + new UAView + { + NodeId = "ns=1;i=8001", + BrowseName = "1:PlantView", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "PlantView" }], + ContainsNoLoops = true, + EventNotifier = 1 + } + ] + }; + } + + /// + /// Builds a compact NodeSet with a single ObjectType, one variable and + /// one method used by the native-projection reconstruction tests. + /// + public static UANodeSet CreateReconstructableNodeSet() + { + return new UANodeSet + { + NamespaceUris = ["urn:test:model"], + Models = + [ + new ModelTableEntry + { + ModelUri = "urn:test:model", + Version = "2.0.0", + PublicationDate = new DateTime(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc), + PublicationDateSpecified = true + } + ], + Items = + [ + new UAObjectType + { + NodeId = "ns=1;i=1001", + BrowseName = "1:PumpType", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "PumpType" }], + References = + [ + new Reference { ReferenceType = "HasSubtype", IsForward = false, Value = "i=58" }, + new Reference { ReferenceType = "HasComponent", IsForward = true, Value = "ns=1;i=6001" }, + new Reference { ReferenceType = "HasComponent", IsForward = true, Value = "ns=1;i=7001" } + ] + }, + new UAVariable + { + NodeId = "ns=1;i=6001", + BrowseName = "1:PumpSpeed", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "PumpSpeed" }], + DataType = "Double", + AccessLevel = 3, + ParentNodeId = "ns=1;i=1001", + References = + [ + new Reference { ReferenceType = "HasTypeDefinition", IsForward = true, Value = "i=63" }, + new Reference { ReferenceType = "HasModellingRule", IsForward = true, Value = "i=78" }, + new Reference { ReferenceType = "HasComponent", IsForward = false, Value = "ns=1;i=1001" } + ] + }, + new UAMethod + { + NodeId = "ns=1;i=7001", + BrowseName = "1:Reset", + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = "Reset" }], + ParentNodeId = "ns=1;i=1001", + References = + [ + new Reference { ReferenceType = "HasModellingRule", IsForward = true, Value = "i=80" }, + new Reference { ReferenceType = "HasComponent", IsForward = false, Value = "ns=1;i=1001" } + ] + } + ] + }; + } + + public static byte[] Serialize(UANodeSet nodeSet) + { + using var stream = new MemoryStream(); + nodeSet.Write(stream); + return stream.ToArray(); + } + + public static byte[] Utf8(string text) + { + return Encoding.UTF8.GetBytes(text); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/BindingPlannerTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/BindingPlannerTests.cs new file mode 100644 index 0000000000..ae53e1238b --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/BindingPlannerTests.cs @@ -0,0 +1,767 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Collections.Immutable; +using NUnit.Framework; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for MQTT, CoAP, BACnet, LoRaWAN and OPC UA binding planners. + /// + [TestFixture] + public sealed class BindingPlannerTests + { + private static WotBindingPlanContext DefaultContext() + { + return new WotBindingPlanContext(); + } + + private static WotAffordanceForm MakePropertyForm( + string formJson, + string affordanceName = "p", + string affordanceJson = "{}", + ImmutableArray ops = default) + { + using var formDoc = JsonDocument.Parse(formJson); + using var affordanceDoc = JsonDocument.Parse(affordanceJson); + JsonElement formElement = formDoc.RootElement.Clone(); + JsonElement affordanceElement = affordanceDoc.RootElement.Clone(); + + string? href = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("href", out JsonElement hrefEl) && + hrefEl.ValueKind == JsonValueKind.String) + { + href = hrefEl.GetString(); + } + + string? contentType = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("contentType", out JsonElement ctEl) && + ctEl.ValueKind == JsonValueKind.String) + { + contentType = ctEl.GetString(); + } + + ImmutableArray operations = ops.IsDefault + ? (ImmutableArray)["readproperty", "writeproperty"] + : ops; + + return new WotAffordanceForm( + WotAffordanceKind.Property, + affordanceName, + operations, + href, + contentType, + null, + [], + "/properties/" + affordanceName + "/forms/0", + formElement, + affordanceElement); + } + + private static WotAffordanceForm MakeActionForm(string formJson, string affordanceName = "act") + { + using var formDoc = JsonDocument.Parse(formJson); + JsonElement formElement = formDoc.RootElement.Clone(); + + string? href = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("href", out JsonElement hrefEl) && + hrefEl.ValueKind == JsonValueKind.String) + { + href = hrefEl.GetString(); + } + + return new WotAffordanceForm( + WotAffordanceKind.Action, + affordanceName, + ["invokeaction"], + href, + null, + null, + [], + "/actions/" + affordanceName + "/forms/0", + formElement, + default); + } + + private static WotAffordanceForm MakeEventForm(string formJson, string affordanceName = "ev") + { + using var formDoc = JsonDocument.Parse(formJson); + JsonElement formElement = formDoc.RootElement.Clone(); + + string? href = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("href", out JsonElement hrefEl) && + hrefEl.ValueKind == JsonValueKind.String) + { + href = hrefEl.GetString(); + } + + return new WotAffordanceForm( + WotAffordanceKind.Event, + affordanceName, + ["subscribeevent", "unsubscribeevent"], + href, + null, + null, + [], + "/events/" + affordanceName + "/forms/0", + formElement, + default); + } + + [Test] + public void MqttPlannerCompilesValidPropertyForm() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883/sensors/temp","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Is.Not.Empty); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.ReadProperty)); + } + + [Test] + public void MqttPlannerExtractsTopicFromHref() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883/my/topic","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Target, Is.EqualTo("my/topic")); + } + + [Test] + public void MqttPlannerUsesExplicitTopic() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883","mqv:topic":"custom/topic","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Target, Is.EqualTo("custom/topic")); + } + + [Test] + public void MqttPlannerRejectsFormWithNoHref() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + } + + [Test] + public void MqttPlannerRejectsNonMqttScheme() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"http://broker.example.com/topic","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void MqttPlannerRejectsEmptyTopic() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void MqttPlannerRejectsInvalidQos() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883/topic","mqv:qos":3,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void MqttPlannerRejectsTopicExceedingMaxLength() + { + var planner = new MqttBindingPlanner(); + string longTopic = new string('x', 65536); + WotAffordanceForm form = MakePropertyForm( + "{\"href\":\"mqtt://broker.example.com:1883/" + longTopic + "\",\"op\":\"readproperty\"}", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.BoundsExceeded), Is.True); + } + + [Test] + public void MqttPlannerWarnsOnUnknownControlPacket() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883/topic","mqv:controlPacket":"unknown","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Diagnostics.Any(d => + d.Severity == WotDiagnosticSeverity.Warning && + d.Code == WotBindingDiagnosticCode.UnknownVocabularyTerm), Is.True); + } + + [Test] + public void MqttPlannerAcceptsMqttsScheme() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtts://broker.example.com:8883/topic","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void MqttPlannerSetsRetainFlagWhenTrue() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com:1883/topic","mqv:retain":true,"op":"writeproperty"}""", + ops: ["writeproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That( + result.Entries[0].Addressing.Metadata.TryGetValue("retain", out string? retain) && + retain == "true", + Is.True); + } + + [Test] + public void MqttPlannerIdentity() + { + var planner = new MqttBindingPlanner(); + Assert.That(planner.Identity.Id, Is.EqualTo("w3c.mqtt")); + } + + [Test] + public void CoapPlannerCompilesValidPropertyForm() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"coap://sensor.example.com:5683/temp","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.ReadProperty)); + } + + [Test] + public void CoapPlannerAcceptsCoapsScheme() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"coaps://sensor.example.com:5684/temp","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void CoapPlannerRejectsInvalidScheme() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"http://example.com/temp","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void CoapPlannerRejectsInvalidMethod() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"coap://sensor.example.com:5683/temp","cov:method":"INVALID","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void CoapPlannerAcceptsValidMethod() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"coap://sensor.example.com:5683/temp","cov:method":"PUT","op":"writeproperty"}""", + ops: ["writeproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].OperationInfo.Method, Is.EqualTo("PUT")); + } + + [Test] + public void CoapPlannerRejectsFormWithNoHref() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void CoapPlannerIsNotExecutable() + { + var planner = new CoapBindingPlanner(); + Assert.That(planner.Capability.IsExecutable, Is.False); + } + + [Test] + public void BacnetPlannerCompilesValidForm() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"bacv:objectType":"analog-input","bacv:instanceNumber":1,"bacv:propertyIdentifier":"present-value"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void BacnetPlannerRejectsMissingObjectType() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"bacv:instanceNumber":1,"bacv:propertyIdentifier":"present-value"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void BacnetPlannerRejectsMissingInstanceNumber() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"bacv:objectType":"analog-input","bacv:propertyIdentifier":"present-value"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void BacnetPlannerRejectsMissingPropertyIdentifier() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"bacv:objectType":"analog-input","bacv:instanceNumber":0}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void BacnetPlannerRejectsUsePriorityOutOfRange() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + "{\"bacv:objectType\":\"analog-output\",\"bacv:instanceNumber\":1," + + "\"bacv:propertyIdentifier\":\"present-value\",\"bacv:usePriority\":17}", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void BacnetPlannerAcceptsUsePriorityAtBoundary() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + "{\"bacv:objectType\":\"analog-output\",\"bacv:instanceNumber\":1," + + "\"bacv:propertyIdentifier\":\"present-value\",\"bacv:usePriority\":1}", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void BacnetPlannerIsNotExecutable() + { + var planner = new BacnetBindingPlanner(); + Assert.That(planner.Capability.IsExecutable, Is.False); + } + + [Test] + public void LoRaWanPlannerCompilesValidForm() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:DevEUI":"0102030405060708"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata.ContainsKey("devEui"), Is.True); + } + + [Test] + public void LoRaWanPlannerRejectsMissingDevEUI() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:fPort":1}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void LoRaWanPlannerRejectsInvalidDevEUI() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:DevEUI":"ZZZZZZZZZZZZZZZZ"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void LoRaWanPlannerRejectsTooShortDevEUI() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:DevEUI":"01020304"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void LoRaWanPlannerRejectsInvalidFPort() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:DevEUI":"0102030405060708","lorawan:fPort":0}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void LoRaWanPlannerRejectsFPortAboveMax() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:DevEUI":"0102030405060708","lorawan:fPort":224}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void LoRaWanPlannerAcceptsFPortAtBoundary() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"lorawan:DevEUI":"0102030405060708","lorawan:fPort":223}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void LoRaWanPlannerIsNotExecutable() + { + var planner = new LoRaWanBindingPlanner(); + Assert.That(planner.Capability.IsExecutable, Is.False); + } + + [Test] + public void OpcUaPlannerCompilesValidFormWithHref() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"opc.tcp://server.example.com:4840","uav:id":"ns=2;i=1001","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata["nodeId"], Is.EqualTo("ns=2;i=1001")); + } + + [Test] + public void OpcUaPlannerExtractsNodeIdFromHrefPath() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"opc.tcp://server.example.com:4840/ns=2;i=1002","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata["nodeId"], Does.Contain("ns=2")); + } + + [Test] + public void OpcUaPlannerRejectsNonOpcScheme() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"http://server.example.com/p","uav:id":"ns=2;i=1001","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.UnsupportedScheme), Is.True); + } + + [Test] + public void OpcUaPlannerRejectsFormWithNoNodeId() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"opc.tcp://server.example.com:4840/somenode","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + // "somenode" doesn't look like a NodeId (no '='), so it should be rejected. + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void OpcUaPlannerUsesContextBaseUriWhenNoHref() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"uav:id":"ns=2;i=2000","op":"readproperty"}""", + ops: ["readproperty"]); + var context = new WotBindingPlanContext( + baseUri: "opc.tcp://server.example.com:4840"); + + WotBindingCompilation result = planner.Compile(form, context); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata["nodeId"], Is.EqualTo("ns=2;i=2000")); + } + + [Test] + public void OpcUaPlannerRejectsFormWithNoHrefAndNoBaseUri() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"uav:id":"ns=2;i=2000","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + } + + [Test] + public void OpcUaPlannerAcceptsOpcHttpsScheme() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"opc.https://server.example.com:443","uav:id":"ns=2;i=1001","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void OpcUaPlannerAcceptsOpcWssScheme() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"opc.wss://server.example.com:443","uav:id":"ns=2;i=1001","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void OpcUaPlannerAddsComponentOfToMetadata() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + "{\"href\":\"opc.tcp://server.example.com:4840\"," + + "\"uav:id\":\"ns=2;i=1001\",\"uav:componentOf\":\"ns=1;i=500\"," + + "\"op\":\"readproperty\"}", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata.ContainsKey("componentOf"), Is.True); + } + + [Test] + public void OpcUaPlannerAddsEventFieldsToMetadata() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakeEventForm( + "{\"href\":\"opc.tcp://server.example.com:4840\"," + + "\"uav:id\":\"ns=2;i=3001\"," + + "\"uav:eventFields\":[\"Message\",\"Severity\"]}"); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata.ContainsKey("eventFields"), Is.True); + Assert.That(result.Entries[0].Addressing.Metadata["eventFields"], + Does.Contain("Message").And.Contains("Severity")); + } + + [Test] + public void OpcUaPlannerExtractsNodeIdFromQueryString() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"opc.tcp://server.example.com:4840?id=ns%3D2%3Bi%3D1003","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata["nodeId"], Does.Contain("ns=2")); + } + + [Test] + public void OpcUaPlannerIdentityId() + { + var planner = new OpcUaBindingPlanner(); + Assert.That(planner.Identity.Id, Is.EqualTo("opc.opcua")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ExecutorUnitTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ExecutorUnitTests.cs new file mode 100644 index 0000000000..958f8060fe --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ExecutorUnitTests.cs @@ -0,0 +1,117 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Modbus; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for executor identity, dispatch and HTTP error mapping. + /// + [TestFixture] + public sealed class ExecutorUnitTests + { + private static WotCompiledForm Compiled(string bindingId, string scheme) + { + return new WotCompiledForm( + new WotBindingIdentity(bindingId, "1.0", "urn:x"), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor(scheme, "h", 1, scheme + "://h"), + new WotAddressingDescriptor("t"), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ReadProperty, "readproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], isExecutable: true); + } + + [Test] + public void CanExecuteMatchesOwnBindingOnly() + { + var http = new HttpWotBindingExecutor(); + var modbus = new ModbusWotBindingExecutor(); + + Assert.That(http.CanExecute(Compiled("w3c.http", "https")), Is.True); + Assert.That(http.CanExecute(Compiled("w3c.modbus", "modbus+tcp")), Is.False); + Assert.That(modbus.CanExecute(Compiled("w3c.modbus", "modbus+tcp")), Is.True); + Assert.That(modbus.CanExecute(Compiled("w3c.http", "https")), Is.False); + } + + [Test] + public void ExecutorsIdentifyTheirPlannerBinding() + { + Assert.That(new HttpWotBindingExecutor().Identity.Id, Is.EqualTo(new HttpBindingPlanner().Identity.Id)); + Assert.That(new ModbusWotBindingExecutor().Identity.Id, Is.EqualTo(new ModbusBindingPlanner().Identity.Id)); + } + + [Test] + public async Task HttpErrorStatusMapping() + { + (int Http, StatusCode Expected)[] cases = + [ + (400, StatusCodes.BadInvalidArgument), + (401, StatusCodes.BadUserAccessDenied), + (404, StatusCodes.BadNodeIdUnknown), + (500, StatusCodes.BadInternalError) + ]; + + foreach ((int http, StatusCode expected) in cases) + { + using var server = new TestHttpServer((method, path, body) => + new TestHttpResponse(http, "application/json", Encoding.UTF8.GetBytes("\"x\""))); + + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [new HttpWotBindingExecutor()]); + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + server.BaseUrl + + "/p\"}]}}}"; + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Status, Is.EqualTo(expected), $"HTTP {http} mapping."); + } + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/HttpCredentialResolutionTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpCredentialResolutionTests.cs new file mode 100644 index 0000000000..3751375891 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpCredentialResolutionTests.cs @@ -0,0 +1,176 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Collections.Immutable; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Tests that HTTP credential resolution is race-free: concurrent requests on + /// a single channel resolve the credential exactly once and never send a + /// request before the credential is applied, and a failed resolution is + /// retried on the next request. + /// + [TestFixture] + public sealed class HttpCredentialResolutionTests + { + private const string SecuredTd = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"securityDefinitions\":{\"apikey_sc\":{\"scheme\":\"apikey\",\"in\":\"query\",\"name\":\"token\"}}," + + "\"security\":\"apikey_sc\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"{BASE}/p\"}]}}}"; + + private static WotCompiledForm ReadForm(WotProtocolBinderRegistry registry, string baseUrl) + { + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, + Encoding.UTF8.GetBytes(SecuredTd.Replace("{BASE}", baseUrl, StringComparison.Ordinal)))); + return plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + } + + [Test] + public async Task ConcurrentRequestsNeverSendUnauthenticatedAndResolveOnce() + { + var authenticated = new ConcurrentQueue(); + using var server = new TestHttpServer((method, path, body) => + { + // The resolved API key is carried as a query parameter, so an + // authenticated request has "token=secret" in its target. + authenticated.Enqueue(path.Contains("token=secret", StringComparison.Ordinal)); + return TestHttpResponse.Json(200, "1"); + }); + + var credentials = new SlowQueryCredentialProvider(TimeSpan.FromMilliseconds(150)); + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [ + new HttpWotBindingExecutor() + ], + credentials: credentials); + + IWotBindingChannel channel = await registry.OpenChannelAsync(ReadForm(registry, server.BaseUrl)) + .ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Task[] reads = [.. Enumerable.Range(0, 12).Select(_ => channel.ReadAsync().AsTask())]; + WotReadResult[] results = await Task.WhenAll(reads).ConfigureAwait(false); + Assert.That(results.All(r => r.Success), Is.True, "Every concurrent read must succeed."); + } + + Assert.That(authenticated, Has.Count.EqualTo(12)); + Assert.That(authenticated.All(a => a), Is.True, + "No request may be sent before the credential is resolved and applied."); + Assert.That(credentials.ResolveCount, Is.EqualTo(1), + "The credential must be resolved exactly once and shared across concurrent requests."); + } + + [Test] + public async Task CredentialResolutionFailureIsRetriedOnNextRequest() + { + using var server = new TestHttpServer((method, path, body) => TestHttpResponse.Json(200, "1")); + + var credentials = new FailOnceCredentialProvider(); + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [ + new HttpWotBindingExecutor() + ], + credentials: credentials); + + IWotBindingChannel channel = await registry.OpenChannelAsync(ReadForm(registry, server.BaseUrl)) + .ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + // The first resolution faults and must surface, not be cached. + Assert.ThrowsAsync( + async () => await channel.ReadAsync().ConfigureAwait(false)); + + // The next request retries resolution and succeeds. + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + Assert.That(credentials.ResolveCount, Is.EqualTo(2), + "A failed resolution must not be cached; the next request retries it."); + } + + private sealed class SlowQueryCredentialProvider : IWotCredentialProvider + { + public SlowQueryCredentialProvider(TimeSpan delay) + { + m_delay = delay; + } + + public int ResolveCount => Volatile.Read(ref m_resolveCount); + + public async ValueTask ResolveAsync( + WotCredentialReference reference, CancellationToken cancellationToken = default) + { + Interlocked.Increment(ref m_resolveCount); + await Task.Delay(m_delay, cancellationToken).ConfigureAwait(false); + return new WotCredential( + WotSecurityScheme.ApiKey, + queryParameters: ImmutableDictionary.Empty.Add("token", "secret")); + } + + private readonly TimeSpan m_delay; + private int m_resolveCount; + } + + private sealed class FailOnceCredentialProvider : IWotCredentialProvider + { + public int ResolveCount => Volatile.Read(ref m_resolveCount); + + public ValueTask ResolveAsync( + WotCredentialReference reference, CancellationToken cancellationToken = default) + { + if (Interlocked.Increment(ref m_resolveCount) == 1) + { + throw new InvalidOperationException("Transient credential resolution failure."); + } + return new ValueTask(new WotCredential( + WotSecurityScheme.ApiKey, + queryParameters: ImmutableDictionary.Empty.Add("token", "secret"))); + } + + private int m_resolveCount; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/HttpRedirectSecurityTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpRedirectSecurityTests.cs new file mode 100644 index 0000000000..917907f76f --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpRedirectSecurityTests.cs @@ -0,0 +1,818 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// End-to-end tests for the HTTP executor's redirect-safe credential policy: + /// the executor-owned client disables automatic redirects and ambient cookies, + /// then applies a bounded, origin-aware redirect policy that drops custom header + /// / query credentials across origins, refuses loops and unsafe schemes, and + /// honours a redirect limit. Default headers follow the same sensitive-data + /// policy and are snapshotted per channel. Every caller-supplied client fails + /// closed unless the caller confirms safe redirect handling. + /// + [TestFixture] + public sealed class HttpRedirectSecurityTests + { + private const string SecuredTdTemplate = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"securityDefinitions\":{\"apikey_sc\":{\"scheme\":\"apikey\",\"in\":\"query\",\"name\":\"token\"}}," + + "\"security\":\"apikey_sc\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"{HREF}\"}]}}}"; + + private static WotProtocolBinderRegistry OwnedRegistry( + IWotCredentialProvider? credentials = null, HttpWotBindingOptions? options = null) + { + return new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [new HttpWotBindingExecutor(options ?? new HttpWotBindingOptions())], + credentials: credentials); + } + + private static WotCompiledForm ReadForm(WotProtocolBinderRegistry registry, string href) + { + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, + Encoding.UTF8.GetBytes(SecuredTdTemplate.Replace("{HREF}", href, StringComparison.Ordinal)))); + return plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + } + + [Test] + public async Task CrossOriginRedirectDropsHeaderAndQueryCredentials() + { + var origin = new Recorder(); + var target = new Recorder(); + using var targetServer = new TestHttpServer(request => + { + target.Record(request); + return TestHttpResponse.Json(200, "7"); + }); + using var originServer = new TestHttpServer(request => + { + origin.Record(request); + return TestHttpResponse.Redirect(targetServer.BaseUrl + "/p"); + }); + + WotProtocolBinderRegistry registry = OwnedRegistry(new HeaderQueryCredentialProvider()); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadForm(registry, originServer.BaseUrl + "/p")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True, "The read must follow the redirect and succeed."); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(7L)); + } + + Assert.Multiple(() => + { + Assert.That(origin.SawQueryToken, Is.True, "The origin request must carry the query credential."); + Assert.That(origin.SawHeaderToken, Is.True, "The origin request must carry the header credential."); + Assert.That(target.SawQueryToken, Is.False, + "A cross-origin redirect must not forward the query credential."); + Assert.That(target.SawHeaderToken, Is.False, + "A cross-origin redirect must not forward the header credential."); + }); + } + + [Test] + public async Task CrossOriginRedirectDropsDefaultHeaders() + { + var origin = new Recorder(); + var target = new Recorder(); + using var targetServer = new TestHttpServer(request => + { + target.Record(request); + return TestHttpResponse.Json(200, "8"); + }); + using var originServer = new TestHttpServer(request => + { + origin.Record(request); + return TestHttpResponse.Redirect(targetServer.BaseUrl + "/p"); + }); + + WotProtocolBinderRegistry registry = OwnedRegistry( + options: DefaultHeaderOptions()); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, originServer.BaseUrl + "/p")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True, "The read must follow the redirect and succeed."); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(8L)); + } + + Assert.Multiple(() => + { + Assert.That(origin.SawDefaultHeaderToken, Is.True, + "The origin request must carry the configured default header."); + Assert.That(target.SawDefaultHeaderToken, Is.False, + "A cross-origin redirect must not forward the configured default header."); + }); + } + + [Test] + public async Task CrossOriginRedirectDoesNotReplaySetCookie() + { + var origin = new Recorder(); + var target = new Recorder(); + using var targetServer = new TestHttpServer(request => + { + target.Record(request); + return TestHttpResponse.Json(200, "17"); + }); + using var originServer = new TestHttpServer(request => + { + origin.Record(request); + return RedirectWithCookie(targetServer.BaseUrl + "/p"); + }); + + WotProtocolBinderRegistry registry = OwnedRegistry(); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, originServer.BaseUrl + "/p")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(17L)); + } + + Assert.Multiple(() => + { + Assert.That(origin.SawHeaderContaining("Cookie", "session=secret"), Is.False); + Assert.That(target.SawHeaderContaining("Cookie", "session=secret"), Is.False, + "An ambient cookie from one origin must not cross to another port."); + }); + } + + [Test] + public async Task SameOriginRedirectKeepsCredentials() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + if (request.Path.StartsWith("/a", StringComparison.Ordinal)) + { + return TestHttpResponse.Redirect("/b"); + } + return TestHttpResponse.Json(200, "9"); + }); + + WotProtocolBinderRegistry registry = OwnedRegistry(new HeaderQueryCredentialProvider()); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadForm(registry, server.BaseUrl + "/a")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(9L)); + } + + Assert.That(recorder.PathsSeen.Any(p => p.StartsWith("/b", StringComparison.Ordinal) && + p.Contains("token=secret", StringComparison.Ordinal)), Is.True, + "A same-origin redirect must keep the query credential on the follow-up request."); + } + + [Test] + public async Task SameOriginRedirectKeepsDefaultHeaders() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + if (request.Path.StartsWith("/a", StringComparison.Ordinal)) + { + return TestHttpResponse.Redirect("/b"); + } + return TestHttpResponse.Json(200, "10"); + }); + + WotProtocolBinderRegistry registry = OwnedRegistry( + options: DefaultHeaderOptions()); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/a")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(10L)); + } + + Assert.That(recorder.PathsWithDefaultHeader.Any( + p => p.StartsWith("/b", StringComparison.Ordinal)), Is.True, + "A same-origin redirect must keep the configured default header."); + } + + [Test] + public async Task SameOriginRedirectDoesNotReplaySetCookie() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + return request.Path.StartsWith("/a", StringComparison.Ordinal) + ? RedirectWithCookie("/b") + : TestHttpResponse.Json(200, "18"); + }); + + WotProtocolBinderRegistry registry = OwnedRegistry(); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/a")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(18L)); + } + + Assert.That(recorder.SawHeaderContainingOnPath( + "/b", "Cookie", "session=secret"), Is.False, + "The executor-owned client must not maintain an ambient cookie jar."); + } + + [Test] + public async Task SameOriginRedirectKeepsExplicitCookieHeader() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + return request.Path.StartsWith("/a", StringComparison.Ordinal) + ? TestHttpResponse.Redirect("/b") + : TestHttpResponse.Json(200, "19"); + }); + var options = new HttpWotBindingOptions + { + DefaultHeaders = Headers("Cookie", "explicit=secret") + }; + + WotProtocolBinderRegistry registry = OwnedRegistry(options: options); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/a")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(19L)); + } + + Assert.That(recorder.SawHeaderContainingOnPath( + "/b", "Cookie", "explicit=secret"), Is.True, + "An explicit cookie header follows the normal same-origin header policy."); + } + + [Test] + public async Task RedirectLoopIsRejected() + { + using var server = new TestHttpServer(request => + request.Path.StartsWith("/a", StringComparison.Ordinal) + ? TestHttpResponse.Redirect("/b") + : TestHttpResponse.Redirect("/a")); + + WotProtocolBinderRegistry registry = OwnedRegistry(); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/a")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Error, Does.Contain("loop").IgnoreCase); + } + } + + [Test] + public async Task RedirectToDisallowedSchemeIsRejected() + { + using var server = new TestHttpServer(_ => TestHttpResponse.Redirect("ftp://evil.example.com/x")); + + WotProtocolBinderRegistry registry = OwnedRegistry(); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/p")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadSecurityChecksFailed)); + } + } + + [Test] + public async Task RedirectLimitIsEnforced() + { + int counter = 0; + using var server = new TestHttpServer(_ => + TestHttpResponse.Redirect("/r" + Interlocked.Increment(ref counter))); + + WotProtocolBinderRegistry registry = OwnedRegistry( + options: new HttpWotBindingOptions { MaxAutomaticRedirects = 2 }); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/start")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Error, Does.Contain("redirect limit").IgnoreCase); + } + } + + [Test] + public async Task OwnedClientFollowsTemporaryRedirectToSuccess() + { + using var server = new TestHttpServer(request => + request.Path.StartsWith("/a", StringComparison.Ordinal) + ? TestHttpResponse.Redirect("/final", status: 307) + : TestHttpResponse.Json(200, "5")); + + WotProtocolBinderRegistry registry = OwnedRegistry(); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/a")).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(5L)); + } + } + + [Test] + public async Task DefaultHeadersAddedAfterActivationAreIgnored() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + return TestHttpResponse.Json(200, "12"); + }); + var options = new HttpWotBindingOptions(); + WotProtocolBinderRegistry registry = OwnedRegistry(options: options); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/p")).ConfigureAwait(false); + + options.DefaultHeaders = Headers("X-Added-Secret", "added"); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + Assert.That(recorder.SawHeader("X-Added-Secret", "added"), Is.False, + "Headers configured after activation must not enter the channel snapshot."); + } + + [Test] + public async Task DefaultHeadersReplacedAfterActivationUseSnapshot() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + return TestHttpResponse.Json(200, "13"); + }); + var options = new HttpWotBindingOptions + { + DefaultHeaders = Headers("X-Snapshot-Secret", "original") + }; + WotProtocolBinderRegistry registry = OwnedRegistry(options: options); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/p")).ConfigureAwait(false); + + options.DefaultHeaders = Headers("X-Replacement-Secret", "replacement"); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + Assert.Multiple(() => + { + Assert.That(recorder.SawHeader("X-Snapshot-Secret", "original"), Is.True); + Assert.That(recorder.SawHeader("X-Replacement-Secret", "replacement"), Is.False); + }); + } + + [Test] + public async Task DefaultHeaderCollectionMutationAfterActivationUsesSnapshot() + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + return TestHttpResponse.Json(200, "14"); + }); + var mutableHeaders = new Dictionary + { + ["X-Mutable-Secret"] = "original" + }; + var options = new HttpWotBindingOptions + { + DefaultHeaders = mutableHeaders + }; + WotProtocolBinderRegistry registry = OwnedRegistry(options: options); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, server.BaseUrl + "/p")).ConfigureAwait(false); + + mutableHeaders["X-Mutable-Secret"] = "mutated"; + mutableHeaders["X-Late-Secret"] = "late"; + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + Assert.Multiple(() => + { + Assert.That(recorder.SawHeader("X-Mutable-Secret", "original"), Is.True); + Assert.That(recorder.SawHeader("X-Mutable-Secret", "mutated"), Is.False); + Assert.That(recorder.SawHeader("X-Late-Secret", "late"), Is.False); + }); + } + + [Test] + public void CallerSuppliedClientWithCredentialFormFailsClosed() + { + using var server = new TestHttpServer((method, path, body) => TestHttpResponse.Json(200, "1")); + using var client = new HttpClient(); + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [ + new HttpWotBindingExecutor(new HttpWotBindingOptions { ClientFactory = () => client }) + ], + credentials: new HeaderQueryCredentialProvider()); + WotCompiledForm read = ReadForm(registry, server.BaseUrl + "/p"); + + Assert.ThrowsAsync( + async () => await registry.OpenChannelAsync(read).ConfigureAwait(false)); + } + + [Test] + public void CallerSuppliedAutoRedirectClientWithDefaultHeadersFailsClosed() + { + var origin = new Recorder(); + var target = new Recorder(); + using var targetServer = new TestHttpServer(request => + { + target.Record(request); + return TestHttpResponse.Json(200, "1"); + }); + using var originServer = new TestHttpServer(request => + { + origin.Record(request); + return TestHttpResponse.Redirect(targetServer.BaseUrl + "/p"); + }); + using var client = new HttpClient(new HttpClientHandler + { + AllowAutoRedirect = true, + CheckCertificateRevocationList = true + }); + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [ + new HttpWotBindingExecutor(new HttpWotBindingOptions + { + ClientFactory = () => client, + DefaultHeaders = DefaultHeaderOptions().DefaultHeaders + }) + ]); + WotCompiledForm read = ReadFormNoSecurity(registry, originServer.BaseUrl + "/p"); + + InvalidOperationException? exception = Assert.ThrowsAsync( + async () => await registry.OpenChannelAsync(read).ConfigureAwait(false)); + Assert.Multiple(() => + { + Assert.That(exception?.Message, + Does.Contain(nameof(HttpWotBindingOptions.CallerClientHandlesRedirectSafety))); + Assert.That(origin.PathsSeen, Is.Empty, + "Rejected caller-owned clients must not send the origin request."); + Assert.That(target.PathsSeen, Is.Empty, + "Rejected caller-owned clients must not reach the redirect target."); + }); + } + + [TestCase(false)] + [TestCase(true)] + public void CallerSuppliedClientWithoutHeadersFailsClosed(bool configureEmptyHeaders) + { + var recorder = new Recorder(); + using var server = new TestHttpServer(request => + { + recorder.Record(request); + return TestHttpResponse.Json(200, "11"); + }); + var handler = new HttpClientHandler + { + AllowAutoRedirect = true, + UseCookies = true, + CheckCertificateRevocationList = true + }; + using var client = new HttpClient(handler); + int factoryCalls = 0; + var options = new HttpWotBindingOptions + { + ClientFactory = () => + { + Interlocked.Increment(ref factoryCalls); + return client; + } + }; + if (configureEmptyHeaders) + { + options.DefaultHeaders = ImmutableDictionary.Empty; + } + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [new HttpWotBindingExecutor(options)]); + WotCompiledForm read = ReadFormNoSecurity(registry, server.BaseUrl + "/p"); + + InvalidOperationException? exception = Assert.ThrowsAsync( + async () => await registry.OpenChannelAsync(read).ConfigureAwait(false)); + Assert.Multiple(() => + { + Assert.That(exception?.Message, + Does.Contain(nameof(HttpWotBindingOptions.CallerClientHandlesRedirectSafety))); + Assert.That(factoryCalls, Is.Zero); + Assert.That(recorder.PathsSeen, Is.Empty); + Assert.That(handler.UseCookies, Is.True, + "Opaque caller-owned cookie behavior requires explicit safety confirmation."); + }); + } + + [Test] + public async Task CallerDefaultRequestHeadersCannotLeakWithoutSafetyConfirmation() + { + var origin = new Recorder(); + var target = new Recorder(); + using var targetServer = new TestHttpServer(request => + { + target.Record(request); + return TestHttpResponse.Json(200, "15"); + }); + using var originServer = new TestHttpServer(request => + { + origin.Record(request); + return TestHttpResponse.Redirect(targetServer.BaseUrl + "/p"); + }); + var handler = new HttpClientHandler + { + AllowAutoRedirect = true, + CheckCertificateRevocationList = true + }; + using var client = new HttpClient(handler); + client.DefaultRequestHeaders.TryAddWithoutValidation("X-Client-Secret", "client-secret"); + int factoryCalls = 0; + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [ + new HttpWotBindingExecutor(new HttpWotBindingOptions + { + ClientFactory = () => + { + Interlocked.Increment(ref factoryCalls); + return client; + } + }) + ]); + WotCompiledForm read = ReadFormNoSecurity(registry, originServer.BaseUrl + "/p"); + + InvalidOperationException? exception = Assert.ThrowsAsync( + async () => await registry.OpenChannelAsync(read).ConfigureAwait(false)); + Assert.Multiple(() => + { + Assert.That(exception?.Message, + Does.Contain(nameof(HttpWotBindingOptions.CallerClientHandlesRedirectSafety))); + Assert.That(factoryCalls, Is.Zero); + Assert.That(origin.PathsSeen, Is.Empty); + Assert.That(target.PathsSeen, Is.Empty); + Assert.That(handler.AllowAutoRedirect, Is.True); + Assert.That(handler.UseCookies, Is.True); + Assert.That(client.DefaultRequestHeaders.GetValues("X-Client-Secret").Single(), + Is.EqualTo("client-secret")); + }); + + using HttpResponseMessage response = await client + .GetAsync(new Uri(targetServer.BaseUrl + "/probe")) + .ConfigureAwait(false); + Assert.That(response.IsSuccessStatusCode, Is.True, + "Rejecting activation must not dispose the caller-owned client."); + } + + [Test] + public async Task ConfirmedSafeCallerClientIsNotMutatedOrDisposed() + { + var origin = new Recorder(); + var target = new Recorder(); + using var targetServer = new TestHttpServer(request => + { + target.Record(request); + return TestHttpResponse.Json(200, "16"); + }); + using var originServer = new TestHttpServer(request => + { + origin.Record(request); + return TestHttpResponse.Redirect(targetServer.BaseUrl + "/p"); + }); + var handler = new HttpClientHandler + { + AllowAutoRedirect = false, + CheckCertificateRevocationList = true + }; + using var client = new HttpClient(handler); + client.DefaultRequestHeaders.TryAddWithoutValidation("X-Client-Secret", "existing"); + var options = new HttpWotBindingOptions + { + ClientFactory = () => client, + CallerClientHandlesRedirectSafety = true, + DefaultHeaders = Headers("X-Option-Snapshot", "original") + }; + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [new HttpWotBindingExecutor(options)]); + IWotBindingChannel channel = await registry.OpenChannelAsync( + ReadFormNoSecurity(registry, originServer.BaseUrl + "/p")).ConfigureAwait(false); + + options.DefaultHeaders = Headers("X-Option-Replacement", "replacement"); + client.DefaultRequestHeaders.TryAddWithoutValidation("X-Late-Client-Secret", "late"); + WotReadResult result; + await using (channel.ConfigureAwait(false)) + { + result = await channel.ReadAsync().ConfigureAwait(false); + } + + Assert.Multiple(() => + { + Assert.That(result.Success, Is.False, + "A confirmed-safe client with redirects disabled must not follow the redirect."); + Assert.That(origin.SawHeader("X-Option-Snapshot", "original"), Is.True); + Assert.That(origin.SawHeader("X-Option-Replacement", "replacement"), Is.False); + Assert.That(origin.SawHeader("X-Client-Secret", "existing"), Is.True); + Assert.That(origin.SawHeader("X-Late-Client-Secret", "late"), Is.True); + Assert.That(target.PathsSeen, Is.Empty); + Assert.That(handler.AllowAutoRedirect, Is.False); + Assert.That(handler.UseCookies, Is.True, + "The executor must not mutate caller-owned cookie behavior."); + Assert.That(client.DefaultRequestHeaders.Contains("X-Option-Snapshot"), Is.False); + Assert.That(client.DefaultRequestHeaders.GetValues("X-Client-Secret").Single(), + Is.EqualTo("existing")); + Assert.That(client.DefaultRequestHeaders.GetValues("X-Late-Client-Secret").Single(), + Is.EqualTo("late")); + }); + + using HttpResponseMessage response = await client + .GetAsync(new Uri(targetServer.BaseUrl + "/probe")) + .ConfigureAwait(false); + Assert.That(response.IsSuccessStatusCode, Is.True, + "Disposing the channel must not dispose the caller-owned client."); + } + + private static WotCompiledForm ReadFormNoSecurity(WotProtocolBinderRegistry registry, string href) + { + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + href + + "\"}]}}}"; + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + return plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + } + + private static HttpWotBindingOptions DefaultHeaderOptions() + { + return new HttpWotBindingOptions + { + DefaultHeaders = Headers("X-Default-Secret", "secret") + }; + } + + private static ImmutableDictionary Headers(string name, string value) + { + return ImmutableDictionary.Empty.Add(name, value); + } + + private static TestHttpResponse RedirectWithCookie(string location) + { + return new TestHttpResponse( + 302, + "text/plain", + [], + ImmutableDictionary.Empty + .Add("Location", location) + .Add("Set-Cookie", "session=secret; Path=/")); + } + + private sealed class Recorder + { + private readonly System.Collections.Concurrent.ConcurrentQueue m_paths = new(); + private readonly System.Collections.Concurrent.ConcurrentQueue m_pathsWithDefaultHeader = new(); + private readonly System.Collections.Concurrent.ConcurrentQueue m_requests = new(); + private int m_sawDefaultHeaderToken; + private int m_sawQueryToken; + private int m_sawHeaderToken; + + public bool SawDefaultHeaderToken => Volatile.Read(ref m_sawDefaultHeaderToken) != 0; + + public bool SawQueryToken => Volatile.Read(ref m_sawQueryToken) != 0; + + public bool SawHeaderToken => Volatile.Read(ref m_sawHeaderToken) != 0; + + public System.Collections.Generic.IReadOnlyCollection PathsSeen => [.. m_paths]; + + public System.Collections.Generic.IReadOnlyCollection PathsWithDefaultHeader => + [.. m_pathsWithDefaultHeader]; + + public bool SawHeader(string name, string value) + { + return m_requests.Any(request => + request.Headers.TryGetValue(name, out string? actual) && + string.Equals(actual, value, StringComparison.Ordinal)); + } + + public bool SawHeaderContaining(string name, string value) + { + return m_requests.Any(request => + request.Headers.TryGetValue(name, out string? actual) && + actual.Contains(value, StringComparison.Ordinal)); + } + + public bool SawHeaderContainingOnPath( + string path, string name, string value) + { + return m_requests.Any(request => + request.Path.StartsWith(path, StringComparison.Ordinal) && + request.Headers.TryGetValue(name, out string? actual) && + actual.Contains(value, StringComparison.Ordinal)); + } + + public void Record(TestHttpRequest request) + { + m_requests.Enqueue(request); + m_paths.Enqueue(request.Path); + if (request.Headers.TryGetValue("X-Default-Secret", out string? defaultValue) && + string.Equals(defaultValue, "secret", StringComparison.Ordinal)) + { + m_pathsWithDefaultHeader.Enqueue(request.Path); + Interlocked.Exchange(ref m_sawDefaultHeaderToken, 1); + } + if (request.Path.Contains("token=secret", StringComparison.Ordinal)) + { + Interlocked.Exchange(ref m_sawQueryToken, 1); + } + if (request.Headers.TryGetValue("X-Api-Key", out string? value) && + string.Equals(value, "secret", StringComparison.Ordinal)) + { + Interlocked.Exchange(ref m_sawHeaderToken, 1); + } + } + } + + private sealed class HeaderQueryCredentialProvider : IWotCredentialProvider + { + public ValueTask ResolveAsync( + WotCredentialReference reference, CancellationToken cancellationToken = default) + { + return new ValueTask(new WotCredential( + WotSecurityScheme.ApiKey, + headers: ImmutableDictionary.Empty.Add("X-Api-Key", "secret"), + queryParameters: ImmutableDictionary.Empty.Add("token", "secret"))); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/HttpStatusMapperTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpStatusMapperTests.cs new file mode 100644 index 0000000000..6085f30e5c --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpStatusMapperTests.cs @@ -0,0 +1,168 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Net; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for the HTTP status code to OPC UA StatusCode mapper. + /// + [TestFixture] + public sealed class HttpStatusMapperTests + { + [Test] + public void OkMapsToGood() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.OK), + Is.EqualTo(StatusCodes.Good)); + } + + [Test] + public void CreatedMapsToGood() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.Created), + Is.EqualTo(StatusCodes.Good)); + } + + [Test] + public void NoContentMapsToGood() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.NoContent), + Is.EqualTo(StatusCodes.Good)); + } + + [Test] + public void PartialContentMapsToGood() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.PartialContent), + Is.EqualTo(StatusCodes.Good)); + } + + [Test] + public void BadRequestMapsToBadInvalidArgument() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.BadRequest), + Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void UnauthorizedMapsToBadUserAccessDenied() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.Unauthorized), + Is.EqualTo(StatusCodes.BadUserAccessDenied)); + } + + [Test] + public void ForbiddenMapsToBadUserAccessDenied() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.Forbidden), + Is.EqualTo(StatusCodes.BadUserAccessDenied)); + } + + [Test] + public void NotFoundMapsToBadNodeIdUnknown() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.NotFound), + Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public void MethodNotAllowedMapsToBadNotSupported() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.MethodNotAllowed), + Is.EqualTo(StatusCodes.BadNotSupported)); + } + + [Test] + public void RequestTimeoutMapsToBadTimeout() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.RequestTimeout), + Is.EqualTo(StatusCodes.BadTimeout)); + } + + [Test] + public void ConflictMapsToBadInvalidState() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.Conflict), + Is.EqualTo(StatusCodes.BadInvalidState)); + } + + [Test] + public void NotImplementedMapsToBadNotImplemented() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.NotImplemented), + Is.EqualTo(StatusCodes.BadNotImplemented)); + } + + [Test] + public void ServiceUnavailableMapsToBadServerHalted() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.ServiceUnavailable), + Is.EqualTo(StatusCodes.BadServerHalted)); + } + + [Test] + public void GatewayTimeoutMapsToBadTimeout() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.GatewayTimeout), + Is.EqualTo(StatusCodes.BadTimeout)); + } + + [Test] + public void InternalServerErrorMapsToBadInternalError() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.InternalServerError), + Is.EqualTo(StatusCodes.BadInternalError)); + } + + [Test] + public void GenericFiveHundredXxMapsToBadInternalError() + { + Assert.That(HttpStatusMapper.Map((HttpStatusCode)599), + Is.EqualTo(StatusCodes.BadInternalError)); + } + + [Test] + public void GoneMapsToBadUnexpectedError() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.Gone), + Is.EqualTo(StatusCodes.BadUnexpectedError)); + } + + [Test] + public void RedirectMapsToBadUnexpectedError() + { + Assert.That(HttpStatusMapper.Map(HttpStatusCode.MovedPermanently), + Is.EqualTo(StatusCodes.BadUnexpectedError)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/HttpWotBindingChannelTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpWotBindingChannelTests.cs new file mode 100644 index 0000000000..3472f804ad --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpWotBindingChannelTests.cs @@ -0,0 +1,361 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Additional channel-level tests for HttpWotBindingChannel: + /// non-2xx responses mapped to OPC UA status codes, body-size enforcement, + /// codec decode failure, write semantics, action invocation with empty + /// body, and polling subscription creation. + /// + [TestFixture] + public sealed class HttpWotBindingChannelTests + { + private static WotProtocolBinderRegistry Registry( + HttpWotBindingOptions? options = null, + WotBindingBounds? bounds = null) + { + return new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [new HttpWotBindingExecutor(options ?? new HttpWotBindingOptions + { + ClientFactory = () => new HttpClient(), + CallerClientHandlesRedirectSafety = true + })], + bounds: bounds); + } + + private static WotBindingPlan Plan(WotProtocolBinderRegistry registry, string td) + { + return registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + private static string PropertyTd(string baseUrl, string contentType = "application/json") + { + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + baseUrl + "/prop\",\"contentType\":\"" + contentType + "\"}]}}}"; + } + + private static string ActionTd(string baseUrl, string contentType = "application/json") + { + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"actions\":{\"act\":{\"forms\":[{\"href\":\"" + + baseUrl + "/action\",\"contentType\":\"" + contentType + "\"}]}}}"; + } + + [Test] + public async Task HttpChannelReadNon2xxStatusReturnsMappedStatusCode() + { + using var server = new TestHttpServer((_, _, _) => + new TestHttpResponse(404, "text/plain", Encoding.UTF8.GetBytes("not found"))); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + // HTTP 404 maps to BadNotFound via HttpStatusMapper. + Assert.That(StatusCode.IsBad(result.Status), Is.True); + } + } + + [Test] + public async Task HttpChannelReadServerErrorStatusReturnsMappedStatusCode() + { + using var server = new TestHttpServer((_, _, _) => + new TestHttpResponse(500, "text/plain", Encoding.UTF8.GetBytes("error"))); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(StatusCode.IsBad(result.Status), Is.True); + } + } + + [Test] + public async Task HttpChannelReadBodyTooLargeReturnsBadEncodingLimitsExceeded() + { + // Respond with a body larger than the configured limit. + byte[] bigBody = Encoding.UTF8.GetBytes("\"" + new string('x', 20) + "\""); + using var server = new TestHttpServer((_, _, _) => + new TestHttpResponse(200, "application/json", bigBody)); + + // Limit MaxPayloadBytes to 10 so the 20-char body exceeds it. + var bounds = new WotBindingBounds { MaxPayloadBytes = 10 }; + WotProtocolBinderRegistry registry = Registry(bounds: bounds); + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadEncodingLimitsExceeded)); + } + } + + [Test] + public async Task HttpChannelReadBadDecodeReturnsBadDecodingError() + { + // Respond with malformed JSON so the JSON codec fails to decode. + byte[] badJson = Encoding.UTF8.GetBytes("{this is not valid json!}"); + using var server = new TestHttpServer((_, _, _) => + new TestHttpResponse(200, "application/json", badJson)); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadDecodingError)); + } + } + + [Test] + public async Task HttpChannelWriteReturnsGoodOnSuccess() + { + using var server = new TestHttpServer((method, path, _) => + { + if (method == "PUT" && path == "/prop") + { + return new TestHttpResponse(200, "application/json", Encoding.UTF8.GetBytes("OK")); + } + return new TestHttpResponse(405, "text/plain", []); + }); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant(42L))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + } + + [Test] + public async Task HttpChannelWriteNon2xxReturnsMappedStatusCode() + { + using var server = new TestHttpServer((_, _, _) => + new TestHttpResponse(403, "text/plain", Encoding.UTF8.GetBytes("forbidden"))); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant(1L))).ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(StatusCode.IsBad(result.Status), Is.True); + } + } + + [Test] + public async Task HttpChannelInvokeWithEmptyResponseBodyReturnsGoodWithNoOutput() + { + using var server = new TestHttpServer((method, path, _) => + { + if (method == "POST" && path == "/action") + { + // Return 200 with empty body. + return new TestHttpResponse(200, "application/json", []); + } + return new TestHttpResponse(404, "text/plain", []); + }); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, ActionTd(server.BaseUrl)); + WotCompiledForm invoke = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await registry.OpenChannelAsync(invoke).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync([]).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Outputs, Is.Empty); + } + } + + [Test] + public async Task HttpChannelInvokeWithInputsAndJsonResponseDecodesOutput() + { + using var server = new TestHttpServer((method, path, _) => + { + if (method == "POST" && path == "/action") + { + return new TestHttpResponse(200, "application/json", Encoding.UTF8.GetBytes("99")); + } + return new TestHttpResponse(404, "text/plain", []); + }); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, ActionTd(server.BaseUrl)); + WotCompiledForm invoke = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await registry.OpenChannelAsync(invoke).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync( + [new Variant(1L)]).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Outputs, Has.Count.EqualTo(1)); + } + } + + [Test] + public async Task HttpChannelObserveAsyncCreatesPollingSubscription() + { + int pollCount = 0; + using var server = new TestHttpServer((_, _, _) => + { + Interlocked.Increment(ref pollCount); + return TestHttpResponse.Json(200, pollCount.ToString(System.Globalization.CultureInfo.InvariantCulture)); + }); + + WotProtocolBinderRegistry registry = Registry( + options: new HttpWotBindingOptions + { + ClientFactory = () => new HttpClient(), + CallerClientHandlesRedirectSafety = true, + ObserveInterval = TimeSpan.FromMilliseconds(100) + }); + + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + var received = new ConcurrentQueue(); + IWotSubscription sub = await channel.ObserveAsync(n => received.Enqueue(n)) + .ConfigureAwait(false); + await using (sub.ConfigureAwait(false)) + { + // Wait for at least one notification from the polling loop. + bool got = false; + for (int i = 0; i < 80 && !got; i++) + { + if (!received.IsEmpty) + { + got = true; + } + await Task.Delay(50).ConfigureAwait(false); + } + Assert.That(got, Is.True, "ObserveAsync should create a polling subscription that delivers data."); + } + } + } + + [Test] + public async Task HttpChannelSubscribeEventAsyncDelegatesToObserve() + { + using var server = new TestHttpServer((_, _, _) => + TestHttpResponse.Json(200, "123")); + + WotProtocolBinderRegistry registry = Registry( + options: new HttpWotBindingOptions + { + ClientFactory = () => new HttpClient(), + CallerClientHandlesRedirectSafety = true, + ObserveInterval = TimeSpan.FromMilliseconds(100) + }); + + WotBindingPlan plan = Plan(registry, PropertyTd(server.BaseUrl)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + var received = new ConcurrentQueue(); + IWotSubscription sub = await channel.SubscribeEventAsync(n => received.Enqueue(n)) + .ConfigureAwait(false); + await using (sub.ConfigureAwait(false)) + { + bool got = false; + for (int i = 0; i < 80 && !got; i++) + { + if (!received.IsEmpty) + { + got = true; + } + await Task.Delay(50).ConfigureAwait(false); + } + Assert.That(got, Is.True, + "SubscribeEventAsync should delegate to ObserveAsync and deliver notifications."); + } + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/HttpWotExecutorTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpWotExecutorTests.cs new file mode 100644 index 0000000000..1aa7721cf8 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/HttpWotExecutorTests.cs @@ -0,0 +1,216 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// End-to-end tests for the HTTP executor against an in-process HTTP server. + /// + [TestFixture] + public sealed class HttpWotExecutorTests + { + private static WotProtocolBinderRegistry Registry(HttpWotBindingOptions? options = null) + { + return new WotProtocolBinderRegistry( + [new HttpBindingPlanner()], + [ new HttpWotBindingExecutor(options ?? + new HttpWotBindingOptions()) ]); + } + + private static WotBindingPlan Plan(WotProtocolBinderRegistry registry, string td) + { + return registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + [Test] + public async Task HttpReadWriteActionEndToEnd() + { + var store = new ConcurrentDictionary(); + store["/prop"] = "10"; + using var server = new TestHttpServer((method, path, body) => + { + if (path == "/prop" && method == "GET") + { + return TestHttpResponse.Json(200, store.GetValueOrDefault("/prop", "0")); + } + if (path == "/prop" && method == "PUT") + { + store["/prop"] = Encoding.UTF8.GetString(body); + return new TestHttpResponse(204, "text/plain", []); + } + if (path == "/action" && method == "POST") + { + return TestHttpResponse.Json(200, "\"done\""); + } + return TestHttpResponse.Json(404, "\"missing\""); + }); + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"temp\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + server.BaseUrl + + "/prop\"}]}}," + + "\"actions\":{\"act\":{\"forms\":[{\"href\":\"" + + server.BaseUrl + + "/action\"}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + + WotCompiledForm read = plan.CompiledForms.First( + f => f.AffordanceName == "temp" && f.Operation == WoTBindingCapabilityEnum.ReadProperty); + WotCompiledForm write = plan.CompiledForms.First( + f => f.AffordanceName == "temp" && f.Operation == WoTBindingCapabilityEnum.WriteProperty); + WotCompiledForm invoke = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel readChannel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult result = await readChannel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(10L)); + } + + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + WotWriteResult result = await writeChannel.WriteAsync( + new DataValue(new Variant(42L))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + IWotBindingChannel reread = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (reread.ConfigureAwait(false)) + { + WotReadResult result = await reread.ReadAsync().ConfigureAwait(false); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(42L)); + } + + IWotBindingChannel actionChannel = await registry.OpenChannelAsync(invoke).ConfigureAwait(false); + await using (actionChannel.ConfigureAwait(false)) + { + WotInvokeResult result = await actionChannel.InvokeAsync([]).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Outputs, Has.Count.EqualTo(1)); + Assert.That(result.Outputs[0].WrappedValue.AsBoxedObject(), Is.EqualTo("done")); + } + } + + [Test] + public async Task HttpObserveDeliversValueChanges() + { + var store = new ConcurrentDictionary(); + store["/prop"] = "1"; + using var server = new TestHttpServer((method, path, body) => + TestHttpResponse.Json(200, store.GetValueOrDefault("/prop", "0"))); + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"w\":{\"type\":\"number\",\"observable\":true,\"forms\":[{\"href\":\"" + + server.BaseUrl + + "/prop\",\"op\":[\"observeproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(new HttpWotBindingOptions + { + ObserveInterval = TimeSpan.FromMilliseconds(100) + }); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm observe = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + + var received = new ConcurrentQueue(); + IWotBindingChannel channel = await registry.OpenChannelAsync(observe).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + IWotSubscription subscription = await channel.ObserveAsync(n => + { + if (n.Value.WrappedValue.AsBoxedObject() is long value) + { + received.Enqueue(value); + } + }).ConfigureAwait(false); + await using (subscription.ConfigureAwait(false)) + { + store["/prop"] = "99"; + Assert.That( + await WaitForAsync(received, 99).ConfigureAwait(false), + Is.True, + "The observe channel must deliver the change."); + } + } + } + + [Test] + public async Task HttpNotFoundMapsToBadNodeIdUnknown() + { + using var server = new TestHttpServer((method, path, body) => TestHttpResponse.Json(404, "\"no\"")); + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"temp\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + server.BaseUrl + + "/x\"}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm read = plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + } + } + + private static async Task WaitForAsync(ConcurrentQueue queue, long expected) + { + for (int i = 0; i < 50; i++) + { + if (queue.Contains(expected)) + { + return true; + } + await Task.Delay(50).ConfigureAwait(false); + } + return false; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusBindingPlannerAdditionalTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusBindingPlannerAdditionalTests.cs new file mode 100644 index 0000000000..8c5046a793 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusBindingPlannerAdditionalTests.cs @@ -0,0 +1,209 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using System.Text; +using NUnit.Framework; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Additional unit tests for : integer function codes, + /// discrete-input and input-register entity compilations, read/write function-direction + /// conflicts, write-multiple-coils, and unit-id resolution from the href path. + /// + [TestFixture] + public sealed class ModbusBindingPlannerAdditionalTests + { + private static WotProtocolBinderRegistry Registry() + { + return new WotProtocolBinderRegistry([new ModbusBindingPlanner()]); + } + + private static WotBindingPlan PreparePropertyForm(string formContent, string affordanceName = "p") + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"properties\":{\"" + affordanceName + "\":{\"type\":\"number\"," + + "\"forms\":[{" + formContent + "}]}}}"; + + return Registry().Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + [Test] + public void ModbusPlannerCarriesTheStandardPollingTimeOntoTheCompiledForm() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:pollingTime\":250,\"op\":\"observeproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That( + plan.CompiledForms[0].OperationInfo.PollInterval, + Is.EqualTo(TimeSpan.FromMilliseconds(250)), + "modv:pollingTime is the W3C Modbus binding's standard subscription polling " + + "interval in milliseconds, so a per-affordance rate needs no vendor term."); + } + + [Test] + public void ModbusPlannerLeavesThePollIntervalUnsetWhenTheFormOmitsPollingTime() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"observeproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].OperationInfo.PollInterval, Is.Null, + "Without the term the executor's configured ObserveInterval must apply."); + } + + [Test] + public void ModbusPlannerRejectsANonPositivePollingTime() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:pollingTime\":0,\"op\":\"observeproperty\""); + + Assert.That(plan.CompiledForms, Is.Empty); + Assert.That( + plan.Diagnostics.Any(d => d.Term == "modv:pollingTime"), + Is.True, + "An unusable polling interval must be reported against the term that carried it."); + } + + [Test] + public void ModbusPlannerCompilesWithIntegerFunctionCodeField() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":3," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].Addressing.Metadata.ContainsKey("function"), Is.True); + Assert.That(plan.CompiledForms[0].Addressing.Metadata["function"], Is.EqualTo("readHoldingRegisters")); + } + + [Test] + public void ModbusPlannerCompilesDiscreteInputEntityForReadProperty() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"discreteInput\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].OperationInfo.Method, Is.EqualTo("readDiscreteInput")); + } + + [Test] + public void ModbusPlannerCompilesInputRegisterEntityForReadProperty() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"inputRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].OperationInfo.Method, Is.EqualTo("readInputRegister")); + } + + [Test] + public void ModbusPlannerDropsWriteOperationForReadOnlyEntityAndPreservesRead() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"discreteInput\"," + + "\"modv:address\":0"); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms.All(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.ConflictingFields && + d.Severity == WotDiagnosticSeverity.Warning), Is.True); + } + + [Test] + public void ModbusPlannerDropsReadOperationWhenFunctionIsWriteDirected() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":\"writeSingleHoldingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Empty); + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.ConflictingFields), Is.True); + } + + [Test] + public void ModbusPlannerDropsWriteOperationWhenFunctionIsReadDirected() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":\"readHoldingRegisters\"," + + "\"modv:address\":0,\"op\":\"writeproperty\""); + + Assert.That(plan.CompiledForms, Is.Empty); + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.ConflictingFields), Is.True); + } + + [Test] + public void ModbusPlannerCompilesWriteMultipleCoilsForCoilEntityWithQuantityGreaterThanOne() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"coil\"," + + "\"modv:address\":0,\"modv:quantity\":2,\"op\":\"writeproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].OperationInfo.Method, Is.EqualTo("writeMultipleCoils")); + } + + [Test] + public void ModbusPlannerParsesUnitIdFromHrefPath() + { + WotBindingPlan plan = PreparePropertyForm( + "\"href\":\"modbus+tcp://127.0.0.1:502/3\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].Addressing.Metadata["unitId"], Is.EqualTo("3")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusBindingPlannerTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusBindingPlannerTests.cs new file mode 100644 index 0000000000..b12f9bf29d --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusBindingPlannerTests.cs @@ -0,0 +1,439 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for validation and compilation logic. + /// + [TestFixture] + public sealed class ModbusBindingPlannerTests + { + private static WotProtocolBinderRegistry Registry() + { + return new WotProtocolBinderRegistry([new ModbusBindingPlanner()]); + } + + private static WotBindingPlan PrepareForm(string formContent, string affordanceName = "p") + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"properties\":{\"" + affordanceName + "\":{\"type\":\"number\"," + + "\"forms\":[{" + formContent + "}]}}}"; + return Registry().Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + [Test] + public void PlannerCompilesMinimaValidForm() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + } + + [Test] + public void PlannerRejectsInvalidScheme() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"http://127.0.0.1:80/p\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + + [Test] + public void PlannerRejectsAddressAboveMax() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":65536,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void PlannerRejectsNegativeAddress() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":-1,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + + [Test] + public void PlannerRejectsAddressPlusQuantityBeyond16Bit() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":65500,\"modv:quantity\":40,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.BoundsExceeded), Is.True); + } + + [Test] + public void PlannerAcceptsAddressPlusQuantityAtExactBoundary() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":65535,\"modv:quantity\":1,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + } + + [Test] + public void PlannerRejectsInvalidEntityName() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"invalidEntity\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void PlannerRejectsFormWithNeitherEntityNorFunction() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void PlannerRejectsEntityFunctionEntityMismatch() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"coil\",\"modv:function\":3," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.ConflictingFields), Is.True); + } + + [Test] + public void PlannerRejectsWriteFunctionWithReadOperation() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":6," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + + [Test] + public void PlannerRejectsReadFunctionWithWriteOperation() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":3," + + "\"modv:address\":0,\"op\":\"writeproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + + [Test] + public void PlannerDropsWriteOnReadOnlyEntityButPreservesRead() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"discreteInput\"," + + "\"modv:address\":0"); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.False); + } + + [Test] + public void PlannerDropsWriteOnInputRegisterButPreservesRead() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"inputRegister\"," + + "\"modv:address\":0"); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.False); + } + + [Test] + public void PlannerRejectsQuantityBelowOne() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:quantity\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void PlannerRejectsRegisterQuantityAboveMax() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:quantity\":126,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.BoundsExceeded), Is.True); + } + + [Test] + public void PlannerAcceptsCoilQuantityUpToMaxCoil() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"coil\"," + + "\"modv:address\":0,\"modv:quantity\":2000,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + } + + [Test] + public void PlannerRejectsInvalidUnitId() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:unitID\":256,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void PlannerAcceptsZeroUnitId() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:unitID\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + } + + [Test] + public void PlannerAcceptsFunctionCode1WithReadOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":1," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + } + + [Test] + public void PlannerAcceptsFunctionCode2WithReadOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":2," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + } + + [Test] + public void PlannerAcceptsFunctionCode4WithReadOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":4," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + } + + [Test] + public void PlannerAcceptsFunctionCode5WithWriteOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":5," + + "\"modv:address\":0,\"op\":\"writeproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.True); + } + + [Test] + public void PlannerAcceptsFunctionCode15WithWriteOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":15," + + "\"modv:address\":0,\"op\":\"writeproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.True); + } + + [Test] + public void PlannerAcceptsFunctionCode16WithWriteOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":16," + + "\"modv:address\":0,\"op\":\"writeproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.True); + } + + [Test] + public void PlannerRejectsUnknownFunctionCode() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:function\":99," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void PlannerAcceptsModbusSchemeAltForm() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus://127.0.0.1:502/1\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + } + + [Test] + public void PlannerExtractsUnitIdFromHrefPath() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502/5\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms[0].Addressing.Target, Does.Contain("@5")); + } + + [Test] + public void PlannerEncodesAddressingTargetCorrectly() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":10,\"modv:quantity\":3," + + "\"modv:unitID\":1,\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + string target = plan.CompiledForms[0].Addressing.Target; + Assert.That(target, Does.Contain("holdingRegister")); + Assert.That(target, Does.Contain(":10:")); + Assert.That(target, Does.Contain(":3@1")); + } + + [Test] + public void PlannerStoresDataTypeInPayloadMetadata() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:type\":\"float32\",\"op\":\"readproperty\""); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That( + plan.CompiledForms[0].Payload.Metadata.TryGetValue("type", out string? t) && t == "float32", + Is.True); + } + + [Test] + public void PlannerHandlesObservePropertyOp() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"modbus+tcp://127.0.0.1:502\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"observeproperty\""); + + Assert.That(plan.CompiledForms.Any(f => + f.Operation == WoTBindingCapabilityEnum.ObserveProperty), Is.True); + } + + [Test] + public void PlannerRejectsInvalidHref() + { + WotBindingPlan plan = PrepareForm( + "\"href\":\"not-a-uri\"," + + "\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"op\":\"readproperty\""); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusDataConverterAdditionalTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusDataConverterAdditionalTests.cs new file mode 100644 index 0000000000..9fac88cbcc --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusDataConverterAdditionalTests.cs @@ -0,0 +1,242 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Modbus; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Additional unit tests for covering + /// type aliases and byte / word order combinations not exercised by + /// the baseline test file. + /// + [TestFixture] + public sealed class ModbusDataConverterAdditionalTests + { + [TestCase("ushort", 1)] + [TestCase("uint", 2)] + [TestCase("float", 2)] + [TestCase("int16", 1)] + [TestCase("uint16", 1)] + [TestCase("int32", 2)] + [TestCase("uint32", 2)] + [TestCase("float32", 2)] + [TestCase("int64", 4)] + [TestCase("uint64", 4)] + [TestCase("float64", 4)] + public void RegisterCountRecognizesCanonicalAndAliasNames(string type, int expected) + { + Assert.That(ModbusDataConverter.RegisterCount(type), Is.EqualTo(expected)); + } + + [TestCase("int16", (short)-1000)] + [TestCase("uint16", (ushort)50000)] + public void Int16RoundTripsWithLsbFirstByteOrder(string type, object value) + { + Variant input = value is short s ? new Variant(s) : new Variant((ushort)value); + ushort[] registers = ModbusDataConverter.ToRegisters(input, type, msbFirst: false, mswFirst: true); + Variant actual = ModbusDataConverter.ToVariant(registers, type, msbFirst: false, mswFirst: true); + + Assert.That( + Convert.ToDouble(actual.AsBoxedObject(), CultureInfo.InvariantCulture), + Is.EqualTo(Convert.ToDouble(value, CultureInfo.InvariantCulture)).Within(0.001)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void Uint32RoundTripsAcrossAllByteWordOrders(bool msbFirst, bool mswFirst) + { + const uint expected = 0xDEADBEEFu; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "uint32", msbFirst, mswFirst); + Variant actual = ModbusDataConverter.ToVariant(registers, "uint32", msbFirst, mswFirst); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void Float32RoundTripsAcrossAllByteWordOrders(bool msbFirst, bool mswFirst) + { + const float expected = -123.456f; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "float32", msbFirst, mswFirst); + Variant actual = ModbusDataConverter.ToVariant(registers, "float32", msbFirst, mswFirst); + + Assert.That( + System.Convert.ToSingle(actual.AsBoxedObject(), CultureInfo.InvariantCulture), + Is.EqualTo(expected).Within(0.001f)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void Int64RoundTripsAcrossAllByteWordOrders(bool msbFirst, bool mswFirst) + { + const long expected = -9876543210L; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "int64", msbFirst, mswFirst); + Variant actual = ModbusDataConverter.ToVariant(registers, "int64", msbFirst, mswFirst); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void Uint64RoundTripsAcrossAllByteWordOrders(bool msbFirst, bool mswFirst) + { + const ulong expected = 0xFEDCBA9876543210uL; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "uint64", msbFirst, mswFirst); + Variant actual = ModbusDataConverter.ToVariant(registers, "uint64", msbFirst, mswFirst); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void Float64RoundTripsAcrossAllByteWordOrders(bool msbFirst, bool mswFirst) + { + const double expected = 3.141592653589793; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "float64", msbFirst, mswFirst); + Variant actual = ModbusDataConverter.ToVariant(registers, "float64", msbFirst, mswFirst); + + Assert.That( + System.Convert.ToDouble(actual.AsBoxedObject(), CultureInfo.InvariantCulture), + Is.EqualTo(expected).Within(1e-10)); + } + + [Test] + public void Uint16ViaUshortAliasRoundTrips() + { + const ushort expected = 12345; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "ushort", msbFirst: true, mswFirst: true); + Variant actual = ModbusDataConverter.ToVariant(registers, "ushort", msbFirst: true, mswFirst: true); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [Test] + public void Uint32ViaUintAliasRoundTrips() + { + const uint expected = 987654321u; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "uint", msbFirst: true, mswFirst: true); + Variant actual = ModbusDataConverter.ToVariant(registers, "uint", msbFirst: true, mswFirst: true); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [Test] + public void Float32ViaFloatAliasRoundTrips() + { + const float expected = 9.99f; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), "float", msbFirst: true, mswFirst: true); + Variant actual = ModbusDataConverter.ToVariant(registers, "float", msbFirst: true, mswFirst: true); + + Assert.That( + System.Convert.ToSingle(actual.AsBoxedObject(), CultureInfo.InvariantCulture), + Is.EqualTo(expected).Within(0.001f)); + } + + [Test] + public void DefaultTypeIsUint16WhenTypeIsNull() + { + const ushort expected = 42; + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), null!, msbFirst: true, mswFirst: true); + Variant actual = ModbusDataConverter.ToVariant(registers, null!, msbFirst: true, mswFirst: true); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [Test] + public void ToVariantThrowsWhenRegisterCountIsTooSmallForInt64() + { + ModbusException ex = Assert.Throws( + () => ModbusDataConverter.ToVariant([0x1234, 0x5678], "int64", + msbFirst: true, mswFirst: true))!; + + Assert.That(ex.Message, Does.Contain("requires 4 registers")); + } + + [Test] + public void ToVariantThrowsWhenRegisterCountIsTooSmallForFloat32() + { + ModbusException ex = Assert.Throws( + () => ModbusDataConverter.ToVariant([0x1234], "float32", + msbFirst: true, mswFirst: true))!; + + Assert.That(ex.Message, Does.Contain("requires 2 registers")); + } + + [Test] + public void Int16LsbFirstAndMsbFirstProduceDifferentRegisters() + { + Variant value = new Variant((short)0x1234); + + ushort[] msb = ModbusDataConverter.ToRegisters(value, "int16", msbFirst: true, mswFirst: true); + ushort[] lsb = ModbusDataConverter.ToRegisters(value, "int16", msbFirst: false, mswFirst: true); + + // MSB first: high byte in high bits of register word. + // LSB first: bytes are swapped within the register. + Assert.That(msb[0], Is.Not.EqualTo(lsb[0])); + } + + [Test] + public void Int32MswFirstAndLswFirstProduceDifferentRegisterOrder() + { + const int value = 0x12345678; + + ushort[] msw = ModbusDataConverter.ToRegisters( + new Variant(value), "int32", msbFirst: true, mswFirst: true); + ushort[] lsw = ModbusDataConverter.ToRegisters( + new Variant(value), "int32", msbFirst: true, mswFirst: false); + + // The register order should be reversed. + Assert.That(msw[0], Is.EqualTo(lsw[1])); + Assert.That(msw[1], Is.EqualTo(lsw[0])); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusDataConverterTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusDataConverterTests.cs new file mode 100644 index 0000000000..5b1cd77a97 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusDataConverterTests.cs @@ -0,0 +1,127 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Modbus; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + [TestFixture] + public sealed class ModbusDataConverterTests + { + [TestCase("short", 1)] + [TestCase("word", 1)] + [TestCase("int", 2)] + [TestCase("dword", 2)] + [TestCase("single", 2)] + [TestCase("long", 4)] + [TestCase("ulong", 4)] + [TestCase("double", 4)] + [TestCase("unknown", 1)] + [TestCase(null, 1)] + public void RegisterCountRecognizesAliases(string? type, int expected) + { + Assert.That(ModbusDataConverter.RegisterCount(type!), Is.EqualTo(expected)); + } + + [TestCase(true, true)] + [TestCase(true, false)] + [TestCase(false, true)] + [TestCase(false, false)] + public void Int32RoundTripsAcrossByteAndWordOrders(bool msbFirst, bool mswFirst) + { + const int expected = 0x12345678; + + ushort[] registers = ModbusDataConverter.ToRegisters( + new Variant(expected), + "int32", + msbFirst, + mswFirst); + var actual = ModbusDataConverter.ToVariant( + registers, + "int32", + msbFirst, + mswFirst); + + Assert.That(actual.AsBoxedObject(), Is.EqualTo(expected)); + } + + [TestCase("int16", -1234.0)] + [TestCase("uint16", 54321.0)] + [TestCase("uint32", 305419896.0)] + [TestCase("float32", 123.5)] + [TestCase("int64", -1234567890123.0)] + [TestCase("uint64", 1234567890123.0)] + [TestCase("float64", 123456.75)] + [TestCase("unknown", 42.0)] + public void NumericTypesRoundTrip(string type, double expected) + { + Variant input = type switch + { + "int16" => new Variant(Convert.ToInt16(expected)), + "uint16" or "unknown" => new Variant(Convert.ToUInt16(expected)), + "uint32" => new Variant(Convert.ToUInt32(expected)), + "float32" => new Variant(Convert.ToSingle(expected)), + "int64" => new Variant(Convert.ToInt64(expected)), + "uint64" => new Variant(Convert.ToUInt64(expected)), + _ => new Variant(expected) + }; + + ushort[] registers = ModbusDataConverter.ToRegisters( + input, + type, + msbFirst: true, + mswFirst: true); + var actual = ModbusDataConverter.ToVariant( + registers, + type, + msbFirst: true, + mswFirst: true); + + Assert.That( + Convert.ToDouble(actual.AsBoxedObject(), CultureInfo.InvariantCulture), + Is.EqualTo(expected).Within(0.001)); + } + + [Test] + public void ToVariantRejectsInsufficientRegisters() + { + ModbusException exception = Assert.Throws( + () => ModbusDataConverter.ToVariant( + [0x1234], + "int32", + msbFirst: true, + mswFirst: true))!; + + Assert.That(exception.Message, Does.Contain("requires 2 registers")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusTcpClientHardeningTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusTcpClientHardeningTests.cs new file mode 100644 index 0000000000..4ec83b1baf --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusTcpClientHardeningTests.cs @@ -0,0 +1,407 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Modbus; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Hardening tests for : hostile / truncated + /// responses must map to a (never an out-of-range + /// index), and a timeout must fault the connection so a fresh reconnect is + /// required and works deterministically. + /// + [TestFixture] + public sealed class ModbusTcpClientHardeningTests + { + [Test] + public async Task TruncatedRegisterResponseThrowsModbusException() + { + // A register-read response whose declared byte count (4) exceeds the + // register bytes actually present in the frame. Before the bounds + // check this indexed out of range; now it maps to a ModbusException. + using var server = new ScriptedModbusServer((_, pdu) => + pdu[0] == 0x03 + ? [0x03, 0x04, 0x00, 0x2A] // byteCount 4, only 1 register present + : null); + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync(1, 0, 2, CancellationToken.None).ConfigureAwait(false)); + } + + [Test] + public async Task TruncatedBitResponseThrowsModbusException() + { + // A coil-read response claiming a byte count (2) larger than the frame + // carries, so a naive read would index past the end of the buffer. + using var server = new ScriptedModbusServer((_, pdu) => + pdu[0] == 0x01 + ? [0x01, 0x02, 0x01] // byteCount 2, only 1 data byte present + : null); + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + Assert.ThrowsAsync(async () => + await client.ReadCoilsAsync(1, 0, 9, CancellationToken.None).ConfigureAwait(false)); + } + + [Test] + public async Task TimeoutFaultsConnectionThenNextOperationReconnects() + { + using var server = new ScriptedModbusServer((connection, pdu) => + { + // First connection: never respond so the client times out. Second + // (reconnect) connection: answer the register read normally. + if (connection == 0) + { + return null; + } + return [0x03, 0x02, 0x12, 0x34]; + }); + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromMilliseconds(300)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + // The silent server causes the request to time out. + Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync(1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + + // The connection is now faulted, so the next operation opens a fresh + // socket itself instead of requiring activation to run again. + ushort[] registers = await client + .ReadHoldingRegistersAsync(1, 0, 1, CancellationToken.None).ConfigureAwait(false); + Assert.That(registers, Has.Length.EqualTo(1)); + Assert.That(registers[0], Is.EqualTo((ushort)0x1234)); + } + + [Test] + public async Task DroppedConnectionReconnectsOncePerOperationAndRecovers() + { + using var server = new TestModbusServer(); + server.HoldingRegisters[0] = 0x1234; + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ushort[] first = await client + .ReadHoldingRegistersAsync(1, 0, 1, CancellationToken.None).ConfigureAwait(false); + Assert.That(first, Is.EqualTo(new ushort[] { 0x1234 })); + + server.RejectConnections = true; + server.DisconnectClients(); + + Exception? dropped = Assert.CatchAsync(async () => + await client.ReadHoldingRegistersAsync(1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + Assert.That(dropped, Is.TypeOf().Or.TypeOf()); + + int acceptedBeforeReconnect = server.AcceptedConnectionCount; + Exception? rejected = Assert.CatchAsync(async () => + await client.ReadHoldingRegistersAsync(1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + Assert.That(rejected, Is.TypeOf().Or.TypeOf()); + Assert.That( + server.AcceptedConnectionCount - acceptedBeforeReconnect, + Is.EqualTo(1), + "A single failed operation must not loop and open a storm of reconnect sockets."); + + server.RejectConnections = false; + server.HoldingRegisters[0] = 0x5678; + + ushort[] recovered = await client + .ReadHoldingRegistersAsync(1, 0, 1, CancellationToken.None).ConfigureAwait(false); + Assert.That(recovered, Is.EqualTo(new ushort[] { 0x5678 })); + } + + [Test] + public async Task WriteMultipleCoilsAcceptsProtocolMaximum() + { + using var server = new TestModbusServer(); + bool[] values = new bool[1968]; + values[0] = true; + values[7] = true; + values[8] = true; + values[^1] = true; + + using var client = new ModbusTcpClient( + "127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + await client + .WriteMultipleCoilsAsync(1, 0, values, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(server.LastFunctionCode, Is.EqualTo(0x0F)); + Assert.That(server.Coils.Take(values.Length), Is.EqualTo(values)); + } + + [Test] + public void WriteMultipleCoilsRejectsQuantityAboveProtocolMaximum() + { + using var client = new ModbusTcpClient( + "127.0.0.1", 502, TimeSpan.FromSeconds(2)); + + ArgumentOutOfRangeException? exception = Assert.ThrowsAsync( + async () => await client + .WriteMultipleCoilsAsync(1, 0, new bool[1969], CancellationToken.None) + .ConfigureAwait(false)); + Assert.That(exception!.Message, Does.Contain("1968")); + } + + [TestCaseSource(nameof(InvalidSingleCoilAcknowledgements))] + public async Task WriteSingleCoilRejectsInvalidAcknowledgement( + byte[] acknowledgement, + string expectedError) + { + using var server = new ScriptedModbusServer((_, pdu) => + pdu[0] == 0x05 ? acknowledgement : null); + using var client = new ModbusTcpClient( + "127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ModbusException? exception = Assert.ThrowsAsync( + async () => await client + .WriteSingleCoilAsync(1, 0, true, CancellationToken.None) + .ConfigureAwait(false)); + Assert.That(exception!.Message, Does.Contain(expectedError)); + } + + [TestCaseSource(nameof(InvalidMultipleCoilAcknowledgements))] + public async Task WriteMultipleCoilsRejectsInvalidAcknowledgement( + byte[] acknowledgement, + string expectedError) + { + using var server = new ScriptedModbusServer((_, pdu) => + pdu[0] == 0x0F ? acknowledgement : null); + using var client = new ModbusTcpClient( + "127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ModbusException? exception = Assert.ThrowsAsync( + async () => await client + .WriteMultipleCoilsAsync(1, 0, [true, false], CancellationToken.None) + .ConfigureAwait(false)); + Assert.That(exception!.Message, Does.Contain(expectedError)); + } + + private static IEnumerable InvalidSingleCoilAcknowledgements() + { + yield return new TestCaseData( + new byte[] { 0x05, 0x00, 0x00, 0xFF }, + "exactly 5 bytes") + .SetName("WriteSingleCoilRejectsTruncatedAcknowledgement"); + yield return new TestCaseData( + new byte[] { 0x05, 0x00, 0x00, 0xFF, 0x00, 0x00 }, + "exactly 5 bytes") + .SetName("WriteSingleCoilRejectsOversizedAcknowledgement"); + yield return new TestCaseData( + new byte[] { 0x05, 0x00, 0x01, 0xFF, 0x00 }, + "requested address") + .SetName("WriteSingleCoilRejectsMismatchedAddress"); + yield return new TestCaseData( + new byte[] { 0x05, 0x00, 0x00, 0x00, 0x00 }, + "requested value") + .SetName("WriteSingleCoilRejectsMismatchedValue"); + } + + private static IEnumerable InvalidMultipleCoilAcknowledgements() + { + yield return new TestCaseData( + new byte[] { 0x0F, 0x00, 0x00, 0x00 }, + "exactly 5 bytes") + .SetName("WriteMultipleCoilsRejectsTruncatedAcknowledgement"); + yield return new TestCaseData( + new byte[] { 0x0F, 0x00, 0x00, 0x00, 0x02, 0x00 }, + "exactly 5 bytes") + .SetName("WriteMultipleCoilsRejectsOversizedAcknowledgement"); + yield return new TestCaseData( + new byte[] { 0x0F, 0x00, 0x01, 0x00, 0x02 }, + "requested address") + .SetName("WriteMultipleCoilsRejectsMismatchedAddress"); + yield return new TestCaseData( + new byte[] { 0x0F, 0x00, 0x00, 0x00, 0x03 }, + "requested value or quantity") + .SetName("WriteMultipleCoilsRejectsMismatchedQuantity"); + } + + /// + /// A minimal Modbus TCP listener whose per-request response is supplied by + /// a script. The script receives the zero-based accepted-connection index + /// and the request PDU and returns the response PDU, or null to hold + /// the connection open without responding (used to provoke a timeout). + /// + private sealed class ScriptedModbusServer : IDisposable + { + public ScriptedModbusServer(Func responder) + { + m_responder = responder; + m_listener = new TcpListener(IPAddress.Loopback, 0); + m_listener.Start(); + Port = ((IPEndPoint)m_listener.LocalEndpoint).Port; + m_loop = Task.Run(AcceptLoopAsync); + } + + public int Port { get; } + + public void Dispose() + { + m_cts.Cancel(); + m_listener.Stop(); + m_listener.Dispose(); + try + { + m_loop.Wait(2000); + } + catch (AggregateException) + { + // Ignore teardown faults. + } + m_cts.Dispose(); + } + + private async Task AcceptLoopAsync() + { + while (!m_cts.IsCancellationRequested) + { + TcpClient client; + try + { + client = await m_listener.AcceptTcpClientAsync().ConfigureAwait(false); + } + catch (ObjectDisposedException) + { + return; + } + catch (SocketException) + { + return; + } + int connection = m_connections++; + _ = Task.Run(() => ServeAsync(client, connection)); + } + } + + private async Task ServeAsync(TcpClient client, int connection) + { + using (client) + using (NetworkStream stream = client.GetStream()) + { + try + { + while (!m_cts.IsCancellationRequested) + { + byte[]? header = await ReadExactAsync(stream, 6).ConfigureAwait(false); + if (header is null) + { + return; + } + int length = (header[4] << 8) | header[5]; + byte[]? rest = await ReadExactAsync(stream, length).ConfigureAwait(false); + if (rest is null) + { + return; + } + byte unit = rest[0]; + byte[] pdu = new byte[rest.Length - 1]; + Array.Copy(rest, 1, pdu, 0, pdu.Length); + + byte[]? responsePdu = m_responder(connection, pdu); + if (responsePdu is null) + { + // Hold the connection open without answering so the + // client's request times out. + await Task.Delay(Timeout.Infinite, m_cts.Token).ConfigureAwait(false); + return; + } + + byte[] frame = BuildFrame(header[0], header[1], unit, responsePdu); + await stream.WriteAsync(frame).ConfigureAwait(false); + await stream.FlushAsync().ConfigureAwait(false); + } + } + catch (OperationCanceledException) + { + // Server shutting down. + } + catch (System.IO.IOException) + { + // Client disconnected. + } + } + } + + private static byte[] BuildFrame(byte txnHi, byte txnLo, byte unit, byte[] pdu) + { + int length = pdu.Length + 1; + byte[] frame = new byte[7 + pdu.Length]; + frame[0] = txnHi; + frame[1] = txnLo; + frame[2] = 0x00; + frame[3] = 0x00; + frame[4] = (byte)(length >> 8); + frame[5] = (byte)(length & 0xFF); + frame[6] = unit; + Array.Copy(pdu, 0, frame, 7, pdu.Length); + return frame; + } + + private static async Task ReadExactAsync(NetworkStream stream, int count) + { + byte[] buffer = new byte[count]; + int offset = 0; + while (offset < count) + { + int read = await stream.ReadAsync(buffer.AsMemory(offset, count - offset)).ConfigureAwait(false); + if (read == 0) + { + return null; + } + offset += read; + } + return buffer; + } + + private readonly Func m_responder; + private readonly TcpListener m_listener; + private readonly Task m_loop; + private readonly CancellationTokenSource m_cts = new(); + private int m_connections; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotBindingChannelTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotBindingChannelTests.cs new file mode 100644 index 0000000000..4637dc6d95 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotBindingChannelTests.cs @@ -0,0 +1,831 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Collections.Immutable; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Modbus; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Tests for ModbusWotBindingChannel (entity dispatch, error mapping, + /// polling subscriptions, disposal) and additional ModbusTcpClient + /// protocol paths (FC 02, FC 0x0F, exception responses, transaction-id mismatch, + /// zero-length responses, unexpected function codes, and not-connected faults). + /// + [TestFixture] + public sealed class ModbusWotBindingChannelTests + { + private static WotProtocolBinderRegistry Registry() + { + return new WotProtocolBinderRegistry( + [new ModbusBindingPlanner()], + [new ModbusWotBindingExecutor(new ModbusWotBindingOptions + { + ObserveInterval = TimeSpan.FromMilliseconds(100) + })]); + } + + private static WotBindingPlan Plan(WotProtocolBinderRegistry registry, string td) + { + return registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + private static string RegisterTd(int port, string entity, int address, int quantity, string type) + { + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + port.ToString(CultureInfo.InvariantCulture) + "/1\",\"modv:entity\":\"" + entity + + "\",\"modv:address\":" + address.ToString(CultureInfo.InvariantCulture) + + ",\"modv:quantity\":" + quantity.ToString(CultureInfo.InvariantCulture) + + ",\"modv:type\":\"" + type + "\"}]}}}"; + } + + private static string BooleanTd(int port, string entity, int address) + { + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"boolean\",\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + port.ToString(CultureInfo.InvariantCulture) + "/1\",\"modv:entity\":\"" + entity + + "\",\"modv:address\":" + address.ToString(CultureInfo.InvariantCulture) + + ",\"modv:quantity\":1}]}}}"; + } + + private static WotCompiledForm BuildRawForm( + int port, string entity, WoTBindingCapabilityEnum capability, string opName) + { + var addressing = new WotAddressingDescriptor( + entity + ":0:1@1", + ImmutableDictionary.Empty + .Add("entity", entity) + .Add("address", "0") + .Add("quantity", "1") + .Add("unitId", "1")); + var payload = new WotPayloadDescriptor( + "application/octet-stream", "octet-stream", + ImmutableDictionary.Empty + .Add("type", "uint16") + .Add("mostSignificantByte", "true") + .Add("mostSignificantWord", "true")); + return new WotCompiledForm( + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + capability, opName, + new WotEndpointDescriptor( + "modbus+tcp", "127.0.0.1", port, + "modbus+tcp://127.0.0.1:" + port.ToString(CultureInfo.InvariantCulture)), + addressing, + new WotOperationDescriptor(capability, opName, opName), + payload, + [], isExecutable: true); + } + + private static async Task WaitForNotificationAsync( + ConcurrentQueue queue, int maxAttempts = 100) + { + for (int i = 0; i < maxAttempts; i++) + { + if (!queue.IsEmpty) + { + return true; + } + await Task.Delay(50).ConfigureAwait(false); + } + return false; + } + + [Test] + public async Task ModbusChannelReadsInputRegisterEndToEnd() + { + using var server = new TestModbusServer(); + server.InputRegisters[5] = 0xABCD; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "inputRegister", 5, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo((ushort)0xABCD)); + } + } + + [Test] + public async Task ModbusChannelReadsDiscreteInputEndToEnd() + { + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x02) + { + return [0x02, 0x01, 0x01]; + } + return []; + }); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, BooleanTd(server.Port, "discreteInput", 0)); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.True); + } + } + + [Test] + public void ModbusChannelWriteToDiscreteInputIsRejectedDuringActivation() + { + using var server = new TestModbusServer(); + WotCompiledForm form = BuildRawForm( + server.Port, "discreteInput", WoTBindingCapabilityEnum.WriteProperty, "writeproperty"); + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + } + + [Test] + public void ModbusChannelWriteToInputRegisterIsRejectedDuringActivation() + { + using var server = new TestModbusServer(); + WotCompiledForm form = BuildRawForm( + server.Port, "inputRegister", WoTBindingCapabilityEnum.WriteProperty, "writeproperty"); + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + } + + [Test] + public async Task ModbusChannelInvokeAsyncReturnsBadNotSupported() + { + using var server = new TestModbusServer(); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync([]).ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNotSupported)); + } + } + + [Test] + public async Task ModbusChannelObserveAsyncReceivesNotification() + { + using var server = new TestModbusServer(); + server.HoldingRegisters[0] = 0x0042; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + var received = new ConcurrentQueue(); + IWotSubscription sub = await channel.ObserveAsync(n => received.Enqueue(n)) + .ConfigureAwait(false); + await using (sub.ConfigureAwait(false)) + { + bool got = await WaitForNotificationAsync(received).ConfigureAwait(false); + Assert.That(got, Is.True, "The observe subscription should deliver at least one notification."); + } + } + } + + [Test] + public async Task ModbusChannelSubscribeEventAsyncReceivesNotification() + { + using var server = new TestModbusServer(); + server.HoldingRegisters[0] = 0x0007; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + var received = new ConcurrentQueue(); + IWotSubscription sub = await channel.SubscribeEventAsync(n => received.Enqueue(n)) + .ConfigureAwait(false); + await using (sub.ConfigureAwait(false)) + { + bool got = await WaitForNotificationAsync(received).ConfigureAwait(false); + Assert.That(got, Is.True, + "SubscribeEventAsync should delegate to ObserveAsync and deliver notifications."); + } + } + } + + [Test] + public async Task ModbusChannelDisposeAsyncIsIdempotent() + { + using var server = new TestModbusServer(); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + + // First dispose should succeed. + await channel.DisposeAsync().ConfigureAwait(false); + + // Second dispose must not throw. + Assert.DoesNotThrowAsync( + async () => await channel.DisposeAsync().ConfigureAwait(false)); + } + + [Test] + public async Task ModbusChannelReadMapsModbusExceptionToStatusCode() + { + // Server returns Modbus exception 0x02 (illegal data address) for FC 03. + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x03) + { + return [0x83, 0x02]; + } + return []; + }); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + // Exception code 0x02 maps to BadNodeIdUnknown via ModbusStatusMapper. + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + } + } + + [Test] + public async Task ModbusChannelReadMapsTimeoutToBadTimeout() + { + // Server holds connection without responding on first request (timeout). + int connectionCount = 0; + using var server = new EphemeralModbusServer((conn, _) => + { + int c = Interlocked.Increment(ref connectionCount); + // Null = hold the connection open forever (provoke client timeout). + return c <= 0 ? null : null; + }); + + // Use a very short timeout so the test completes quickly. + var options = new ModbusWotBindingOptions { ObserveInterval = TimeSpan.FromSeconds(1) }; + var smallBounds = new WotBindingBounds { DefaultTimeout = TimeSpan.FromMilliseconds(300) }; + var registry = new WotProtocolBinderRegistry( + [new ModbusBindingPlanner()], + [new ModbusWotBindingExecutor(options)], + bounds: smallBounds); + + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadTimeout)); + } + } + + [Test] + public async Task ModbusChannelWriteMapsModbusExceptionToStatusCode() + { + // Server returns Modbus exception 0x03 (illegal data value) for FC 06. + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x06) + { + return [0x86, 0x03]; + } + return [pdu[0], pdu[1], pdu[2], pdu[3], pdu[4]]; + }); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant((ushort)42))).ConfigureAwait(false); + Assert.That(result.Success, Is.False); + // Exception code 0x03 maps to BadInvalidArgument via ModbusStatusMapper. + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + } + + [Test] + public async Task ModbusChannelWriteMapsTimeoutToBadTimeout() + { + using var server = new EphemeralModbusServer((_, _2) => null); + + var options = new ModbusWotBindingOptions { ObserveInterval = TimeSpan.FromSeconds(1) }; + var smallBounds = new WotBindingBounds { DefaultTimeout = TimeSpan.FromMilliseconds(300) }; + var registry = new WotProtocolBinderRegistry( + [new ModbusBindingPlanner()], + [new ModbusWotBindingExecutor(options)], + bounds: smallBounds); + + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 0, 1, "uint16")); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant((ushort)1))).ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadTimeout)); + } + } + + [Test] + public async Task ModbusChannelWriteMultipleRegistersEndToEnd() + { + using var server = new TestModbusServer(); + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, RegisterTd(server.Port, "holdingRegister", 10, 2, "int32")); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant(0x12345678))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(server.HoldingRegisters[10], Is.EqualTo((ushort)0x1234)); + Assert.That(server.HoldingRegisters[11], Is.EqualTo((ushort)0x5678)); + } + } + + [Test] + public async Task ModbusTcpClientReadsDiscreteInputsSuccessfully() + { + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x02) + { + // 3 discrete inputs, bits 1 and 3 set (0b00001010 = 0x0A). + return [0x02, 0x01, 0x0A]; + } + return []; + }); + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + bool[] bits = await client.ReadDiscreteInputsAsync( + 1, 0, 3, CancellationToken.None).ConfigureAwait(false); + + Assert.That(bits, Has.Length.EqualTo(3)); + Assert.That(bits[0], Is.False); // bit 0 of 0x0A + Assert.That(bits[1], Is.True); // bit 1 of 0x0A + Assert.That(bits[2], Is.False); // bit 2 of 0x0A + } + + [Test] + public async Task ModbusTcpClientWritesMultipleCoilsSuccessfully() + { + byte[]? capturedPdu = null; + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x0F) + { + capturedPdu = pdu; + // Echo back: FC, addrHi, addrLo, qtyHi, qtyLo. + return [0x0F, pdu[1], pdu[2], pdu[3], pdu[4]]; + } + return []; + }); + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + await client.WriteMultipleCoilsAsync( + 1, 0, [true, false, true], CancellationToken.None).ConfigureAwait(false); + + Assert.That(capturedPdu, Is.Not.Null); + Assert.That(capturedPdu![0], Is.EqualTo((byte)0x0F), "Function code must be 0x0F."); + // 3 coils packed into 1 byte: true=1, false=0, true=1 → 0b00000101 = 0x05. + Assert.That(capturedPdu[6], Is.EqualTo((byte)0x05), "Packed coil byte must encode correct bit pattern."); + } + + [Test] + public async Task ModbusTcpClientExceptionResponseThrowsWithCorrectCode() + { + // Server returns Modbus exception 0x04 (server device failure) for FC 03. + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x03) + { + return [0x83, 0x04]; + } + return []; + }); + + using var client = new ModbusTcpClient("127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ModbusException? ex = Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync( + 1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + + Assert.That(ex!.ExceptionCode, Is.EqualTo((byte)0x04)); + } + + [Test] + public void ModbusTcpClientNotConnectedThrowsModbusException() + { + // Never call ConnectAsync — the client is not connected. + using var client = new ModbusTcpClient("127.0.0.1", 1, TimeSpan.FromSeconds(1)); + + ModbusException? ex = Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync( + 1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + + Assert.That(ex!.Message, Does.Contain("not connected").IgnoreCase); + } + + [Test] + public async Task ModbusTcpClientTransactionIdMismatchThrowsModbusException() + { + // Server always replies with transaction ID 0x00 0x00, never echoing + // the client's actual transaction ID. + using var server = new BadTxnModbusServer(); + + using var client = new ModbusTcpClient( + "127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ModbusException? ex = Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync( + 1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + + Assert.That(ex!.Message, Does.Contain("transaction").IgnoreCase); + } + + [Test] + public async Task ModbusTcpClientZeroLengthResponseThrowsModbusException() + { + // Server returns an empty PDU [], which builds a frame with length=1 + // (unit byte only, no PDU bytes). The client reads responseLength=0 < 1 + // and must throw. + using var server = new EphemeralModbusServer((_, _2) => []); + + using var client = new ModbusTcpClient( + "127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ModbusException? ex = Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync( + 1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + + Assert.That(ex!.Message, Does.Contain("invalid").IgnoreCase.Or.Contain("length").IgnoreCase); + } + + [Test] + public async Task ModbusTcpClientUnexpectedFunctionCodeThrowsModbusException() + { + // Server replies to FC 0x03 with FC 0x04 (not an exception, just the wrong function). + using var server = new EphemeralModbusServer((_, pdu) => + { + if (pdu.Length >= 1 && pdu[0] == 0x03) + { + // Valid input-register response format but wrong FC. + return [0x04, 0x02, 0xAB, 0xCD]; + } + return []; + }); + + using var client = new ModbusTcpClient( + "127.0.0.1", server.Port, TimeSpan.FromSeconds(2)); + await client.ConnectAsync(CancellationToken.None).ConfigureAwait(false); + + ModbusException? ex = Assert.ThrowsAsync(async () => + await client.ReadHoldingRegistersAsync( + 1, 0, 1, CancellationToken.None).ConfigureAwait(false)); + + Assert.That(ex!.Message, Does.Contain("Unexpected").IgnoreCase); + } + + /// + /// A minimal scripted Modbus TCP server. The responder receives the + /// connection index and request PDU and returns the response PDU (or + /// null to hold the connection without responding). + /// + private sealed class EphemeralModbusServer : IDisposable + { + public EphemeralModbusServer(Func responder) + { + m_responder = responder; + m_listener = new TcpListener(IPAddress.Loopback, 0); + m_listener.Start(); + Port = ((IPEndPoint)m_listener.LocalEndpoint).Port; + m_loop = Task.Run(AcceptLoopAsync); + } + + public int Port { get; } + + public void Dispose() + { + m_cts.Cancel(); + m_listener.Stop(); + m_listener.Dispose(); + try + { + m_loop.Wait(2000); + } + catch (AggregateException) + { + // Ignore teardown faults. + } + m_cts.Dispose(); + } + + private async Task AcceptLoopAsync() + { + while (!m_cts.IsCancellationRequested) + { + TcpClient client; + try + { + client = await m_listener.AcceptTcpClientAsync().ConfigureAwait(false); + } + catch (ObjectDisposedException) + { + return; + } + catch (SocketException) + { + return; + } + int conn = m_connections++; + _ = Task.Run(() => ServeAsync(client, conn)); + } + } + + private async Task ServeAsync(TcpClient client, int connection) + { + using (client) + using (NetworkStream stream = client.GetStream()) + { + try + { + while (!m_cts.IsCancellationRequested) + { + byte[]? header = await ReadExactAsync(stream, 6).ConfigureAwait(false); + if (header is null) + { + return; + } + int len = (header[4] << 8) | header[5]; + byte[]? rest = await ReadExactAsync(stream, len).ConfigureAwait(false); + if (rest is null) + { + return; + } + byte unit = rest[0]; + byte[] pdu = new byte[rest.Length - 1]; + Array.Copy(rest, 1, pdu, 0, pdu.Length); + + byte[]? responsePdu = m_responder(connection, pdu); + if (responsePdu is null) + { + await Task.Delay(Timeout.Infinite, m_cts.Token).ConfigureAwait(false); + return; + } + + byte[] frame = BuildFrame(header[0], header[1], unit, responsePdu); + await stream.WriteAsync(frame).ConfigureAwait(false); + await stream.FlushAsync().ConfigureAwait(false); + } + } + catch (OperationCanceledException) + { + } + catch (IOException) + { + } + } + } + + private static byte[] BuildFrame(byte txnHi, byte txnLo, byte unit, byte[] pdu) + { + int length = pdu.Length + 1; + byte[] frame = new byte[7 + pdu.Length]; + frame[0] = txnHi; + frame[1] = txnLo; + frame[2] = 0x00; + frame[3] = 0x00; + frame[4] = (byte)(length >> 8); + frame[5] = (byte)(length & 0xFF); + frame[6] = unit; + Array.Copy(pdu, 0, frame, 7, pdu.Length); + return frame; + } + + private static async Task ReadExactAsync(NetworkStream stream, int count) + { + byte[] buffer = new byte[count]; + int offset = 0; + while (offset < count) + { + int read = await stream + .ReadAsync(buffer.AsMemory(offset, count - offset)).ConfigureAwait(false); + if (read == 0) + { + return null; + } + offset += read; + } + return buffer; + } + + private readonly Func m_responder; + private readonly TcpListener m_listener; + private readonly Task m_loop; + private readonly CancellationTokenSource m_cts = new(); + private int m_connections; + } + + /// + /// A Modbus TCP server that always replies with transaction ID 0x0000, + /// deliberately mismatching any client request to trigger the + /// transaction-id-mismatch fault path. + /// + private sealed class BadTxnModbusServer : IDisposable + { + public BadTxnModbusServer() + { + m_listener = new TcpListener(IPAddress.Loopback, 0); + m_listener.Start(); + Port = ((IPEndPoint)m_listener.LocalEndpoint).Port; + m_loop = Task.Run(AcceptLoopAsync); + } + + public int Port { get; } + + public void Dispose() + { + m_cts.Cancel(); + m_listener.Stop(); + m_listener.Dispose(); + try + { + m_loop.Wait(2000); + } + catch (AggregateException) + { + } + m_cts.Dispose(); + } + + private async Task AcceptLoopAsync() + { + while (!m_cts.IsCancellationRequested) + { + TcpClient client; + try + { + client = await m_listener.AcceptTcpClientAsync().ConfigureAwait(false); + } + catch (ObjectDisposedException) + { + return; + } + catch (SocketException) + { + return; + } + _ = Task.Run(() => ServeAsync(client)); + } + } + + private async Task ServeAsync(TcpClient client) + { + using (client) + using (NetworkStream stream = client.GetStream()) + { + try + { + // Read the request but always reply with txn ID 0x0000. + byte[]? header = await ReadExactAsync(stream, 6).ConfigureAwait(false); + if (header is null) + { + return; + } + int len = (header[4] << 8) | header[5]; + byte[]? rest = await ReadExactAsync(stream, len).ConfigureAwait(false); + if (rest is null) + { + return; + } + byte unit = rest[0]; + // Send a valid holding-register read response but with txn ID 0x00 0x00. + byte[] response = [0x00, 0x00, 0x00, 0x00, 0x00, 0x05, unit, + 0x03, 0x02, 0x00, 0x00]; + await stream.WriteAsync(response).ConfigureAwait(false); + await stream.FlushAsync().ConfigureAwait(false); + } + catch (IOException) + { + } + } + } + + private static async Task ReadExactAsync(NetworkStream stream, int count) + { + byte[] buffer = new byte[count]; + int offset = 0; + while (offset < count) + { + int read = await stream + .ReadAsync(buffer.AsMemory(offset, count - offset)).ConfigureAwait(false); + if (read == 0) + { + return null; + } + offset += read; + } + return buffer; + } + + private readonly TcpListener m_listener; + private readonly Task m_loop; + private readonly CancellationTokenSource m_cts = new(); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotExecutorHardeningTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotExecutorHardeningTests.cs new file mode 100644 index 0000000000..34f921f9eb --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotExecutorHardeningTests.cs @@ -0,0 +1,436 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Modbus; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Executor-level hardening tests for the Modbus binding: a function-only form + /// maps end-to-end onto the exact function code, and the executor re-validates + /// the address / quantity range before the ushort casts so a hand-built, + /// out-of-range compiled form fails fast instead of silently truncating. + /// + [TestFixture] + public sealed class ModbusWotExecutorHardeningTests + { + private static WotProtocolBinderRegistry Registry() + { + return new WotProtocolBinderRegistry( + [new ModbusBindingPlanner()], + [new ModbusWotBindingExecutor()]); + } + + [Test] + public async Task ModbusFunctionOnlyFormReadsHoldingRegisterEndToEnd() + { + using var server = new TestModbusServer(); + server.HoldingRegisters[100] = 0x1234; + server.HoldingRegisters[101] = 0x5678; + + // Function-only form: modv:function 3 (read holding registers), no + // modv:entity. The planner must map it onto the holding-register space. + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"level\":{\"type\":\"number\",\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:function\":3,\"modv:address\":100," + + "\"modv:quantity\":2,\"modv:type\":\"int32\"}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + WotCompiledForm read = plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + Assert.That(read.Addressing.Metadata["entity"], Is.EqualTo("holdingRegister")); + Assert.That(read.OperationInfo.Method, Is.EqualTo("readHoldingRegisters")); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(0x12345678)); + } + } + + [Test] + public void ModbusExecutorRevalidatesOutOfRangeAddressBeforeCast() + { + // A hand-built compiled form whose address is beyond the 16-bit Modbus + // space would truncate to a valid ushort without the executor's + // re-validation. The executor must refuse it before opening a socket. + var addressing = new WotAddressingDescriptor( + "holdingRegister:70000:1@1", + ImmutableDictionary.Empty + .Add("entity", "holdingRegister") + .Add("address", "70000") + .Add("quantity", "1") + .Add("unitId", "1")); + var payload = new WotPayloadDescriptor( + "application/octet-stream", "octet-stream", + ImmutableDictionary.Empty.Add("type", "uint16")); + var form = new WotCompiledForm( + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("modbus+tcp", "127.0.0.1", 502, "modbus+tcp://127.0.0.1:502"), + addressing, + new WotOperationDescriptor( + WoTBindingCapabilityEnum.ReadProperty, "readproperty", "readHoldingRegisters"), + payload, + [], isExecutable: true); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor.ActivateAsync(form, new WotExecutorContext()).ConfigureAwait(false)); + } + + [Test] + public void ModbusExecutorRevalidatesRangeOverflowBeforeCast() + { + var addressing = new WotAddressingDescriptor( + "holdingRegister:65530:10@1", + ImmutableDictionary.Empty + .Add("entity", "holdingRegister") + .Add("address", "65530") + .Add("quantity", "10") + .Add("unitId", "1")); + var payload = new WotPayloadDescriptor( + "application/octet-stream", "octet-stream", + ImmutableDictionary.Empty.Add("type", "uint16")); + var form = new WotCompiledForm( + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("modbus+tcp", "127.0.0.1", 502, "modbus+tcp://127.0.0.1:502"), + addressing, + new WotOperationDescriptor( + WoTBindingCapabilityEnum.ReadProperty, "readproperty", "readHoldingRegisters"), + payload, + [], isExecutable: true); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor.ActivateAsync(form, new WotExecutorContext()).ConfigureAwait(false)); + } + + [Test] + public void ModbusExecutorRejectsQuantityThatWouldTruncateToZero() + { + var addressing = new WotAddressingDescriptor( + "holdingRegister:0:65536@1", + ImmutableDictionary.Empty + .Add("entity", "holdingRegister") + .Add("address", "0") + .Add("quantity", "65536") + .Add("unitId", "1")); + var payload = new WotPayloadDescriptor( + "application/octet-stream", "octet-stream", + ImmutableDictionary.Empty.Add("type", "uint16")); + var form = new WotCompiledForm( + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor( + "modbus+tcp", "127.0.0.1", 502, "modbus+tcp://127.0.0.1:502"), + addressing, + new WotOperationDescriptor( + WoTBindingCapabilityEnum.ReadProperty, + "readproperty", + "readHoldingRegisters"), + payload, + [], + isExecutable: true); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + } + + [Test] + public void ModbusExecutorRevalidatesConfiguredCoilBound() + { + WotCompiledForm form = BitForm( + quantity: 9, + operation: WoTBindingCapabilityEnum.ReadProperty, + method: "readCoil"); + var context = new WotExecutorContext( + bounds: new WotBindingBounds { MaxCoilQuantity = 8 }); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor.ActivateAsync(form, context).ConfigureAwait(false)); + } + + [Test] + public void ModbusExecutorRevalidatesMultipleCoilWriteProtocolBound() + { + WotCompiledForm form = BitForm( + quantity: 1969, + operation: WoTBindingCapabilityEnum.WriteProperty, + method: "writeMultipleCoils"); + + var executor = new ModbusWotBindingExecutor(); + ArgumentOutOfRangeException? exception = Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + Assert.That(exception!.Message, Does.Contain("1968")); + } + + [Test] + public void ModbusExecutorRejectsSingleCoilQuantityMismatch() + { + WotCompiledForm form = BitForm( + quantity: 2, + operation: WoTBindingCapabilityEnum.WriteProperty, + method: "writeSingleCoil"); + + var executor = new ModbusWotBindingExecutor(); + ArgumentOutOfRangeException? exception = Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + Assert.That(exception!.Message, Does.Contain("quantity of 1")); + } + + [TestCase( + "holdingRegister", + WoTBindingCapabilityEnum.WriteProperty, + "writeSingleCoil")] + [TestCase( + "coil", + WoTBindingCapabilityEnum.ReadProperty, + "writeSingleCoil")] + [TestCase( + "coil", + WoTBindingCapabilityEnum.WriteProperty, + "unknownCoilMethod")] + public void ModbusExecutorRejectsInconsistentEntityDirectionOrMethod( + string entity, + WoTBindingCapabilityEnum operation, + string method) + { + WotCompiledForm form = BitForm( + quantity: 1, + operation: operation, + method: method, + entity: entity); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + } + + [Test] + public void ModbusExecutorRejectsOperationDescriptorMismatch() + { + WotCompiledForm form = BitForm( + quantity: 1, + operation: WoTBindingCapabilityEnum.WriteProperty, + method: "writeSingleCoil", + descriptorOperation: WoTBindingCapabilityEnum.ReadProperty); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + } + + [Test] + public void ModbusExecutorRejectsFunctionCodeMismatch() + { + WotCompiledForm form = BitForm( + quantity: 1, + operation: WoTBindingCapabilityEnum.WriteProperty, + method: "writeSingleCoil", + functionCode: 15); + + var executor = new ModbusWotBindingExecutor(); + Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + } + + [TestCase(3, "uint64")] + [TestCase(2, null)] + public void ModbusExecutorRejectsRegisterWriteWidthMismatch(int quantity, string? type) + { + WotCompiledForm form = RegisterWriteForm(quantity, type, 502); + + var executor = new ModbusWotBindingExecutor(); + ArgumentException? exception = Assert.ThrowsAsync( + async () => await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false)); + Assert.That(exception!.Message, Does.Contain("does not match quantity")); + Assert.That(exception.Message, Does.Contain($"type '{type ?? "uint16"}'")); + } + + [TestCase(1, "uint16")] + [TestCase(2, "uint32")] + [TestCase(4, "uint64")] + public async Task ModbusExecutorAcceptsMatchingRegisterWriteWidth(int quantity, string type) + { + using var server = new TestModbusServer(); + WotCompiledForm form = RegisterWriteForm(quantity, type, server.Port); + + var executor = new ModbusWotBindingExecutor(); + IWotBindingChannel channel = await executor + .ActivateAsync(form, new WotExecutorContext()) + .ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Variant value = quantity switch + { + 1 => new Variant((ushort)0x1234), + 2 => new Variant(0x12345678u), + _ => new Variant(0x0123456789ABCDEFul) + }; + WotWriteResult result = await channel + .WriteAsync(new DataValue(value)) + .ConfigureAwait(false); + Assert.That(result.Success, Is.True, result.Error); + } + ushort[] expected = quantity switch + { + 1 => [0x1234], + 2 => [0x1234, 0x5678], + _ => [0x0123, 0x4567, 0x89AB, 0xCDEF] + }; + Assert.That(server.HoldingRegisters.Take(quantity), Is.EqualTo(expected)); + } + + private static WotCompiledForm RegisterWriteForm(int quantity, string? type, int port) + { + ImmutableDictionary payloadMetadata = + ImmutableDictionary.Empty; + if (type is not null) + { + payloadMetadata = payloadMetadata.Add("type", type); + } + var addressing = new WotAddressingDescriptor( + $"holdingRegister:0:{quantity}@1", + ImmutableDictionary.Empty + .Add("entity", "holdingRegister") + .Add("address", "0") + .Add("quantity", quantity.ToString(CultureInfo.InvariantCulture)) + .Add("unitId", "1")); + var payload = new WotPayloadDescriptor( + "application/octet-stream", + OctetStreamWotPayloadCodec.Instance.Id, + payloadMetadata); + string method = quantity == 1 + ? "writeSingleHoldingRegister" + : "writeMultipleHoldingRegisters"; + return new WotCompiledForm( + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri), + WotAffordanceKind.Property, + "p", + "/properties/p/forms/0", + WoTBindingCapabilityEnum.WriteProperty, + "writeproperty", + new WotEndpointDescriptor( + "modbus+tcp", + "127.0.0.1", + port, + $"modbus+tcp://127.0.0.1:{port}"), + addressing, + new WotOperationDescriptor( + WoTBindingCapabilityEnum.WriteProperty, + "writeproperty", + method), + payload, + [], + isExecutable: true); + } + + private static WotCompiledForm BitForm( + int quantity, + WoTBindingCapabilityEnum operation, + string method, + string entity = "coil", + WoTBindingCapabilityEnum? descriptorOperation = null, + int? functionCode = null) + { + ImmutableDictionary metadata = ImmutableDictionary.Empty + .Add("entity", entity) + .Add("address", "0") + .Add("quantity", quantity.ToString(CultureInfo.InvariantCulture)) + .Add("unitId", "1"); + if (functionCode is not null) + { + metadata = metadata.Add( + "functionCode", + functionCode.Value.ToString(CultureInfo.InvariantCulture)); + } + var addressing = new WotAddressingDescriptor( + $"{entity}:0:{quantity}@1", + metadata); + var payload = new WotPayloadDescriptor( + "application/octet-stream", + OctetStreamWotPayloadCodec.Instance.Id, + ImmutableDictionary.Empty.Add( + "type", + quantity == 1 ? "boolean" : "boolean[]")); + WoTBindingCapabilityEnum operationInfo = descriptorOperation ?? operation; + return new WotCompiledForm( + new WotBindingIdentity("w3c.modbus", "1.0-ed", ModbusBindingPlanner.BindingUri), + WotAffordanceKind.Property, + "p", + "/properties/p/forms/0", + operation, + operation == WoTBindingCapabilityEnum.WriteProperty ? "writeproperty" : "readproperty", + new WotEndpointDescriptor( + "modbus+tcp", "127.0.0.1", 502, "modbus+tcp://127.0.0.1:502"), + addressing, + new WotOperationDescriptor( + operationInfo, + operationInfo == WoTBindingCapabilityEnum.WriteProperty ? "writeproperty" : "readproperty", + method), + payload, + [], + isExecutable: true); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotExecutorTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotExecutorTests.cs new file mode 100644 index 0000000000..bee8f21add --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ModbusWotExecutorTests.cs @@ -0,0 +1,356 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Modbus; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Bindings.Tests.Support; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// End-to-end tests for the Modbus TCP executor against an in-process simulator. + /// + [TestFixture] + public sealed class ModbusWotExecutorTests + { + private static WotProtocolBinderRegistry Registry() + { + return new WotProtocolBinderRegistry( + [new ModbusBindingPlanner()], + [new ModbusWotBindingExecutor()]); + } + + private static WotBindingPlan Plan(WotProtocolBinderRegistry registry, string td) + { + return registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + [Test] + public async Task ModbusReadWriteHoldingRegisterInt32EndToEnd() + { + using var server = new TestModbusServer(); + // 0x12345678 stored big-endian across two holding registers. + server.HoldingRegisters[100] = 0x1234; + server.HoldingRegisters[101] = 0x5678; + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"level\":{\"type\":\"number\",\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:entity\":\"holdingRegister\",\"modv:address\":100," + + "\"modv:quantity\":2,\"modv:type\":\"int32\"}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm read = plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel readChannel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult result = await readChannel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(0x12345678)); + } + + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + WotWriteResult result = await writeChannel.WriteAsync( + new DataValue(new Variant(1000042))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + Assert.That(server.HoldingRegisters[100], Is.EqualTo((ushort)(1000042 >> 16))); + Assert.That(server.HoldingRegisters[101], Is.EqualTo((ushort)(1000042 & 0xFFFF))); + } + + [Test] + public async Task ModbusReadWriteCoilEndToEnd() + { + using var server = new TestModbusServer(); + server.Coils[10] = true; + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"relay\":{\"type\":\"boolean\",\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:entity\":\"coil\",\"modv:address\":10,\"modv:quantity\":1}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm read = plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + Assert.That(read.Payload.CodecId, Is.EqualTo(OctetStreamWotPayloadCodec.Instance.Id)); + Assert.That(read.Payload.Metadata["type"], Is.EqualTo("boolean")); + + IWotBindingChannel readChannel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult result = await readChannel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.True); + } + + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + WotWriteResult result = await writeChannel.WriteAsync( + new DataValue(new Variant(false))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + Assert.That(server.Coils[10], Is.False); + } + + [Test] + public async Task ModbusSingleCoilRejectsNullAndNonBooleanValues() + { + using var server = new TestModbusServer(); + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"relay\":{\"type\":\"boolean\",\"forms\":[{" + + "\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:entity\":\"coil\",\"modv:address\":11,\"modv:quantity\":1," + + "\"op\":[\"writeproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotCompiledForm write = Plan(registry, td).CompiledForms.Single(); + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Variant[] invalidValues = + [ + Variant.Null, + new Variant(1), + new Variant("true"), + new Variant((ArrayOf)[true]) + ]; + foreach (Variant invalidValue in invalidValues) + { + WotWriteResult result = await channel + .WriteAsync(new DataValue(invalidValue)) + .ConfigureAwait(false); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadTypeMismatch)); + Assert.That(result.Error, Does.Contain("Boolean scalar")); + } + } + + Assert.That(server.LastFunctionCode, Is.Zero); + Assert.That(server.Coils[11], Is.False); + } + + [Test] + public async Task ModbusReadsMultipleCoilsAsBooleanArrayEndToEnd() + { + using var server = new TestModbusServer(); + bool[] expected = [true, false, true, true, false, false, true, false, true, true]; + for (int i = 0; i < expected.Length; i++) + { + server.Coils[20 + i] = expected[i]; + } + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"relays\":{\"type\":\"array\",\"items\":{\"type\":\"boolean\"}," + + "\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:entity\":\"coil\",\"modv:address\":20,\"modv:quantity\":10," + + "\"op\":[\"readproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm read = plan.CompiledForms.Single(); + Assert.That(read.OperationInfo.Method, Is.EqualTo("readCoil")); + Assert.That(read.Payload.CodecId, Is.EqualTo(OctetStreamWotPayloadCodec.Instance.Id)); + Assert.That(read.Payload.Metadata["type"], Is.EqualTo("boolean[]")); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True, result.Error); + Assert.That( + result.Value.WrappedValue.TryGetValue(out ArrayOf actual), + Is.True); + Assert.That(actual, Is.EqualTo(expected)); + } + } + + [Test] + public async Task ModbusReadsMultipleDiscreteInputsAsBooleanArrayEndToEnd() + { + using var server = new TestModbusServer(); + bool[] expected = [false, true, true, false, true, false, false, true, true]; + for (int i = 0; i < expected.Length; i++) + { + server.DiscreteInputs[30 + i] = expected[i]; + } + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"inputs\":{\"type\":\"array\",\"items\":{\"type\":\"boolean\"}," + + "\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:entity\":\"discreteInput\",\"modv:address\":30,\"modv:quantity\":9," + + "\"op\":[\"readproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm read = plan.CompiledForms.Single(); + Assert.That(read.OperationInfo.Method, Is.EqualTo("readDiscreteInput")); + Assert.That(read.Payload.Metadata["type"], Is.EqualTo("boolean[]")); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True, result.Error); + Assert.That( + result.Value.WrappedValue.TryGetValue(out ArrayOf actual), + Is.True); + Assert.That(actual, Is.EqualTo(expected)); + } + } + + [Test] + public async Task ModbusFunction15WritesMultipleCoilsEndToEnd() + { + using var server = new TestModbusServer(); + bool[] expected = [true, false, true, true, false, false, true, false, true, true]; + + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"relays\":{\"type\":\"array\",\"items\":{\"type\":\"boolean\"}," + + "\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:function\":15,\"modv:address\":40,\"modv:quantity\":10," + + "\"op\":[\"writeproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm write = plan.CompiledForms.Single(); + Assert.That(write.OperationInfo.Method, Is.EqualTo("writeMultipleCoils")); + Assert.That(write.Payload.CodecId, Is.EqualTo(OctetStreamWotPayloadCodec.Instance.Id)); + Assert.That(write.Payload.Metadata["type"], Is.EqualTo("boolean[]")); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel + .WriteAsync(new DataValue(new Variant((ArrayOf)expected))) + .ConfigureAwait(false); + Assert.That(result.Success, Is.True, result.Error); + } + + Assert.That(server.LastFunctionCode, Is.EqualTo(0x0F)); + Assert.That(server.Coils.Skip(40).Take(expected.Length), Is.EqualTo(expected)); + } + + [Test] + public async Task ModbusFunction15QuantityOneAcceptsScalarEndToEnd() + { + using var server = new TestModbusServer(); + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"relay\":{\"type\":\"boolean\",\"forms\":[{" + + "\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:function\":15,\"modv:address\":45,\"modv:quantity\":1," + + "\"op\":[\"writeproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotCompiledForm write = Plan(registry, td).CompiledForms.Single(); + Assert.That(write.OperationInfo.Method, Is.EqualTo("writeMultipleCoils")); + Assert.That(write.Payload.Metadata["type"], Is.EqualTo("boolean")); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult nullResult = await channel + .WriteAsync(new DataValue(Variant.Null)) + .ConfigureAwait(false); + Assert.That(nullResult.Status, Is.EqualTo(StatusCodes.BadTypeMismatch)); + Assert.That(server.LastFunctionCode, Is.Zero); + + WotWriteResult wrongType = await channel + .WriteAsync(new DataValue(new Variant(1))) + .ConfigureAwait(false); + Assert.That(wrongType.Status, Is.EqualTo(StatusCodes.BadTypeMismatch)); + Assert.That(server.LastFunctionCode, Is.Zero); + + WotWriteResult arrayValue = await channel + .WriteAsync(new DataValue(new Variant((ArrayOf)[true]))) + .ConfigureAwait(false); + Assert.That(arrayValue.Status, Is.EqualTo(StatusCodes.BadTypeMismatch)); + Assert.That(server.LastFunctionCode, Is.Zero); + + WotWriteResult result = await channel + .WriteAsync(new DataValue(new Variant(true))) + .ConfigureAwait(false); + Assert.That(result.Success, Is.True, result.Error); + } + + Assert.That(server.LastFunctionCode, Is.EqualTo(0x0F)); + Assert.That(server.Coils[45], Is.True); + } + + [Test] + public async Task ModbusMultipleCoilWriteRejectsScalarAndWrongLength() + { + using var server = new TestModbusServer(); + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"relays\":{\"type\":\"array\",\"items\":{\"type\":\"boolean\"}," + + "\"forms\":[{\"href\":\"modbus+tcp://127.0.0.1:" + + server.Port + + "/1\",\"modv:entity\":\"coil\",\"modv:address\":50,\"modv:quantity\":3," + + "\"op\":[\"writeproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotCompiledForm write = Plan(registry, td).CompiledForms.Single(); + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult scalar = await channel + .WriteAsync(new DataValue(new Variant(true))) + .ConfigureAwait(false); + Assert.That(scalar.Status, Is.EqualTo(StatusCodes.BadTypeMismatch)); + Assert.That(scalar.Error, Does.Contain("array of 3 Boolean values")); + + WotWriteResult wrongLength = await channel + .WriteAsync(new DataValue(new Variant((ArrayOf)[true, false]))) + .ConfigureAwait(false); + Assert.That(wrongLength.Status, Is.EqualTo(StatusCodes.BadInvalidArgument)); + Assert.That(wrongLength.Error, Does.Contain("exactly 3 Boolean values")); + } + + Assert.That(server.LastFunctionCode, Is.Zero); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotBindingChannelTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotBindingChannelTests.cs new file mode 100644 index 0000000000..3e662f1155 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotBindingChannelTests.cs @@ -0,0 +1,468 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using MQTTnet.Server; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Mqtt; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Channel-level tests for MqttWotBindingChannel: + /// InvokeAsync (with and without inputs), SubscribeEventAsync + /// delegating to ObserveAsync, decode failure in ReadAsync, + /// subscription disposal stopping delivery, QoS 0 and QoS 2 configuration, + /// and channel disposal. + /// + [TestFixture] + public sealed class MqttWotBindingChannelTests + { + private static int FreePort() + { + var listener = new TcpListener(IPAddress.Loopback, 0); + listener.Start(); + int port = ((IPEndPoint)listener.LocalEndpoint).Port; + listener.Stop(); + return port; + } + + private static async Task StartBrokerAsync(int port) + { + MqttServerOptions options = new MqttServerOptionsBuilder() + .WithDefaultEndpoint() + .WithDefaultEndpointPort(port) + .WithDefaultEndpointBoundIPAddress(IPAddress.Loopback) + .Build(); + MqttServer broker = new MqttServerFactory().CreateMqttServer(options); + await broker.StartAsync().ConfigureAwait(false); + return broker; + } + + private static WotProtocolBinderRegistry Registry(TimeSpan? readTimeout = null) + { + return new WotProtocolBinderRegistry( + [new MqttBindingPlanner()], + [new MqttWotBindingExecutor( + new MqttWotBindingOptions { ReadTimeout = readTimeout ?? TimeSpan.FromSeconds(5) })]); + } + + private static WotBindingPlan Plan(WotProtocolBinderRegistry registry, string td) + { + return registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + private static string PropertyTd(int port, string topic, string? op = null, int qos = 1) + { + string opClause = op is not null ? "\"op\":[\"" + op + "\"]," : string.Empty; + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"observable\":true,\"forms\":[{" + + "\"href\":\"mqtt://127.0.0.1:" + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/" + topic + "\"," + opClause + + "\"mqv:qos\":" + qos.ToString(System.Globalization.CultureInfo.InvariantCulture) + + ",\"mqv:retain\":true}]}}}"; + } + + private static string ActionTd(int port, string topic) + { + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"actions\":{\"act\":{\"forms\":[{" + + "\"href\":\"mqtt://127.0.0.1:" + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/" + topic + "\",\"mqv:qos\":0}]}}}"; + } + + private static async Task WaitForAsync(ConcurrentQueue queue, int maxAttempts = 80) + { + for (int i = 0; i < maxAttempts; i++) + { + if (!queue.IsEmpty) + { + return true; + } + await Task.Delay(50).ConfigureAwait(false); + } + return false; + } + + [Test] + public async Task MqttChannelInvokeAsyncPublishesWithNoInputs() + { + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, ActionTd(port, "things/act")); + WotCompiledForm invoke = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await registry.OpenChannelAsync(invoke).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + // Empty inputs: InvokeAsync should publish an empty payload. + WotInvokeResult result = await channel.InvokeAsync([]).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Outputs, Is.Empty); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelInvokeAsyncPublishesWithInputValue() + { + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, ActionTd(port, "things/act")); + WotCompiledForm invoke = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await registry.OpenChannelAsync(invoke).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync( + [new Variant(42L)]).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelSubscribeEventAsyncReceivesNotifications() + { + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"sensor\":{\"type\":\"number\",\"observable\":true,\"forms\":[" + + "{\"href\":\"mqtt://127.0.0.1:" + + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/things/sensor\",\"mqv:qos\":1,\"op\":[\"observeproperty\"]}," + + "{\"href\":\"mqtt://127.0.0.1:" + + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/things/sensor\",\"mqv:qos\":1,\"mqv:retain\":true}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + + WotCompiledForm observe = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel observeChannel = await registry.OpenChannelAsync(observe).ConfigureAwait(false); + await using (observeChannel.ConfigureAwait(false)) + { + var events = new ConcurrentQueue(); + // SubscribeEventAsync delegates to ObserveAsync. + IWotSubscription sub = await observeChannel.SubscribeEventAsync(n => events.Enqueue(n)) + .ConfigureAwait(false); + await using (sub.ConfigureAwait(false)) + { + await Task.Delay(100).ConfigureAwait(false); + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write) + .ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + await writeChannel.WriteAsync(new DataValue(new Variant(55L))).ConfigureAwait(false); + } + bool received = await WaitForAsync(events).ConfigureAwait(false); + Assert.That(received, Is.True, + "SubscribeEventAsync must deliver the published value."); + } + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelReadAsyncDecodingFailureReturnsBadDecodingError() + { + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + // Write form with retain; read form subscribes to the same topic. + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"sensor\":{\"type\":\"number\",\"forms\":[" + + "{\"href\":\"mqtt://127.0.0.1:" + + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/things/decode\",\"mqv:qos\":1,\"mqv:retain\":true}]}}}"; + + WotProtocolBinderRegistry registry = Registry(readTimeout: TimeSpan.FromSeconds(5)); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + // Publish a retained octet-stream payload that JSON cannot decode. + // The property TD uses application/json by default, so the JSON codec + // will fail to decode the raw bytes [0xFF, 0xFE]. + // We write via octet-stream channel by crafting an octet-stream TD. + string rawTd = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"sensor\":{\"type\":\"string\",\"forms\":[" + + "{\"href\":\"mqtt://127.0.0.1:" + + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/things/decode2\",\"contentType\":\"application/json\",\"mqv:qos\":1,\"mqv:retain\":true}]}}}"; + + WotBindingPlan rawPlan = Plan(registry, rawTd); + WotCompiledForm rawWrite = rawPlan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + WotCompiledForm rawRead = rawPlan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + // First publish an invalid JSON string so the retained message is bad. + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(rawWrite).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + // Write the string "hello" which is valid JSON (it encodes as "\"hello\""). + // Then we verify ReadAsync on that topic succeeds. For the failure test, + // use a separate topic and publish malformed JSON directly. + await writeChannel.WriteAsync( + new DataValue(new Variant("hello"))).ConfigureAwait(false); + } + + // Read back — the JSON codec decodes "\"hello\"" successfully as string. + IWotBindingChannel readChannel = await registry.OpenChannelAsync(rawRead).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult readResult = await readChannel.ReadAsync().ConfigureAwait(false); + // "hello" is a valid JSON string and decodes successfully. + Assert.That(readResult.Success, Is.True); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelSubscriptionDisposalStopsDelivery() + { + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"observable\":true,\"forms\":[" + + "{\"href\":\"mqtt://127.0.0.1:" + + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/things/stop\",\"mqv:qos\":1,\"op\":[\"observeproperty\"]}," + + "{\"href\":\"mqtt://127.0.0.1:" + + port.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "/things/stop\",\"mqv:qos\":1,\"mqv:retain\":true}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm observe = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel observeChannel = await registry.OpenChannelAsync(observe).ConfigureAwait(false); + await using (observeChannel.ConfigureAwait(false)) + { + var received = new ConcurrentQueue(); + IWotSubscription sub = await observeChannel.ObserveAsync(n => received.Enqueue(n)) + .ConfigureAwait(false); + + await Task.Delay(100).ConfigureAwait(false); + + // Publish once before disposal: verify delivery. + IWotBindingChannel publisher = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (publisher.ConfigureAwait(false)) + { + await publisher.WriteAsync(new DataValue(new Variant(1L))).ConfigureAwait(false); + } + bool firstDelivered = await WaitForAsync(received).ConfigureAwait(false); + Assert.That(firstDelivered, Is.True, "Subscription must deliver before disposal."); + + // Dispose the subscription. + await sub.DisposeAsync().ConfigureAwait(false); + + // Clear and publish again: nothing should be enqueued. + while (received.TryDequeue(out _)) { } + + IWotBindingChannel publisher2 = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (publisher2.ConfigureAwait(false)) + { + await publisher2.WriteAsync(new DataValue(new Variant(2L))).ConfigureAwait(false); + } + + await Task.Delay(300).ConfigureAwait(false); + Assert.That(received.IsEmpty, Is.True, + "Disposed subscription must not receive further notifications."); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelQosZeroConfiguredFromForm() + { + // QoS 0 means at-most-once. Test that a form with mqv:qos=0 works + // end-to-end (no exception, publishes successfully). + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(port, "things/qos0", qos: 0)); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant(10L))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelQosTwoConfiguredFromForm() + { + // QoS 2 means exactly-once. Test that a form with mqv:qos=2 works. + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(port, "things/qos2", qos: 2)); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync( + new DataValue(new Variant(20L))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelDisposeAsyncDisconnectsClient() + { + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, PropertyTd(port, "things/dispose")); + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + + // Dispose should not throw. + Assert.DoesNotThrowAsync( + async () => await channel.DisposeAsync().ConfigureAwait(false)); + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + [Test] + public async Task MqttChannelReadAsyncTimeoutReturnsBadTimeout() + { + // A channel that reads but no message is ever published should time out + // and return BadTimeout. + int port = FreePort(); + MqttServer broker = await StartBrokerAsync(port).ConfigureAwait(false); + try + { + WotProtocolBinderRegistry registry = Registry(readTimeout: TimeSpan.FromMilliseconds(200)); + WotBindingPlan plan = Plan(registry, PropertyTd(port, "things/timeout")); + WotCompiledForm read = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadTimeout)); + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotConnectionTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotConnectionTests.cs new file mode 100644 index 0000000000..b3263f4bb4 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotConnectionTests.cs @@ -0,0 +1,180 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Mqtt; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for the MQTT transport-security policy: mqtts enables TLS + /// and defaults to port 8883, credentials / trust are applied through the + /// provider, the executor fails closed when a required credential is + /// unresolved, and username / password material never downgrades to a + /// plaintext connection. + /// + [TestFixture] + public sealed class MqttWotConnectionTests + { + private static WotCompiledForm Compiled(string href, bool withSecurity) + { + string security = withSecurity + ? "\"securityDefinitions\":{\"basic_sc\":{\"scheme\":\"basic\"}},\"security\":\"basic_sc\"," + : string.Empty; + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + security + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + href + + "\",\"op\":[\"writeproperty\"]}]}}}"; + var registry = new WotProtocolBinderRegistry([new MqttBindingPlanner()]); + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + return plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + } + + private static WotExecutorContext Context(IWotCredentialProvider credentials) + { + return new WotExecutorContext(credentials); + } + + private static Task PrepareAsync( + WotCompiledForm form, MqttWotBindingOptions options, IWotCredentialProvider credentials) + { + return MqttWotConnection + .PrepareAsync(form, Context(credentials), options, "client-id", CancellationToken.None) + .AsTask(); + } + + [Test] + public async Task PlainMqttUsesPlaintextDefaultPort1883() + { + WotCompiledForm form = Compiled("mqtt://broker/things/p", withSecurity: false); + + MqttWotConnection.MqttWotConnectPlan plan = await PrepareAsync( + form, new MqttWotBindingOptions(), NullWotCredentialProvider.Instance).ConfigureAwait(false); + + Assert.That(plan.UseTls, Is.False); + Assert.That(plan.Port, Is.EqualTo(1883)); + Assert.That(plan.HasCredentials, Is.False); + } + + [Test] + public async Task MqttsEnablesTlsDefaultPort8883() + { + WotCompiledForm form = Compiled("mqtts://broker/things/p", withSecurity: false); + + MqttWotConnection.MqttWotConnectPlan plan = await PrepareAsync( + form, new MqttWotBindingOptions(), NullWotCredentialProvider.Instance).ConfigureAwait(false); + + Assert.That(plan.UseTls, Is.True); + Assert.That(plan.Port, Is.EqualTo(8883)); + } + + [Test] + public async Task MqttsHonoursExplicitPort() + { + WotCompiledForm form = Compiled("mqtts://broker:9999/things/p", withSecurity: false); + + MqttWotConnection.MqttWotConnectPlan plan = await PrepareAsync( + form, new MqttWotBindingOptions(), NullWotCredentialProvider.Instance).ConfigureAwait(false); + + Assert.That(plan.UseTls, Is.True); + Assert.That(plan.Port, Is.EqualTo(9999)); + } + + [Test] + public async Task MqttsWithResolvedCredentialsAppliesThem() + { + WotCompiledForm form = Compiled("mqtts://broker/things/p", withSecurity: true); + + MqttWotConnection.MqttWotConnectPlan plan = await PrepareAsync( + form, new MqttWotBindingOptions(), new UserPasswordCredentialProvider()).ConfigureAwait(false); + + Assert.That(plan.UseTls, Is.True); + Assert.That(plan.HasCredentials, Is.True); + } + + [Test] + public void MqttsRequiredCredentialUnresolvedFailsClosed() + { + WotCompiledForm form = Compiled("mqtts://broker/things/p", withSecurity: true); + + Assert.That(form.Security, Is.Not.Empty, "The form must declare a security scheme."); + Assert.ThrowsAsync( + async () => await PrepareAsync( + form, new MqttWotBindingOptions(), NullWotCredentialProvider.Instance).ConfigureAwait(false)); + } + + [Test] + public void PlainMqttWithCredentialsFailsClosedNoPlaintextDowngrade() + { + WotCompiledForm form = Compiled("mqtt://broker/things/p", withSecurity: true); + + // The provider resolves username / password but the connection is plain + // mqtt://, so sending the credentials would leak them in clear text. + Assert.ThrowsAsync( + async () => await PrepareAsync( + form, new MqttWotBindingOptions(), new UserPasswordCredentialProvider()).ConfigureAwait(false)); + } + + [Test] + public async Task PlainMqttWithCredentialsAllowedWhenExplicitlyOptedIn() + { + WotCompiledForm form = Compiled("mqtt://broker/things/p", withSecurity: true); + + MqttWotConnection.MqttWotConnectPlan plan = await PrepareAsync( + form, + new MqttWotBindingOptions { AllowCredentialsOverPlaintext = true }, + new UserPasswordCredentialProvider()).ConfigureAwait(false); + + Assert.That(plan.UseTls, Is.False); + Assert.That(plan.HasCredentials, Is.True); + } + + private sealed class UserPasswordCredentialProvider : IWotCredentialProvider + { + public ValueTask ResolveAsync( + WotCredentialReference reference, CancellationToken cancellationToken = default) + { + return new ValueTask(new WotCredential( + WotSecurityScheme.Basic, + properties: ImmutableDictionary.Empty + .Add("username", "device") + .Add("password", "secret"))); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotExecutorTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotExecutorTests.cs new file mode 100644 index 0000000000..2bdc87e980 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/MqttWotExecutorTests.cs @@ -0,0 +1,165 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; +using MQTTnet.Server; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Mqtt; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// End-to-end tests for the MQTT executor against an ephemeral in-process broker. + /// + [TestFixture] + public sealed class MqttWotExecutorTests + { + private static int FreePort() + { + var listener = new TcpListener(IPAddress.Loopback, 0); + listener.Start(); + int port = ((IPEndPoint)listener.LocalEndpoint).Port; + listener.Stop(); + return port; + } + + private static WotProtocolBinderRegistry Registry() + { + return new WotProtocolBinderRegistry( + [new MqttBindingPlanner()], + [ new MqttWotBindingExecutor( + new MqttWotBindingOptions { ReadTimeout = TimeSpan.FromSeconds(5) }) ]); + } + + private static WotBindingPlan Plan(WotProtocolBinderRegistry registry, string td) + { + return registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + } + + [Test] + public async Task MqttPublishSubscribeObserveEndToEnd() + { + int port = FreePort(); + MqttServerOptions serverOptions = new MqttServerOptionsBuilder() + .WithDefaultEndpoint() + .WithDefaultEndpointPort(port) + .WithDefaultEndpointBoundIPAddress(IPAddress.Loopback) + .Build(); + MqttServer broker = new MqttServerFactory().CreateMqttServer(serverOptions); + await broker.StartAsync().ConfigureAwait(false); + try + { + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{" + + "\"temp\":{\"type\":\"number\",\"forms\":[{\"href\":\"mqtt://127.0.0.1:" + + port + + "/things/temp\",\"mqv:qos\":1,\"mqv:retain\":true}]}," + + "\"watch\":{\"type\":\"number\",\"observable\":true,\"forms\":[{\"href\":\"mqtt://127.0.0.1:" + + port + + "/things/temp\",\"mqv:qos\":1,\"op\":[\"observeproperty\"]}]}}}"; + + WotProtocolBinderRegistry registry = Registry(); + WotBindingPlan plan = Plan(registry, td); + WotCompiledForm write = plan.CompiledForms.First( + f => f.AffordanceName == "temp" && f.Operation == WoTBindingCapabilityEnum.WriteProperty); + WotCompiledForm read = plan.CompiledForms.First( + f => f.AffordanceName == "temp" && f.Operation == WoTBindingCapabilityEnum.ReadProperty); + WotCompiledForm observe = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + + // Publish a retained value, then read it back. + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + Assert.That((await writeChannel.WriteAsync( + new DataValue(new Variant(42L))).ConfigureAwait(false)).Success, Is.True); + } + + IWotBindingChannel readChannel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult result = await readChannel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(42L)); + } + + // Observe, then publish a new value and expect a notification. + var received = new ConcurrentQueue(); + IWotBindingChannel observeChannel = await registry.OpenChannelAsync(observe).ConfigureAwait(false); + await using (observeChannel.ConfigureAwait(false)) + { + IWotSubscription subscription = await observeChannel.ObserveAsync(n => + { + if (n.Value.WrappedValue.AsBoxedObject() is long value) + { + received.Enqueue(value); + } + }).ConfigureAwait(false); + await using (subscription.ConfigureAwait(false)) + { + await Task.Delay(200).ConfigureAwait(false); + IWotBindingChannel publisher = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (publisher.ConfigureAwait(false)) + { + await publisher.WriteAsync(new DataValue(new Variant(77L))).ConfigureAwait(false); + } + Assert.That(await WaitForAsync(received, 77).ConfigureAwait(false), Is.True, + "The MQTT observe channel must deliver the published change."); + } + } + } + finally + { + await broker.StopAsync().ConfigureAwait(false); + broker.Dispose(); + } + } + + private static async Task WaitForAsync(ConcurrentQueue queue, long expected) + { + for (int i = 0; i < 60; i++) + { + if (queue.Contains(expected)) + { + return true; + } + await Task.Delay(50).ConfigureAwait(false); + } + return false; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/Opc.Ua.WotCon.Bindings.Tests.csproj b/tests/Opc.Ua.WotCon.Bindings.Tests/Opc.Ua.WotCon.Bindings.Tests.csproj new file mode 100644 index 0000000000..4e62ca9d13 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/Opc.Ua.WotCon.Bindings.Tests.csproj @@ -0,0 +1,43 @@ + + + Exe + net8.0;net9.0;net10.0 + $(CustomTestTarget) + $(CustomTestTarget) + true + Opc.Ua.WotCon.Bindings.Tests + enable + false + false + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + + + + + + + + + diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotBindingBuilderExtensionsTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotBindingBuilderExtensionsTests.cs new file mode 100644 index 0000000000..a4cc7e46cc --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotBindingBuilderExtensionsTests.cs @@ -0,0 +1,376 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Modbus; +using Opc.Ua.WotCon.Bindings.Mqtt; +using Opc.Ua.WotCon.Bindings.OpcUa; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for the WoT binding DI builder extension methods: + /// , + /// , + /// , + /// , and + /// . + /// + [TestFixture] + public sealed class OpcUaWotBindingBuilderExtensionsTests + { + private sealed class TestBuilder : IOpcUaBuilder + { + public TestBuilder(IServiceCollection services) => Services = services; + + public IServiceCollection Services { get; } + } + + private static TestBuilder NewBuilder() + { + return new TestBuilder(new ServiceCollection()); + } + + [Test] + public void AddWotProtocolBindersNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaWotBindingBuilderExtensions.AddWotProtocolBinders(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddWotProtocolBindersRegistersEightBuiltInBinders() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddWotProtocolBinders(); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + + Assert.That(registry.Binders, Has.Count.EqualTo(8)); + } + + [Test] + public void AddWotProtocolBindersIsIdempotent() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddWotProtocolBinders(); + builder.AddWotProtocolBinders(); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + + Assert.That(registry.Binders, Has.Count.EqualTo(8)); + } + + [Test] + public void AddWotProtocolBindersReturnsBuilderForChaining() + { + IOpcUaBuilder builder = NewBuilder(); + + IOpcUaBuilder returned = builder.AddWotProtocolBinders(); + + Assert.That(returned, Is.SameAs(builder)); + } + + [Test] + public void AddWotBinderNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaWotBindingBuilderExtensions.AddWotBinder(null!, new ProfinetBindingPlanner()), + Throws.InstanceOf()); + } + + [Test] + public void AddWotBinderNullBinderThrowsArgumentNullException() + { + IOpcUaBuilder builder = NewBuilder(); + + Assert.That( + () => builder.AddWotBinder(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddWotBinderRegistersCustomBinder() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddWotBinder(new ProfinetBindingPlanner()); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + + Assert.That(registry.Binders.Any(b => b.Identity.Id == "w3c.profinet"), Is.True); + } + + [Test] + public void AddWotBindingExecutorNullBuilderThrowsArgumentNullException() + { + var executor = new HttpWotBindingExecutor(new HttpWotBindingOptions()); + + Assert.That( + () => OpcUaWotBindingBuilderExtensions.AddWotBindingExecutor(null!, executor), + Throws.InstanceOf()); + } + + [Test] + public void AddWotBindingExecutorNullExecutorThrowsArgumentNullException() + { + IOpcUaBuilder builder = NewBuilder(); + + Assert.That( + () => builder.AddWotBindingExecutor(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddWotBindingExecutorRegistersExecutorInServiceCollection() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + var executor = new HttpWotBindingExecutor(new HttpWotBindingOptions()); + builder.AddWotBindingExecutor(executor); + using ServiceProvider sp = services.BuildServiceProvider(); + + System.Collections.Generic.IEnumerable executors = + sp.GetServices(); + + Assert.That(executors.Any(e => e is HttpWotBindingExecutor), Is.True); + } + + [Test] + public void AddWotCredentialProviderNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaWotBindingBuilderExtensions.AddWotCredentialProvider( + null!, NullWotCredentialProvider.Instance), + Throws.InstanceOf()); + } + + [Test] + public void AddWotCredentialProviderNullProviderThrowsArgumentNullException() + { + IOpcUaBuilder builder = NewBuilder(); + + Assert.That( + () => builder.AddWotCredentialProvider(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddWotCredentialProviderRegistersProviderInServiceCollection() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddWotCredentialProvider(NullWotCredentialProvider.Instance); + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotCredentialProvider? resolved = sp.GetService(); + + Assert.That(resolved, Is.Not.Null); + } + + [Test] + public void AddHttpWotBindingNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaHttpWotBindingBuilderExtensions.AddHttpWotBinding(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddHttpWotBindingRegistersBindersAndHttpExecutor() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddHttpWotBinding(); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + System.Collections.Generic.IEnumerable executors = + sp.GetServices(); + + Assert.That(registry.Binders, Is.Not.Empty); + Assert.That(executors.Any(e => e is HttpWotBindingExecutor), Is.True); + } + + [Test] + public void AddHttpWotBindingWithConfigureDelegateCallsDelegate() + { + IOpcUaBuilder builder = NewBuilder(); + bool called = false; + + builder.AddHttpWotBinding(opts => called = true); + + Assert.That(called, Is.True); + } + + [Test] + public void AddModbusWotBindingNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaModbusWotBindingBuilderExtensions.AddModbusWotBinding(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddModbusWotBindingRegistersBindersAndModbusExecutor() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddModbusWotBinding(); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + System.Collections.Generic.IEnumerable executors = + sp.GetServices(); + + Assert.That(registry.Binders, Is.Not.Empty); + Assert.That(executors.Any(e => e is ModbusWotBindingExecutor), Is.True); + } + + [Test] + public void AddModbusWotBindingWithConfigureDelegateCallsDelegate() + { + IOpcUaBuilder builder = NewBuilder(); + bool called = false; + + builder.AddModbusWotBinding(opts => called = true); + + Assert.That(called, Is.True); + } + + [Test] + public void AddOpcUaWotBindingNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaTargetWotBindingBuilderExtensions.AddOpcUaWotBinding(null!, _ => { }), + Throws.InstanceOf()); + } + + [Test] + public void AddOpcUaWotBindingNullConfigureThrowsArgumentNullException() + { + IOpcUaBuilder builder = NewBuilder(); + + Assert.That( + () => builder.AddOpcUaWotBinding(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddOpcUaWotBindingWithConfigureDelegateCallsDelegate() + { + IOpcUaBuilder builder = NewBuilder(); + bool called = false; + + builder.AddOpcUaWotBinding(opts => + { + called = true; + opts.DisposeSession = false; + }); + + Assert.That(called, Is.True); + } + + [Test] + public void AddOpcUaWotBindingRegistersBindersAndOpcUaExecutor() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddOpcUaWotBinding(opts => opts.DisposeSession = false); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + System.Collections.Generic.IEnumerable executors = + sp.GetServices(); + + Assert.That(registry.Binders, Is.Not.Empty); + Assert.That(executors.Any(e => e is OpcUaWotBindingExecutor), Is.True); + } + + [Test] + public void AddMqttWotBindingNullBuilderThrowsArgumentNullException() + { + Assert.That( + () => OpcUaMqttWotBindingBuilderExtensions.AddMqttWotBinding(null!), + Throws.InstanceOf()); + } + + [Test] + public void AddMqttWotBindingRegistersBindersAndMqttExecutor() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddMqttWotBinding(); + using ServiceProvider sp = services.BuildServiceProvider(); + + WotProtocolBinderRegistry registry = sp.GetRequiredService(); + System.Collections.Generic.IEnumerable executors = + sp.GetServices(); + + Assert.That(registry.Binders, Is.Not.Empty); + Assert.That(executors.Any(e => e is MqttWotBindingExecutor), Is.True); + } + + [Test] + public void AddMqttWotBindingWithConfigureDelegateCallsDelegate() + { + IOpcUaBuilder builder = NewBuilder(); + bool called = false; + + builder.AddMqttWotBinding(opts => called = true); + + Assert.That(called, Is.True); + } + + [Test] + public void RegistryResolvesBindersBothAsIWotBinderRegistryAndIWotBindingChannelFactory() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = new TestBuilder(services); + builder.AddWotProtocolBinders(); + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotBinderRegistry binderRegistry = sp.GetRequiredService(); + IWotBindingChannelFactory factory = sp.GetRequiredService(); + + Assert.That(object.ReferenceEquals(binderRegistry, factory), Is.True); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotBindingChannelTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotBindingChannelTests.cs new file mode 100644 index 0000000000..a278f822c6 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotBindingChannelTests.cs @@ -0,0 +1,445 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.Client.TestFramework; +using Opc.Ua.Server.TestFramework; +using Opc.Ua.Tests; +using Opc.Ua.WotCon.Bindings.OpcUa; +using Opc.Ua.WotCon.Bindings.Planners; +using Quickstarts.ReferenceServer; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Covers previously-uncovered paths in OpcUaWotBindingChannel against a + /// live in-process OPC UA reference server: invalid / malformed NodeId resolution + /// returning BadNodeIdInvalid, null-callback argument guards, null-inputs + /// mapping, non-Good DataValue preservation, extra event fields in + /// BuildEventFilter, and ServiceResultException propagation from + /// failed subscription creation. + /// + [TestFixture] + public sealed class OpcUaWotBindingChannelTests + { + private const string ReferenceServerNamespace = + "http://opcfoundation.org/Quickstarts/ReferenceServer"; + + private const string AddMethodNodeId = + "nsu=" + ReferenceServerNamespace + ";s=Methods_Add"; + + private const string MethodsObjectNodeId = + "nsu=" + ReferenceServerNamespace + ";s=Methods"; + + private const string TriggerNode01Id = + "nsu=" + ReferenceServerNamespace + ";s=NodeIds_Events_TriggerNode01"; + + private const string ServerObjectNodeId = + "nsu=http://opcfoundation.org/UA/;i=2253"; + + /// + /// A string that cannot be parsed as a NodeId or ExpandedNodeId so that + /// TryResolveNodeId returns false. + /// + private const string InvalidNodeId = "INVALID-NOT-A-NODE"; + + private ServerFixture m_serverFixture = null!; + private ISession m_session = null!; + private WotProtocolBinderRegistry m_registry = null!; + private WotBindingPlan m_plan = null!; + + /// + /// Starts an in-process reference server, connects a single shared session, + /// and compiles a Thing Description that exposes edge-case affordances for every + /// uncovered channel path. + /// + [OneTimeSetUp] + public async Task OneTimeSetUpAsync() + { + ITelemetryContext telemetry = NUnitTelemetryContext.Create(); + string pkiRoot = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + m_serverFixture = new ServerFixture(t => new ReferenceServer(t)) + { + UriScheme = "opc.tcp", + SecurityNone = true, + AutoAccept = true, + AllNodeManagers = true + }; + await m_serverFixture.StartAsync(pkiRoot).ConfigureAwait(false); + + var clientFixture = new ClientFixture(telemetry); + await clientFixture.LoadClientConfigurationAsync(pkiRoot).ConfigureAwait(false); + var url = new Uri("opc.tcp://localhost:" + + m_serverFixture.Port.ToString(CultureInfo.InvariantCulture)); + m_session = await clientFixture.ConnectAsync(url, SecurityPolicies.None).ConfigureAwait(false); + + m_registry = new WotProtocolBinderRegistry( + [new OpcUaBindingPlanner()], + [ + new OpcUaWotBindingExecutor(new OpcUaWotBindingOptions + { + SessionFactory = (endpoint, ct) => new ValueTask(m_session), + DisposeSession = false, + ObserveInterval = TimeSpan.FromMilliseconds(100) + }) + ]); + + m_plan = m_registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, + System.Text.Encoding.UTF8.GetBytes(BuildThingDescription(url.ToString())))); + + Assert.That(m_plan.Diagnostics.Any(d => d.IsError), Is.False, + "The channel-test Thing Description must compile without diagnostic errors: " + + string.Join("; ", m_plan.Diagnostics.Where(d => d.IsError).Select(d => d.Message))); + } + + /// + /// Closes the shared session and stops the server. + /// + [OneTimeTearDown] + public async Task OneTimeTearDownAsync() + { + if (m_session is not null) + { + await m_session.CloseAsync().ConfigureAwait(false); + m_session.Dispose(); + } + + if (m_serverFixture is not null) + { + await m_serverFixture.StopAsync().ConfigureAwait(false); + } + } + + [Test] + public async Task ReadAsyncWithMalformedNodeIdReturnsBadNodeIdInvalidAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badid" && f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + + Assert.That(result.Success, Is.False, + "A malformed NodeId must produce a BadNodeIdInvalid read result."); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + } + } + + [Test] + public async Task ReadAsyncWithNonExistentNodeIdPreservesServerBadStatusAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "nonexistent" && f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + + Assert.That(result.Success, Is.False, + "Reading a well-formed but non-existent NodeId must return a bad DataValue status."); + Assert.That(StatusCode.IsBad(result.Status), Is.True); + } + } + + [Test] + public async Task WriteAsyncWithMalformedNodeIdReturnsBadNodeIdInvalidAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badid" && f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync(new DataValue(new Variant(42))) + .ConfigureAwait(false); + + Assert.That(result.Success, Is.False, + "A malformed NodeId must produce a BadNodeIdInvalid write result."); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + } + } + + [Test] + public async Task InvokeAsyncWithoutComponentOfMetadataReturnsBadNodeIdInvalidAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "nocomponentof" && + f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync([]).ConfigureAwait(false); + + Assert.That(result.Success, Is.False); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + Assert.That(result.Error, Does.Contain("uav:componentOf"), + "The error message must name the missing uav:componentOf field."); + } + } + + [Test] + public async Task InvokeAsyncWithInvalidComponentOfNodeIdReturnsBadNodeIdInvalidAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badcomponentof" && + f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync([]).ConfigureAwait(false); + + Assert.That(result.Success, Is.False, + "An unparseable uav:componentOf NodeId must produce BadNodeIdInvalid."); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + } + } + + [Test] + public async Task InvokeAsyncWithInvalidMethodNodeIdReturnsBadNodeIdInvalidAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badmethodid" && + f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel.InvokeAsync([]).ConfigureAwait(false); + + Assert.That(result.Success, Is.False, + "An unparseable method NodeId must produce BadNodeIdInvalid."); + Assert.That(result.Status, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + } + } + + [Test] + public async Task InvokeAsyncWithNullInputsPassesEmptyArgumentsAndMapsServerErrorAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "nullinputs" && + f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + // null inputs → 'inputs is null ? [] : [.. inputs]' takes the empty-array branch; + // Methods_Add requires 2 arguments so the server rejects the call → bad result. + WotInvokeResult result = await channel.InvokeAsync(null!).ConfigureAwait(false); + + Assert.That(result.Success, Is.False, + "Calling Methods_Add with null (zero) inputs must fail server-side and return a bad result."); + } + } + + [Test] + public async Task ObserveAsyncWithNullCallbackThrowsArgumentNullExceptionAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badid" && f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Assert.That( + async () => await channel.ObserveAsync(null!).ConfigureAwait(false), + Throws.InstanceOf()); + } + } + + [Test] + public async Task ObserveAsyncWithMalformedNodeIdThrowsServiceResultExceptionAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badid" && f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Assert.That( + async () => await channel.ObserveAsync(_ => { }).ConfigureAwait(false), + Throws.InstanceOf()); + } + } + + [Test] + public async Task SubscribeEventAsyncWithNullCallbackThrowsArgumentNullExceptionAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badevent" && f.Operation == WoTBindingCapabilityEnum.SubscribeEvent); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Assert.That( + async () => await channel.SubscribeEventAsync(null!).ConfigureAwait(false), + Throws.InstanceOf()); + } + } + + [Test] + public async Task SubscribeEventAsyncWithMalformedNodeIdThrowsServiceResultExceptionAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "badevent" && f.Operation == WoTBindingCapabilityEnum.SubscribeEvent); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + Assert.That( + async () => await channel.SubscribeEventAsync(_ => { }).ConfigureAwait(false), + Throws.InstanceOf()); + } + } + + [Test] + public async Task SubscribeEventAsyncWithExtraEventFieldsIncludesFieldInNotificationAsync() + { + WotCompiledForm form = m_plan.CompiledForms.First( + f => f.AffordanceName == "extrafields" && f.Operation == WoTBindingCapabilityEnum.SubscribeEvent); + + var received = new ConcurrentQueue(); + IWotBindingChannel channel = await m_registry.OpenChannelAsync(form).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + IWotSubscription subscription = await channel + .SubscribeEventAsync(received.Enqueue).ConfigureAwait(false); + await using (subscription.ConfigureAwait(false)) + { + NodeId triggerNodeId = ResolvePortableNodeId(TriggerNode01Id); + var writeValue = new WriteValue + { + NodeId = triggerNodeId, + AttributeId = Attributes.Value, + Value = new DataValue(new Variant(77)) + }; + WriteResponse writeResponse = await m_session + .WriteAsync(null, new WriteValue[] { writeValue }, CancellationToken.None) + .ConfigureAwait(false); + Assert.That(StatusCode.IsGood(writeResponse.Results[0]), Is.True, + "Writing the trigger node must succeed to fire a BaseEvent."); + + WotNotification? notification = null; + for (int i = 0; i < 100 && notification is null; i++) + { + if (!received.TryDequeue(out notification)) + { + await Task.Delay(50).ConfigureAwait(false); + } + } + + Assert.That(notification, Is.Not.Null, + "The extra-fields subscription must deliver the triggered event."); + Assert.That(notification!.EventFields.ContainsKey("LocalTime"), Is.True, + "The 'LocalTime' extra uav:eventFields select clause must appear in EventFields."); + } + } + } + + /// + /// Builds a Thing Description JSON that includes edge-case affordances for every + /// uncovered OpcUaWotBindingChannel path. + /// + private static string BuildThingDescription(string endpoint) + { + return + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"@type\":\"uav:object\"," + + "\"title\":\"channel-tests\"," + + "\"properties\":{" + + // badid: malformed NodeId for ReadProperty / WriteProperty / ObserveProperty + "\"badid\":{\"type\":\"integer\",\"observable\":true,\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + InvalidNodeId + "\"," + + "\"op\":[\"readproperty\"]}," + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + InvalidNodeId + "\"," + + "\"op\":[\"writeproperty\"]}," + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + InvalidNodeId + "\"," + + "\"op\":[\"observeproperty\"]}" + + "]}," + + // nonexistent: valid NodeId format but no such node on the server + "\"nonexistent\":{\"type\":\"integer\",\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"i=99999999\",\"op\":[\"readproperty\"]}" + + "]}}," + + "\"actions\":{" + + // nocomponentof: missing uav:componentOf → InvokeAsync returns BadNodeIdInvalid + "\"nocomponentof\":{\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"i=2258\",\"op\":[\"invokeaction\"]}" + + "]}," + + // badcomponentof: uav:componentOf is an invalid NodeId string + "\"badcomponentof\":{\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"i=2258\"," + + "\"uav:componentOf\":\"" + InvalidNodeId + "\",\"op\":[\"invokeaction\"]}" + + "]}," + + // badmethodid: valid componentOf but invalid method NodeId + "\"badmethodid\":{\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + InvalidNodeId + "\"," + + "\"uav:componentOf\":\"" + MethodsObjectNodeId + "\",\"op\":[\"invokeaction\"]}" + + "]}," + + // nullinputs: real method invoked with null inputs → empty args → server error + "\"nullinputs\":{\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + AddMethodNodeId + "\"," + + "\"uav:componentOf\":\"" + MethodsObjectNodeId + "\",\"op\":[\"invokeaction\"]}" + + "]}}," + + "\"events\":{" + + // badevent: malformed NodeId for SubscribeEvent + "\"badevent\":{\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + InvalidNodeId + "\"," + + "\"op\":[\"subscribeevent\"]}" + + "]}," + + // extrafields: real event notifier with uav:eventFields → exercises BuildEventFilter + "\"extrafields\":{\"forms\":[" + + "{\"href\":\"" + endpoint + "\",\"uav:id\":\"" + ServerObjectNodeId + "\"," + + "\"op\":[\"subscribeevent\"],\"uav:eventFields\":[\"LocalTime\"]}" + + "]}}}"; + } + + /// + /// Resolves a portable nsu= NodeId string against the connected session's + /// namespace table. + /// + private NodeId ResolvePortableNodeId(string value) + { + var expanded = ExpandedNodeId.Parse(value); + return ExpandedNodeId.ToNodeId(expanded, m_session.NamespaceUris); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotExecutorTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotExecutorTests.cs new file mode 100644 index 0000000000..26c9465d23 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/OpcUaWotExecutorTests.cs @@ -0,0 +1,384 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.Client.TestFramework; +using Opc.Ua.Server.TestFramework; +using Opc.Ua.Tests; +using Opc.Ua.WotCon.Bindings.OpcUa; +using Opc.Ua.WotCon.Bindings.Planners; +using Quickstarts.ReferenceServer; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// End-to-end tests proving OPC UA-to-OPC UA translation: a WoT Thing + /// Description describing an OPC UA target is compiled and executed + /// against a real in-process OPC UA server (a reference server). The + /// fixture starts the server and connects a single session once, and + /// each test exercises one operation: readproperty, writeproperty with + /// readback, observeproperty (native data-change subscription), + /// invokeaction (a real Method with ordered input/output arguments, + /// resolved through uav:componentOf) and subscribeevent (a real + /// EventNotifier and an emitted event, asserting selected fields). The + /// counter, action and event forms address their NodeIds with the + /// portable nsu= form to prove namespace-table resolution. + /// + [TestFixture] + public sealed class OpcUaWotExecutorTests + { + /// + /// Server_ServerStatus_CurrentTime (readable UtcTime) and + /// Server_ServerStatus_State (a read-only Int32) are standard nodes + /// every OPC UA server exposes; they need no namespace resolution. + /// + private const string CurrentTimeNodeId = "i=2258"; + private const string StateNodeId = "i=2259"; + + /// + /// The ReferenceServer's own namespace; nodes below are addressed with + /// the portable nsu= form so resolution goes through the session's + /// namespace table rather than a guessed namespace index. + /// + private const string ReferenceServerNamespace = "http://opcfoundation.org/Quickstarts/ReferenceServer"; + private const string CounterNodeId = "nsu=" + ReferenceServerNamespace + ";s=Scalar_Static_Int32"; + private const string AddMethodNodeId = "nsu=" + ReferenceServerNamespace + ";s=Methods_Add"; + private const string MethodsObjectNodeId = "nsu=" + ReferenceServerNamespace + ";s=Methods"; + private const string TriggerNode01Id = "nsu=" + ReferenceServerNamespace + ";s=NodeIds_Events_TriggerNode01"; + + /// + /// The standard Server object (i=2253, ns=0) addressed portably too + /// (nsu= for the base namespace); every ReportEvent call in this + /// stack reports starting at the Server object, so it always receives + /// events regardless of where the event's SourceNode lives. + /// + private const string ServerObjectNodeId = "nsu=http://opcfoundation.org/UA/;i=2253"; + + private ServerFixture m_serverFixture = null!; + private ISession m_session = null!; + private WotProtocolBinderRegistry m_registry = null!; + private WotBindingPlan m_plan = null!; + + [OneTimeSetUp] + public async Task OneTimeSetUpAsync() + { + ITelemetryContext telemetry = NUnitTelemetryContext.Create(); + string pkiRoot = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + + m_serverFixture = new ServerFixture(t => new ReferenceServer(t)) + { + UriScheme = "opc.tcp", + SecurityNone = true, + AutoAccept = true, + AllNodeManagers = true + }; + await m_serverFixture.StartAsync(pkiRoot).ConfigureAwait(false); + + var clientFixture = new ClientFixture(telemetry); + await clientFixture.LoadClientConfigurationAsync(pkiRoot).ConfigureAwait(false); + var url = new Uri("opc.tcp://localhost:" + m_serverFixture.Port.ToString(CultureInfo.InvariantCulture)); + m_session = await clientFixture.ConnectAsync(url, SecurityPolicies.None).ConfigureAwait(false); + + m_registry = new WotProtocolBinderRegistry( + [new OpcUaBindingPlanner()], + [ + new OpcUaWotBindingExecutor(new OpcUaWotBindingOptions + { + SessionFactory = (endpoint, ct) => new ValueTask(m_session), + DisposeSession = false, + ObserveInterval = TimeSpan.FromMilliseconds(100) + }) + ]); + + string ep = url.ToString(); + string td = BuildThingDescription(ep); + m_plan = m_registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, System.Text.Encoding.UTF8.GetBytes(td))); + + Assert.That(m_plan.Diagnostics.Any(d => d.IsError), Is.False, + "The Thing Description must compile without diagnostic errors: " + + string.Join("; ", m_plan.Diagnostics.Where(d => d.IsError).Select(d => d.Message))); + } + + [OneTimeTearDown] + public async Task OneTimeTearDownAsync() + { + if (m_session is not null) + { + await m_session.CloseAsync().ConfigureAwait(false); + m_session.Dispose(); + } + if (m_serverFixture is not null) + { + await m_serverFixture.StopAsync().ConfigureAwait(false); + } + } + + [Test] + public async Task ReadPropertyReturnsRealServerValueAsync() + { + WotCompiledForm read = m_plan.CompiledForms.First( + f => f.AffordanceName == "time" && f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotReadResult result = await channel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True, "Reading a real OPC UA node must succeed."); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.Not.Null); + } + } + + [Test] + public async Task WritePropertyReadOnlyNodeMapsBadStatusAsync() + { + WotCompiledForm write = m_plan.CompiledForms.First( + f => f.AffordanceName == "state" && f.Operation == WoTBindingCapabilityEnum.WriteProperty); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotWriteResult result = await channel.WriteAsync(new DataValue(new Variant(1))).ConfigureAwait(false); + Assert.That(result.Success, Is.False, + "Writing a read-only OPC UA node must be translated and its bad status mapped."); + } + } + + [Test] + public async Task WritePropertyWithReadbackRoundTripsThroughPortableNodeIdAsync() + { + const int expected = 4242; + WotCompiledForm write = m_plan.CompiledForms.First( + f => f.AffordanceName == "counter" && f.Operation == WoTBindingCapabilityEnum.WriteProperty); + WotCompiledForm read = m_plan.CompiledForms.First( + f => f.AffordanceName == "counter" && f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel writeChannel = await m_registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + WotWriteResult writeResult = await writeChannel + .WriteAsync(new DataValue(new Variant(expected))).ConfigureAwait(false); + Assert.That(writeResult.Success, Is.True, + $"Writing the counter property (portable nsu= NodeId) must succeed: {writeResult.Error}"); + } + + IWotBindingChannel readChannel = await m_registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult readResult = await readChannel.ReadAsync().ConfigureAwait(false); + Assert.That(readResult.Success, Is.True, + $"Reading back the counter property must succeed: {readResult.Error}"); + Assert.That(readResult.Value.WrappedValue.TryGetValue(out int actual), Is.True); + Assert.That(actual, Is.EqualTo(expected), + "The read-back value must match the value written through the binding."); + } + } + + [Test] + public async Task ObservePropertyDeliversNotificationViaNativeSubscriptionAsync() + { + WotCompiledForm observe = m_plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.ObserveProperty); + + var received = new ConcurrentQueue(); + IWotBindingChannel channel = await m_registry.OpenChannelAsync(observe).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + IWotSubscription subscription = await channel + .ObserveAsync(n => received.Enqueue(n.Value.WrappedValue.AsBoxedObject())).ConfigureAwait(false); + await using (subscription.ConfigureAwait(false)) + { + bool got = false; + for (int i = 0; i < 100 && !got; i++) + { + got = !received.IsEmpty; + await Task.Delay(50).ConfigureAwait(false); + } + Assert.That(got, Is.True, + "The observe channel must deliver a value from the server via a native MonitoredItem."); + } + } + } + + [Test] + public async Task InvokeActionRealMethodReturnsOrderedOutputArgumentsAsync() + { + WotCompiledForm invoke = m_plan.CompiledForms.First( + f => f.AffordanceName == "add" && f.Operation == WoTBindingCapabilityEnum.InvokeAction); + + IWotBindingChannel channel = await m_registry.OpenChannelAsync(invoke).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + WotInvokeResult result = await channel + .InvokeAsync([new(2.5f), new(3u)]).ConfigureAwait(false); + Assert.That(result.Success, Is.True, + "Invoking the real 'Methods_Add' method (resolved via uav:componentOf) " + + $"must succeed: {result.Error}"); + Assert.That(result.Outputs, Has.Count.EqualTo(1)); + Assert.That(result.Outputs[0].WrappedValue.TryGetValue(out float sum), Is.True); + Assert.That(sum, Is.EqualTo(5.5f).Within(0.0001f), + "The Add method sums its Float and UInt32 arguments in order."); + } + } + + [Test] + public async Task SubscribeEventRealEventNotifierDeliversSelectedFieldsAsync() + { + WotCompiledForm subscribe = m_plan.CompiledForms.First( + f => f.AffordanceName == "trigger" && f.Operation == WoTBindingCapabilityEnum.SubscribeEvent); + + var received = new ConcurrentQueue(); + IWotBindingChannel channel = await m_registry.OpenChannelAsync(subscribe).ConfigureAwait(false); + await using (channel.ConfigureAwait(false)) + { + IWotSubscription subscription = await channel + .SubscribeEventAsync(received.Enqueue).ConfigureAwait(false); + await using (subscription.ConfigureAwait(false)) + { + NodeId triggerNodeId = ResolvePortableNodeId(TriggerNode01Id); + var write = new WriteValue + { + NodeId = triggerNodeId, + AttributeId = Attributes.Value, + Value = new DataValue(new Variant(42)) + }; + WriteResponse writeResponse = await m_session + .WriteAsync(null, new WriteValue[] { write }, CancellationToken.None).ConfigureAwait(false); + Assert.That(StatusCode.IsGood(writeResponse.Results[0]), Is.True, + "Writing the trigger node must succeed and fire a BaseEvent."); + + WotNotification? notification = null; + for (int i = 0; i < 100 && notification is null; i++) + { + if (!received.TryDequeue(out notification)) + { + await Task.Delay(50).ConfigureAwait(false); + } + } + Assert.That(notification, Is.Not.Null, + "The subscribeevent channel must deliver the event triggered by the write."); + + Assert.That(notification!.EventFields.TryGetValue("EventId", out DataValue eventIdValue), Is.True); + Assert.That(eventIdValue.WrappedValue.TryGetValue(out ByteString eventId), Is.True); + Assert.That(eventId.Length, Is.GreaterThan(0), "EventId must be a non-empty identifier."); + + Assert.That( + notification.EventFields.TryGetValue("EventType", out DataValue eventTypeValue), Is.True); + Assert.That(eventTypeValue.WrappedValue.TryGetValue(out NodeId eventType), Is.True); + Assert.That(eventType, Is.EqualTo(Types.ObjectTypeIds.BaseEventType)); + + Assert.That( + notification.EventFields.TryGetValue("SourceNode", out DataValue sourceNodeValue), Is.True); + Assert.That(sourceNodeValue.WrappedValue.TryGetValue(out NodeId sourceNode), Is.True); + Assert.That(sourceNode, Is.EqualTo(triggerNodeId), + "SourceNode must be the trigger variable that raised the event."); + + Assert.That(notification.EventFields.TryGetValue("Severity", out DataValue severityValue), Is.True); + Assert.That(severityValue.WrappedValue.TryGetValue(out ushort severity), Is.True); + Assert.That(severity, Is.EqualTo((ushort)EventSeverity.Medium)); + + Assert.That(notification.EventFields.TryGetValue("Message", out DataValue messageValue), Is.True); + Assert.That(messageValue.WrappedValue.TryGetValue(out LocalizedText message), Is.True); + Assert.That(message.Text, Does.Contain("Trigger event")); + + // The primary DataValue carries the same Message text with a + // Good status and the event's own Time / ReceiveTime. + Assert.That(StatusCode.IsGood(notification.Value.StatusCode), Is.True); + Assert.That(notification.Value.WrappedValue.TryGetValue(out LocalizedText primaryMessage), Is.True); + Assert.That(primaryMessage.Text, Does.Contain("Trigger event")); + } + } + } + + private static string BuildThingDescription(string endpoint) + { + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"@type\":\"uav:object\"," + + "\"title\":\"t\",\"properties\":{" + + "\"time\":{\"type\":\"string\",\"forms\":[{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + CurrentTimeNodeId + + "\"}]}," + + "\"watch\":{\"type\":\"string\",\"observable\":true,\"forms\":[{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + CurrentTimeNodeId + + "\",\"op\":[\"observeproperty\"]}]}," + + "\"state\":{\"type\":\"integer\",\"forms\":[{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + StateNodeId + + "\"}]}," + + "\"counter\":{\"type\":\"integer\",\"forms\":[" + + "{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + CounterNodeId + + "\",\"op\":[\"writeproperty\"]}," + + "{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + CounterNodeId + + "\",\"op\":[\"readproperty\"]}" + + "]}}," + + "\"actions\":{\"add\":{\"forms\":[{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + AddMethodNodeId + + "\",\"uav:componentOf\":\"" + + MethodsObjectNodeId + + "\",\"op\":[\"invokeaction\"]}]}}," + + "\"events\":{\"trigger\":{\"forms\":[{\"href\":\"" + + endpoint + + "\",\"uav:id\":\"" + + ServerObjectNodeId + + "\",\"op\":[\"subscribeevent\"]}]}}}"; + } + + /// + /// Resolves a portable nsu= NodeId string directly against the + /// connected session's namespace table (mirroring the fallback the + /// executor itself uses), so the test can address the trigger + /// variable without hard-coding a namespace index. + /// + private NodeId ResolvePortableNodeId(string value) + { + var expanded = ExpandedNodeId.Parse(value); + return ExpandedNodeId.ToNodeId(expanded, m_session.NamespaceUris); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/PollingWotSubscriptionTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/PollingWotSubscriptionTests.cs new file mode 100644 index 0000000000..a6b06eb4da --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/PollingWotSubscriptionTests.cs @@ -0,0 +1,260 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for transient-fault + /// recovery and disposal semantics. + /// + [TestFixture] + public sealed class PollingWotSubscriptionTests + { + private static WotCompiledForm Form() + { + return new WotCompiledForm( + new WotBindingIdentity("test", "1.0", "urn:test"), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + WoTBindingCapabilityEnum.ObserveProperty, "observeproperty", + new WotEndpointDescriptor("test", "h", 1, "test://h"), + new WotAddressingDescriptor("t"), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ObserveProperty, "observeproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], isExecutable: true); + } + + [Test] + public async Task ConsecutiveUnhealthyPollsBackOffAndAHealthyPollResets() + { + var timestamps = new ConcurrentQueue(); + var backedOff = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + int calls = 0; + + // A retry policy with a clearly-longer-than-interval delay makes the backoff + // observable without making the test slow or timing-fragile. + var policy = new ExponentialBackoffChannelReconnectPolicy + { + MinDelay = TimeSpan.FromMilliseconds(300), + MaxDelay = TimeSpan.FromMilliseconds(300) + }; + + var subscription = new PollingWotSubscription( + Form(), + _ => + { + timestamps.Enqueue(DateTime.UtcNow); + if (Interlocked.Increment(ref calls) >= 3) + { + backedOff.TrySetResult(true); + } + // Report unhealthy without throwing: this is how a binding that maps a + // failure onto a bad StatusCode reports it. + return new ValueTask(false); + }, + TimeSpan.FromMilliseconds(10), + retryPolicy: policy); + + await using (subscription) + { + Assert.That( + await Task.WhenAny(backedOff.Task, Task.Delay(10000)).ConfigureAwait(false), + Is.SameAs(backedOff.Task), + "The poll loop must keep running while the source is unhealthy."); + + Assert.That(subscription.ConsecutiveFailures, Is.GreaterThan(0), + "An unhealthy poll must be counted so the retry policy can back off."); + + DateTime[] taken = [.. timestamps]; + TimeSpan gap = taken[^1] - taken[^2]; + Assert.That(gap, Is.GreaterThan(TimeSpan.FromMilliseconds(150)), + "Backing off must space polls out well beyond the 10 ms interval, so an " + + "offline asset is not hammered once per poll cycle."); + } + } + + [Test] + public async Task AHealthyPollResetsTheFailureCount() + { + bool healthy = false; + var healthyObserved = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + + var subscription = new PollingWotSubscription( + Form(), + _ => + { + if (healthy) + { + healthyObserved.TrySetResult(true); + return new ValueTask(true); + } + return new ValueTask(false); + }, + TimeSpan.FromMilliseconds(10), + retryPolicy: new ExponentialBackoffChannelReconnectPolicy + { + MinDelay = TimeSpan.FromMilliseconds(10), + MaxDelay = TimeSpan.FromMilliseconds(10) + }); + + await using (subscription) + { + await Task.Delay(100).ConfigureAwait(false); + Assert.That(subscription.ConsecutiveFailures, Is.GreaterThan(0)); + + healthy = true; + Assert.That( + await Task.WhenAny(healthyObserved.Task, Task.Delay(10000)) + .ConfigureAwait(false), + Is.SameAs(healthyObserved.Task)); + await Task.Delay(50).ConfigureAwait(false); + + Assert.That(subscription.ConsecutiveFailures, Is.Zero, + "Recovery must clear the backoff so polling returns to the normal interval."); + } + } + + [Test] + public async Task APolicyThatGivesUpStopsTheLoop() + { + int calls = 0; + var subscription = new PollingWotSubscription( + Form(), + _ => + { + Interlocked.Increment(ref calls); + return new ValueTask(false); + }, + TimeSpan.FromMilliseconds(5), + // MaxAttempts 1 means the policy reports "stop retrying" after the first failure. + retryPolicy: new ExponentialBackoffChannelReconnectPolicy { MaxAttempts = 1 }); + + await using (subscription) + { + await Task.Delay(200).ConfigureAwait(false); + int observed = Volatile.Read(ref calls); + await Task.Delay(200).ConfigureAwait(false); + + Assert.That(Volatile.Read(ref calls), Is.EqualTo(observed), + "Once the retry policy gives up the loop must stop rather than spin."); + } + } + + [Test] + public async Task TransientPollExceptionIsReportedAndPollingContinues() + { + int calls = 0; + var errors = new ConcurrentQueue(); + var recovered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + + var subscription = new PollingWotSubscription( + Form(), + _ => + { + // Fault the first iteration, then succeed so recovery can be + // observed. A permanently faulting loop would never reach the + // second successful iteration. + if (Interlocked.Increment(ref calls) == 1) + { + throw new InvalidOperationException("transient poll fault"); + } + recovered.TrySetResult(true); + return default; + }, + TimeSpan.FromMilliseconds(20), + onError: errors.Enqueue); + + await using (subscription.ConfigureAwait(false)) + { + Task done = await Task.WhenAny(recovered.Task, Task.Delay(5000)).ConfigureAwait(false); + Assert.That(done, Is.SameAs(recovered.Task), + "The poll loop must keep polling after a transient fault."); + } + + Assert.That(errors, Has.Count.GreaterThanOrEqualTo(1), + "The transient fault must be reported to the error handler."); + Assert.That(Volatile.Read(ref calls), Is.GreaterThanOrEqualTo(2), + "Polling must continue after a transient fault."); + } + + [Test] + public async Task DisposeAsyncAfterCallbackFaultCompletesCleanly() + { + var faulted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + + var subscription = new PollingWotSubscription( + Form(), + _ => throw new InvalidOperationException("always faults"), + TimeSpan.FromMilliseconds(10), + onError: _ => faulted.TrySetResult(true)); + + // Ensure at least one faulting iteration has been observed. + Task observed = await Task.WhenAny(faulted.Task, Task.Delay(5000)).ConfigureAwait(false); + Assert.That(observed, Is.SameAs(faulted.Task), "The callback fault must be reported."); + + // DisposeAsync must not rethrow the callback fault and must complete + // promptly (the cancellation source is disposed in a finally). + Task dispose = subscription.DisposeAsync().AsTask(); + Task first = await Task.WhenAny(dispose, Task.Delay(5000)).ConfigureAwait(false); + Assert.That(first, Is.SameAs(dispose), "DisposeAsync must not hang after a callback fault."); + Assert.DoesNotThrowAsync(async () => await dispose.ConfigureAwait(false), + "DisposeAsync must never rethrow a transient poll/callback fault."); + } + + [Test] + public async Task DisposeAsyncDoesNotSwallowNorSurfaceCancellation() + { + using var started = new SemaphoreSlim(0, 1); + var subscription = new PollingWotSubscription( + Form(), + async token => + { + started.Release(); + await Task.Delay(Timeout.Infinite, token).ConfigureAwait(false); + return true; + }, + TimeSpan.FromMilliseconds(10)); + + Assert.That(await started.WaitAsync(5000).ConfigureAwait(false), Is.True); + + // Cooperative cancellation on dispose stops the loop cleanly without + // surfacing an OperationCanceledException from DisposeAsync. + Assert.DoesNotThrowAsync(async () => await subscription.DisposeAsync().ConfigureAwait(false)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/ProfinetBindingPlannerTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/ProfinetBindingPlannerTests.cs new file mode 100644 index 0000000000..29237e3114 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/ProfinetBindingPlannerTests.cs @@ -0,0 +1,358 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Immutable; +using System.Linq; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for validation and compilation logic. + /// + [TestFixture] + public sealed class ProfinetBindingPlannerTests + { + private static WotBindingPlanContext DefaultContext() + { + return new WotBindingPlanContext(); + } + + private static WotAffordanceForm MakePropertyForm( + string formJson, + ImmutableArray ops = default, + ImmutableArray securitySchemes = default) + { + using var formDoc = JsonDocument.Parse(formJson); + JsonElement formElement = formDoc.RootElement.Clone(); + + string? href = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("href", out JsonElement hrefEl) && + hrefEl.ValueKind == JsonValueKind.String) + { + href = hrefEl.GetString(); + } + + ImmutableArray operations = ops.IsDefault + ? (ImmutableArray)["readproperty", "writeproperty"] + : ops; + + return new WotAffordanceForm( + WotAffordanceKind.Property, + "p", + operations, + href, + null, + null, + securitySchemes.IsDefault ? [] : securitySchemes, + "/properties/p/forms/0", + formElement, + default); + } + + [Test] + public void ProfinetPlannerIdentityIdIsCorrect() + { + var planner = new ProfinetBindingPlanner(); + + Assert.That(planner.Identity.Id, Is.EqualTo("w3c.profinet")); + } + + [Test] + public void ProfinetPlannerVersionIsCorrect() + { + var planner = new ProfinetBindingPlanner(); + + Assert.That(planner.Identity.Version, Is.EqualTo("0.1-draft")); + } + + [Test] + public void ProfinetPlannerIsNotExecutable() + { + var planner = new ProfinetBindingPlanner(); + + Assert.That(planner.Capability.IsExecutable, Is.False); + } + + [Test] + public void ProfinetPlannerSupportsOnlyReadAndWriteProperty() + { + var planner = new ProfinetBindingPlanner(); + + Assert.That(planner.Capability.Supports(WoTBindingCapabilityEnum.ReadProperty), Is.True); + Assert.That(planner.Capability.Supports(WoTBindingCapabilityEnum.WriteProperty), Is.True); + Assert.That(planner.Capability.Supports(WoTBindingCapabilityEnum.ObserveProperty), Is.False); + } + + [Test] + public void ProfinetPlannerMatchesFormWithPnvVocabularyPrefix() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":0,"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingMatch match = planner.Match(form, WotBindingSelectionContext.Empty); + + Assert.That(match.IsMatch, Is.True); + } + + [Test] + public void ProfinetPlannerCompilesValidFormWithAllRequiredFields() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":2,"pnv:index":3,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Is.Not.Empty); + } + + [Test] + public void ProfinetPlannerAddressMetadataContainsSlotSubslotIndex() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":4,"pnv:subslot":5,"pnv:index":6,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + WotAddressingDescriptor addressing = result.Entries[0].Addressing; + Assert.That(addressing.Metadata.ContainsKey("slot"), Is.True); + Assert.That(addressing.Metadata["slot"], Is.EqualTo("4")); + Assert.That(addressing.Metadata.ContainsKey("subslot"), Is.True); + Assert.That(addressing.Metadata["subslot"], Is.EqualTo("5")); + Assert.That(addressing.Metadata.ContainsKey("index"), Is.True); + Assert.That(addressing.Metadata["index"], Is.EqualTo("6")); + } + + [Test] + public void ProfinetPlannerCompilesFormWithOptionalApiField() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":0,"pnv:index":0,"pnv:api":42,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + WotAddressingDescriptor addressing = result.Entries[0].Addressing; + Assert.That(addressing.Metadata.ContainsKey("api"), Is.True); + Assert.That(addressing.Metadata["api"], Is.EqualTo("42")); + } + + [Test] + public void ProfinetPlannerCompilesSyntheticEndpointWhenHrefIsAbsent() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + WotEndpointDescriptor endpoint = result.Entries[0].Endpoint; + Assert.That(endpoint.Scheme, Is.EqualTo("profinet")); + Assert.That(endpoint.Host, Is.Null); + Assert.That(endpoint.Port, Is.EqualTo(-1)); + } + + [Test] + public void ProfinetPlannerCompilesFormWithHrefAndParsesEndpoint() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"profinet://plc.example.com:102","pnv:slot":1,"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + WotEndpointDescriptor endpoint = result.Entries[0].Endpoint; + Assert.That(endpoint.Scheme, Is.EqualTo("profinet")); + Assert.That(endpoint.Host, Is.EqualTo("plc.example.com")); + Assert.That(endpoint.Port, Is.EqualTo(102)); + } + + [Test] + public void ProfinetPlannerCompilesReadPropertyOperation() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.ReadProperty)); + } + + [Test] + public void ProfinetPlannerCompilesWritePropertyOperation() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":0,"pnv:index":0,"op":"writeproperty"}""", + ops: ["writeproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.WriteProperty)); + } + + [Test] + public void ProfinetPlannerRejectsObservePropertyAsUnsupported() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":0,"pnv:index":0,"op":"observeproperty"}""", + ops: ["observeproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.UnsupportedOperation), Is.True); + } + + [Test] + public void ProfinetPlannerRejectsMissingSlot() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void ProfinetPlannerRejectsMissingSubslot() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + } + + [Test] + public void ProfinetPlannerRejectsMissingIndex() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + } + + [Test] + public void ProfinetPlannerRejectsNegativeSlotValue() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":-1,"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + } + + [Test] + public void ProfinetPlannerRejectsAllMissingRequiredFields() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"profinet://plc.example.com","op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + Assert.That(result.Diagnostics.Count(d => + d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.EqualTo(3)); + } + + [Test] + public void ProfinetPlannerAcceptsZeroSlotSubslotAndIndex() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":0,"pnv:subslot":0,"pnv:index":0,"op":"readproperty"}""", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + } + + [Test] + public void ProfinetPlannerCompilesBothReadAndWriteWhenBothOpsPresent() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":1,"pnv:subslot":2,"pnv:index":3}""", + ops: ["readproperty", "writeproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Has.Length.EqualTo(2)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/Properties/AssemblyInfo.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..2b9848014c --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2025 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/Support/TestHttpServer.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/Support/TestHttpServer.cs new file mode 100644 index 0000000000..300aedfb61 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/Support/TestHttpServer.cs @@ -0,0 +1,298 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings.Tests.Support +{ + /// + /// A single response returned by the in-process test HTTP server. + /// + public sealed class TestHttpResponse + { + public TestHttpResponse( + int status, string contentType, byte[] body, + IReadOnlyDictionary? headers = null) + { + Status = status; + ContentType = contentType; + Body = body; + Headers = headers; + } + + public int Status { get; } + + public string ContentType { get; } + + public byte[] Body { get; } + + /// + /// Gets optional extra response headers (for example Location). + /// + public IReadOnlyDictionary? Headers { get; } + + public static TestHttpResponse Json(int status, string json) + { + return new TestHttpResponse(status, "application/json", Encoding.UTF8.GetBytes(json)); + } + + /// + /// Creates a redirect response (default 302) carrying a Location header. + /// + public static TestHttpResponse Redirect(string location, int status = 302) + { + return new TestHttpResponse(status, "text/plain", [], + new Dictionary(StringComparer.OrdinalIgnoreCase) { ["Location"] = location }); + } + } + + /// + /// A parsed request handed to the richer test-server handler. + /// + public sealed class TestHttpRequest + { + public TestHttpRequest(string method, string path, byte[] body, IReadOnlyDictionary headers) + { + Method = method; + Path = path; + Body = body; + Headers = headers; + } + + public string Method { get; } + + public string Path { get; } + + public byte[] Body { get; } + + public IReadOnlyDictionary Headers { get; } + } + + /// + /// A minimal in-process HTTP/1.1 server built on + /// (avoiding HttpListener URL-ACL requirements). It routes each request + /// to a supplied handler and is used for the HTTP executor end-to-end tests. + /// + public sealed class TestHttpServer : IDisposable + { + public TestHttpServer(Func handler) + : this(request => handler(request.Method, request.Path, request.Body)) + { + } + + public TestHttpServer(Func handler) + { + m_handler = handler; + m_listener = new TcpListener(IPAddress.Loopback, 0); + m_listener.Start(); + Port = ((IPEndPoint)m_listener.LocalEndpoint).Port; + BaseUrl = $"http://127.0.0.1:{Port}"; + m_loop = Task.Run(AcceptLoopAsync); + } + + public string BaseUrl { get; } + + public int Port { get; } + + public void Dispose() + { + m_cts.Cancel(); + m_listener.Stop(); + m_listener.Dispose(); + try + { + m_loop.Wait(2000); + } + catch (AggregateException) + { + // Ignore teardown faults. + } + m_cts.Dispose(); + } + + private async Task AcceptLoopAsync() + { + while (!m_cts.IsCancellationRequested) + { + TcpClient client; + try + { + client = await m_listener.AcceptTcpClientAsync().ConfigureAwait(false); + } + catch (ObjectDisposedException) + { + return; + } + catch (SocketException) + { + return; + } + _ = Task.Run(() => HandleAsync(client)); + } + } + + private async Task HandleAsync(TcpClient client) + { + using (client) + using (NetworkStream stream = client.GetStream()) + { + try + { + TestHttpRequest? request = await ReadRequestAsync(stream).ConfigureAwait(false); + if (request is null) + { + return; + } + TestHttpResponse response = m_handler(request); + await WriteResponseAsync(stream, response).ConfigureAwait(false); + } + catch (IOException) + { + // Client disconnected. + } + } + } + + private static async Task ReadRequestAsync(NetworkStream stream) + { + var header = new MemoryStream(); + byte[] one = new byte[1]; + int matched = 0; + byte[] terminator = Encoding.ASCII.GetBytes("\r\n\r\n"); + while (matched < terminator.Length) + { + int read = await stream.ReadAsync(one.AsMemory(0, 1)).ConfigureAwait(false); + if (read == 0) + { + return null; + } + header.WriteByte(one[0]); + matched = one[0] == terminator[matched] ? matched + 1 : (one[0] == terminator[0] ? 1 : 0); + } + + string[] lines = Encoding.ASCII.GetString(header.ToArray()).Split("\r\n"); + string[] requestLine = lines[0].Split(' '); + string method = requestLine.Length > 0 ? requestLine[0] : "GET"; + string path = requestLine.Length > 1 ? requestLine[1] : "/"; + int contentLength = 0; + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + for (int i = 1; i < lines.Length; i++) + { + string line = lines[i]; + int colon = line.IndexOf(':', StringComparison.Ordinal); + if (colon <= 0) + { + continue; + } + string name = line[..colon].Trim(); + string value = line[(colon + 1)..].Trim(); + headers[name] = value; + if (string.Equals(name, "Content-Length", StringComparison.OrdinalIgnoreCase) && + !int.TryParse(value, out contentLength)) + { + contentLength = 0; + } + } + + byte[] body = []; + if (contentLength > 0) + { + body = new byte[contentLength]; + int offset = 0; + while (offset < contentLength) + { + int read = await stream + .ReadAsync(body.AsMemory(offset, contentLength - offset)) + .ConfigureAwait(false); + if (read == 0) + { + break; + } + offset += read; + } + } + return new TestHttpRequest(method, path, body, headers); + } + + private static async Task WriteResponseAsync(NetworkStream stream, TestHttpResponse response) + { + byte[] body = response.Body ?? []; + var builder = new StringBuilder(); + builder.Append("HTTP/1.1 ").Append(response.Status).Append(' ') + .Append(Reason(response.Status)).Append("\r\n") + .Append("Content-Type: ").Append(response.ContentType).Append("\r\n") + .Append("Content-Length: ").Append(body.Length).Append("\r\n"); + if (response.Headers is { Count: > 0 }) + { + foreach (KeyValuePair extra in response.Headers) + { + builder.Append(extra.Key).Append(": ").Append(extra.Value).Append("\r\n"); + } + } + builder.Append("Connection: close\r\n\r\n"); + byte[] head = Encoding.ASCII.GetBytes(builder.ToString()); + await stream.WriteAsync(head).ConfigureAwait(false); + if (body.Length > 0) + { + await stream.WriteAsync(body).ConfigureAwait(false); + } + await stream.FlushAsync().ConfigureAwait(false); + } + + private static string Reason(int status) + { + return status switch + { + 200 => "OK", + 204 => "No Content", + 301 => "Moved Permanently", + 302 => "Found", + 303 => "See Other", + 307 => "Temporary Redirect", + 308 => "Permanent Redirect", + 400 => "Bad Request", + 404 => "Not Found", + 500 => "Internal Server Error", + _ => "Status" + }; + } + + private readonly Func m_handler; + private readonly TcpListener m_listener; + private readonly Task m_loop; + private readonly CancellationTokenSource m_cts = new(); + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/Support/TestModbusServer.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/Support/TestModbusServer.cs new file mode 100644 index 0000000000..48ec7ba8d9 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/Support/TestModbusServer.cs @@ -0,0 +1,300 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace Opc.Ua.WotCon.Bindings.Tests.Support +{ + /// + /// A minimal in-process Modbus TCP server / simulator supporting the read and + /// write function codes required by the WoT Modbus binding (FC 1/2/3/4/5/6/15/16). + /// + public sealed class TestModbusServer : IDisposable + { + public TestModbusServer() + { + m_listener = new TcpListener(IPAddress.Loopback, 0); + m_listener.Start(); + Port = ((IPEndPoint)m_listener.LocalEndpoint).Port; + m_loop = Task.Run(AcceptLoopAsync); + } + + public int Port { get; } + + public ushort[] HoldingRegisters { get; } = new ushort[1024]; + + public ushort[] InputRegisters { get; } = new ushort[1024]; + + public bool[] Coils { get; } = new bool[2048]; + + public bool[] DiscreteInputs { get; } = new bool[2048]; + + public bool RejectConnections + { + get => Volatile.Read(ref m_rejectConnections) != 0; + set => Volatile.Write(ref m_rejectConnections, value ? 1 : 0); + } + + public int AcceptedConnectionCount => Volatile.Read(ref m_acceptedConnectionCount); + + public int LastFunctionCode => Volatile.Read(ref m_lastFunctionCode); + + public void DisconnectClients() + { + foreach (TcpClient client in m_clients.Values) + { + client.Dispose(); + } + } + + public void Dispose() + { + m_cts.Cancel(); + DisconnectClients(); + m_listener.Stop(); + m_listener.Dispose(); + try + { + m_loop.Wait(2000); + } + catch (AggregateException) + { + // Ignore teardown faults. + } + m_cts.Dispose(); + } + + private async Task AcceptLoopAsync() + { + while (!m_cts.IsCancellationRequested) + { + TcpClient client; + try + { + client = await m_listener.AcceptTcpClientAsync().ConfigureAwait(false); + } + catch (ObjectDisposedException) + { + return; + } + catch (SocketException) + { + return; + } + int connectionId = Interlocked.Increment(ref m_acceptedConnectionCount); + if (RejectConnections) + { + client.Dispose(); + continue; + } + m_clients[connectionId] = client; + _ = ServeAsync(connectionId); + } + } + + private async Task ServeAsync(int connectionId) + { + try + { + if (!m_clients.TryGetValue(connectionId, out TcpClient? client)) + { + return; + } + using (client) + using (NetworkStream stream = client.GetStream()) + { + try + { + while (!m_cts.IsCancellationRequested) + { + byte[]? header = await ReadExactAsync(stream, 6).ConfigureAwait(false); + if (header is null) + { + return; + } + int length = (header[4] << 8) | header[5]; + byte[]? rest = await ReadExactAsync(stream, length).ConfigureAwait(false); + if (rest is null) + { + return; + } + byte unit = rest[0]; + byte[] pdu = new byte[rest.Length - 1]; + Array.Copy(rest, 1, pdu, 0, pdu.Length); + byte[] responsePdu = Process(pdu); + byte[] frame = BuildFrame(header[0], header[1], unit, responsePdu); + await stream.WriteAsync(frame).ConfigureAwait(false); + await stream.FlushAsync().ConfigureAwait(false); + } + } + catch (System.IO.IOException) + { + // Client disconnected. + } + catch (ObjectDisposedException) + { + // Client disconnected. + } + } + } + finally + { + m_clients.TryRemove(connectionId, out _); + } + } + + private byte[] Process(byte[] pdu) + { + byte function = pdu[0]; + Volatile.Write(ref m_lastFunctionCode, function); + switch (function) + { + case 0x01: + return ReadBits(pdu, Coils, function); + case 0x02: + return ReadBits(pdu, DiscreteInputs, function); + case 0x03: + return ReadRegisters(pdu, HoldingRegisters, function); + case 0x04: + return ReadRegisters(pdu, InputRegisters, function); + case 0x05: + { + int address = (pdu[1] << 8) | pdu[2]; + Coils[address] = pdu[3] == 0xFF; + return [function, pdu[1], pdu[2], pdu[3], pdu[4]]; + } + case 0x06: + { + int address = (pdu[1] << 8) | pdu[2]; + HoldingRegisters[address] = (ushort)((pdu[3] << 8) | pdu[4]); + return [function, pdu[1], pdu[2], pdu[3], pdu[4]]; + } + case 0x0F: + { + int address = (pdu[1] << 8) | pdu[2]; + int quantity = (pdu[3] << 8) | pdu[4]; + for (int i = 0; i < quantity; i++) + { + Coils[address + i] = (pdu[6 + (i / 8)] & (1 << (i % 8))) != 0; + } + return [function, pdu[1], pdu[2], pdu[3], pdu[4]]; + } + case 0x10: + { + int address = (pdu[1] << 8) | pdu[2]; + int quantity = (pdu[3] << 8) | pdu[4]; + for (int i = 0; i < quantity; i++) + { + HoldingRegisters[address + i] = (ushort)((pdu[6 + (i * 2)] << 8) | pdu[7 + (i * 2)]); + } + return [function, pdu[1], pdu[2], pdu[3], pdu[4]]; + } + default: + return [(byte)(function | 0x80), 0x01]; + } + } + + private static byte[] ReadRegisters(byte[] pdu, ushort[] store, byte function) + { + int address = (pdu[1] << 8) | pdu[2]; + int quantity = (pdu[3] << 8) | pdu[4]; + byte[] response = new byte[2 + (quantity * 2)]; + response[0] = function; + response[1] = (byte)(quantity * 2); + for (int i = 0; i < quantity; i++) + { + response[2 + (i * 2)] = (byte)(store[address + i] >> 8); + response[3 + (i * 2)] = (byte)(store[address + i] & 0xFF); + } + return response; + } + + private static byte[] ReadBits(byte[] pdu, bool[] store, byte function) + { + int address = (pdu[1] << 8) | pdu[2]; + int quantity = (pdu[3] << 8) | pdu[4]; + int byteCount = (quantity + 7) / 8; + byte[] response = new byte[2 + byteCount]; + response[0] = function; + response[1] = (byte)byteCount; + for (int i = 0; i < quantity; i++) + { + if (store[address + i]) + { + response[2 + (i / 8)] |= (byte)(1 << (i % 8)); + } + } + return response; + } + + private static byte[] BuildFrame(byte txnHi, byte txnLo, byte unit, byte[] pdu) + { + int length = pdu.Length + 1; + byte[] frame = new byte[7 + pdu.Length]; + frame[0] = txnHi; + frame[1] = txnLo; + frame[2] = 0x00; + frame[3] = 0x00; + frame[4] = (byte)(length >> 8); + frame[5] = (byte)(length & 0xFF); + frame[6] = unit; + Array.Copy(pdu, 0, frame, 7, pdu.Length); + return frame; + } + + private static async Task ReadExactAsync(NetworkStream stream, int count) + { + byte[] buffer = new byte[count]; + int offset = 0; + while (offset < count) + { + int read = await stream.ReadAsync(buffer.AsMemory(offset, count - offset)).ConfigureAwait(false); + if (read == 0) + { + return null; + } + offset += read; + } + return buffer; + } + + private readonly TcpListener m_listener; + private readonly Task m_loop; + private readonly CancellationTokenSource m_cts = new(); + private readonly ConcurrentDictionary m_clients = new(); + private int m_acceptedConnectionCount; + private int m_lastFunctionCode; + private int m_rejectConnections; + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/WotAffordanceFormTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/WotAffordanceFormTests.cs new file mode 100644 index 0000000000..5513f37c63 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/WotAffordanceFormTests.cs @@ -0,0 +1,351 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Text.Json; +using NUnit.Framework; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for helpers: JSON Pointer + /// construction, TryGet accessors and escape token logic. + /// + [TestFixture] + public sealed class WotAffordanceFormTests + { + private static WotAffordanceForm MakeForm( + WotAffordanceKind kind, + string name, + string formJson, + string affordanceJson = "{}") + { + using var formDoc = JsonDocument.Parse(formJson); + using var affordanceDoc = JsonDocument.Parse(affordanceJson); + JsonElement formElement = formDoc.RootElement.Clone(); + JsonElement affordanceElement = affordanceDoc.RootElement.Clone(); + + string collection = kind switch + { + WotAffordanceKind.Action => "actions", + WotAffordanceKind.Event => "events", + _ => "properties" + }; + string pointer = "/" + collection + "/" + WotAffordanceForm.EscapePointerToken(name) + "/forms/0"; + + return new WotAffordanceForm( + kind, + name, + ["readproperty"], + null, + null, + null, + [], + pointer, + formElement, + affordanceElement); + } + + [Test] + public void EscapePointerTokenLeavesSafeCharsUnchanged() + { + Assert.That(WotAffordanceForm.EscapePointerToken("temperature"), Is.EqualTo("temperature")); + } + + [Test] + public void EscapePointerTokenEscapesTilde() + { + Assert.That(WotAffordanceForm.EscapePointerToken("a~b"), Is.EqualTo("a~0b")); + } + + [Test] + public void EscapePointerTokenEscapesForwardSlash() + { + Assert.That(WotAffordanceForm.EscapePointerToken("a/b"), Is.EqualTo("a~1b")); + } + + [Test] + public void EscapePointerTokenEscapesBothSpecialChars() + { + Assert.That(WotAffordanceForm.EscapePointerToken("a~/b"), Is.EqualTo("a~0~1b")); + } + + [Test] + public void EscapePointerTokenHandlesEmptyString() + { + Assert.That(WotAffordanceForm.EscapePointerToken(string.Empty), Is.EqualTo(string.Empty)); + } + + [Test] + public void PointerAppendsChildToken() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "temp", + """{"href":"http://example.com"}"""); + + string pointer = form.Pointer("href"); + + Assert.That(pointer, Is.EqualTo("/properties/temp/forms/0/href")); + } + + [Test] + public void PointerWithEmptyChildTokenReturnsFormPointer() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "temp", + """{"href":"http://example.com"}"""); + + string pointer = form.Pointer(string.Empty); + + Assert.That(pointer, Is.EqualTo("/properties/temp/forms/0")); + } + + [Test] + public void AffordancePointerBuildsPropertyPath() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "temp", "{}"); + + Assert.That(form.AffordancePointer(), Is.EqualTo("/properties/temp")); + } + + [Test] + public void AffordancePointerBuildsActionPath() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Action, "reset", "{}"); + + Assert.That(form.AffordancePointer(), Is.EqualTo("/actions/reset")); + } + + [Test] + public void AffordancePointerBuildsEventPath() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Event, "alarm", "{}"); + + Assert.That(form.AffordancePointer(), Is.EqualTo("/events/alarm")); + } + + [Test] + public void AffordancePointerWithChildTokenAppendsToken() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "temp", "{}"); + + Assert.That(form.AffordancePointer("uav:mapToNodeId"), + Is.EqualTo("/properties/temp/uav:mapToNodeId")); + } + + [Test] + public void TryGetStringReturnsTrueForExistingStringProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", + """{"modv:entity":"holdingRegister"}"""); + + bool found = form.TryGetString("modv:entity", out string value); + + Assert.That(found, Is.True); + Assert.That(value, Is.EqualTo("holdingRegister")); + } + + [Test] + public void TryGetStringReturnsFalseForMissingProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + bool found = form.TryGetString("nonexistent", out string value); + + Assert.That(found, Is.False); + Assert.That(value, Is.EqualTo(string.Empty)); + } + + [Test] + public void TryGetStringReturnsFalseForNonStringProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", + """{"num":42}"""); + + bool found = form.TryGetString("num", out string value); + + Assert.That(found, Is.False); + Assert.That(value, Is.EqualTo(string.Empty)); + } + + [Test] + public void TryGetBooleanReturnsTrueForTrueProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", + """{"mqv:retain":true}"""); + + bool found = form.TryGetBoolean("mqv:retain", out bool value); + + Assert.That(found, Is.True); + Assert.That(value, Is.True); + } + + [Test] + public void TryGetBooleanReturnsTrueForFalseProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", + """{"mqv:retain":false}"""); + + bool found = form.TryGetBoolean("mqv:retain", out bool value); + + Assert.That(found, Is.True); + Assert.That(value, Is.False); + } + + [Test] + public void TryGetBooleanReturnsFalseForMissingProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + bool found = form.TryGetBoolean("missing", out bool value); + + Assert.That(found, Is.False); + Assert.That(value, Is.False); + } + + [Test] + public void TryGetInt32ReturnsTrueForNumberProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", + """{"modv:address":42}"""); + + bool found = form.TryGetInt32("modv:address", out int value); + + Assert.That(found, Is.True); + Assert.That(value, Is.EqualTo(42)); + } + + [Test] + public void TryGetInt32ReturnsTrueForStringNumericProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", + """{"modv:address":"100"}"""); + + bool found = form.TryGetInt32("modv:address", out int value); + + Assert.That(found, Is.True); + Assert.That(value, Is.EqualTo(100)); + } + + [Test] + public void TryGetInt32ReturnsFalseForMissingProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + bool found = form.TryGetInt32("missing", out int value); + + Assert.That(found, Is.False); + Assert.That(value, Is.Zero); + } + + [Test] + public void TryGetStringArrayReturnsTrueForArrayProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Event, "ev", + """{"uav:eventFields":["Message","Severity"]}"""); + + bool found = form.TryGetStringArray("uav:eventFields", out ImmutableArray values); + + Assert.That(found, Is.True); + Assert.That(values, Does.Contain("Message")); + Assert.That(values, Does.Contain("Severity")); + } + + [Test] + public void TryGetStringArrayReturnsFalseForMissingProperty() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Event, "ev", "{}"); + + bool found = form.TryGetStringArray("missing", out ImmutableArray values); + + Assert.That(found, Is.False); + Assert.That(values.IsEmpty, Is.True); + } + + [Test] + public void HasOperationReturnsTrueForMatchingOp() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + Assert.That(form.HasOperation("readproperty"), Is.True); + } + + [Test] + public void HasOperationIsCaseInsensitive() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + Assert.That(form.HasOperation("READPROPERTY"), Is.True); + } + + [Test] + public void HasOperationReturnsFalseForNonMatchingOp() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + Assert.That(form.HasOperation("writeproperty"), Is.False); + } + + [Test] + public void WotAffordanceFormConstructorDefaultsNullArraysToEmpty() + { + using var formDoc = JsonDocument.Parse("{}"); + using var affordanceDoc = JsonDocument.Parse("{}"); + + var form = new WotAffordanceForm( + WotAffordanceKind.Property, "p", + default, + null, null, null, + default, + "/properties/p/forms/0", + formDoc.RootElement.Clone(), + affordanceDoc.RootElement.Clone()); + + Assert.That(form.Operations.IsEmpty, Is.True); + Assert.That(form.SecuritySchemes.IsEmpty, Is.True); + } + + [Test] + public void TargetMappingIsEmptyWhenNoTermsPresent() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}"); + + Assert.That(form.TargetMapping.IsEmpty, Is.True); + } + + [Test] + public void TargetMappingIsParsedFromAffordanceElement() + { + WotAffordanceForm form = MakeForm(WotAffordanceKind.Property, "p", "{}", + """{"uav:mapToNodeId":"ns=2;i=1000"}"""); + + Assert.That(form.TargetMapping.IsEmpty, Is.False); + Assert.That(form.TargetMapping.TargetNodeId, Is.EqualTo("ns=2;i=1000")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/WotBinderRegistryDiTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/WotBinderRegistryDiTests.cs new file mode 100644 index 0000000000..ecf32fb369 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/WotBinderRegistryDiTests.cs @@ -0,0 +1,128 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for : + /// DI registration, singleton semantics and idempotency. + /// + [TestFixture] + public sealed class WotBinderRegistryDiTests + { + [Test] + public void EnsureWotBinderRegistryRegistersIWotBinderRegistry() + { + var services = new ServiceCollection(); + services.EnsureWotBinderRegistry(); + var provider = services.BuildServiceProvider(); + + var registry = provider.GetService(); + + Assert.That(registry, Is.Not.Null); + } + + [Test] + public void EnsureWotBinderRegistryRegistersIWotBindingChannelFactory() + { + var services = new ServiceCollection(); + services.EnsureWotBinderRegistry(); + var provider = services.BuildServiceProvider(); + + var factory = provider.GetService(); + + Assert.That(factory, Is.Not.Null); + } + + [Test] + public void EnsureWotBinderRegistryBothInterfacesResolveSameSingletonInstance() + { + var services = new ServiceCollection(); + services.EnsureWotBinderRegistry(); + var provider = services.BuildServiceProvider(); + + var registry = provider.GetRequiredService(); + var factory = provider.GetRequiredService(); + + Assert.That(object.ReferenceEquals(registry, factory), Is.True); + } + + [Test] + public void EnsureWotBinderRegistryIsIdempotent() + { + var services = new ServiceCollection(); + services.EnsureWotBinderRegistry(); + services.EnsureWotBinderRegistry(); + services.EnsureWotBinderRegistry(); + var provider = services.BuildServiceProvider(); + + // There should be exactly one WotProtocolBinderRegistry singleton, + // both interfaces resolve to the same instance. + var registry = provider.GetRequiredService(); + var factory = provider.GetRequiredService(); + + Assert.That(object.ReferenceEquals(registry, factory), Is.True); + } + + [Test] + public void EnsureWotBinderRegistryNullServicesThrows() + { + Assert.Throws( + () => WotBinderRegistryServiceCollectionExtensions.EnsureWotBinderRegistry(null!)); + } + + [Test] + public void EnsureWotBinderRegistryConcreteTypeIsAlsoResolvable() + { + var services = new ServiceCollection(); + services.EnsureWotBinderRegistry(); + var provider = services.BuildServiceProvider(); + + var concrete = provider.GetService(); + + Assert.That(concrete, Is.Not.Null); + } + + [Test] + public void EnsureWotBinderRegistryWithNoBinders_RegistryHasNoBinders() + { + var services = new ServiceCollection(); + services.EnsureWotBinderRegistry(); + var provider = services.BuildServiceProvider(); + + var concrete = provider.GetRequiredService(); + + Assert.That(concrete.Binders, Is.Empty); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/WotFormExtractorTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/WotFormExtractorTests.cs new file mode 100644 index 0000000000..9191b44eae --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/WotFormExtractorTests.cs @@ -0,0 +1,305 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using NUnit.Framework; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for . + /// + [TestFixture] + public sealed class WotFormExtractorTests + { + private static byte[] Utf8(string json) + { + return Encoding.UTF8.GetBytes(json); + } + + [Test] + public void ExtractReturnsEmptyForNonObject() + { + var forms = WotFormExtractor.Extract(Utf8("[]")); + Assert.That(forms.IsEmpty, Is.True); + } + + [Test] + public void ExtractReturnsEmptyForEmptyDocument() + { + var forms = WotFormExtractor.Extract(Utf8("{}")); + Assert.That(forms.IsEmpty, Is.True); + } + + [Test] + public void ExtractReturnsEmptyForMalformedJson() + { + var forms = WotFormExtractor.Extract(Utf8("{not valid json}")); + Assert.That(forms.IsEmpty, Is.True); + } + + [Test] + public void ExtractPropertyFormWithDefaultOps() + { + string td = + "{\"properties\":{\"temp\":{\"type\":\"number\"," + + "\"forms\":[{\"href\":\"http://example.com/temp\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + var form = forms[0]; + Assert.That(form.Kind, Is.EqualTo(WotAffordanceKind.Property)); + Assert.That(form.AffordanceName, Is.EqualTo("temp")); + Assert.That(form.Href, Is.EqualTo("http://example.com/temp")); + Assert.That(form.Operations, Does.Contain("readproperty")); + Assert.That(form.Operations, Does.Contain("writeproperty")); + } + + [Test] + public void ExtractReadOnlyPropertyDefaultOpsContainOnlyReadProperty() + { + string td = + "{\"properties\":{\"sensor\":{\"readOnly\":true," + + "\"forms\":[{\"href\":\"http://example.com/sensor\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Operations, Does.Contain("readproperty")); + Assert.That(forms[0].Operations, Does.Not.Contain("writeproperty")); + } + + [Test] + public void ExtractWriteOnlyPropertyDefaultOpsContainOnlyWriteProperty() + { + string td = + "{\"properties\":{\"actuator\":{\"writeOnly\":true," + + "\"forms\":[{\"href\":\"http://example.com/actuator\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Operations, Does.Not.Contain("readproperty")); + Assert.That(forms[0].Operations, Does.Contain("writeproperty")); + } + + [Test] + public void ExtractObservablePropertyDefaultOpsIncludeObserve() + { + string td = + "{\"properties\":{\"power\":{\"observable\":true," + + "\"forms\":[{\"href\":\"http://example.com/power\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Operations, Does.Contain("observeproperty")); + Assert.That(forms[0].Operations, Does.Contain("unobserveproperty")); + } + + [Test] + public void ExtractActionFormWithDefaultOps() + { + string td = + "{\"actions\":{\"reset\":{\"forms\":[{\"href\":\"http://example.com/reset\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Kind, Is.EqualTo(WotAffordanceKind.Action)); + Assert.That(forms[0].Operations, Does.Contain("invokeaction")); + Assert.That(forms[0].Operations, Has.Length.EqualTo(1)); + } + + [Test] + public void ExtractEventFormWithDefaultOps() + { + string td = + "{\"events\":{\"alarm\":{\"forms\":[{\"href\":\"http://example.com/alarm\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Kind, Is.EqualTo(WotAffordanceKind.Event)); + Assert.That(forms[0].Operations, Does.Contain("subscribeevent")); + Assert.That(forms[0].Operations, Does.Contain("unsubscribeevent")); + } + + [Test] + public void ExtractFormWithExplicitSingleOpOverride() + { + string td = + "{\"properties\":{\"sensor\":{\"forms\":[{\"href\":\"http://example.com/sensor\"," + + "\"op\":\"readproperty\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Operations, Does.Contain("readproperty")); + Assert.That(forms[0].Operations, Has.Length.EqualTo(1)); + } + + [Test] + public void ExtractFormWithExplicitArrayOpOverride() + { + string td = + "{\"properties\":{\"sensor\":{\"forms\":[{\"href\":\"http://example.com/sensor\"," + + "\"op\":[\"readproperty\",\"observeproperty\"]}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].Operations, Does.Contain("readproperty")); + Assert.That(forms[0].Operations, Does.Contain("observeproperty")); + } + + [Test] + public void ExtractFormLevelSecurityOverridesThingSecurity() + { + string td = + "{\"security\":\"nosec_sc\",\"properties\":{\"sensor\":{\"forms\":[{" + + "\"href\":\"http://example.com/sensor\",\"security\":\"basic_sc\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].SecuritySchemes, Does.Contain("basic_sc")); + Assert.That(forms[0].SecuritySchemes, Does.Not.Contain("nosec_sc")); + } + + [Test] + public void ExtractFormWithoutSecurityFallsBackToThingSecurity() + { + string td = + "{\"security\":\"nosec_sc\",\"properties\":{\"sensor\":{\"forms\":[{" + + "\"href\":\"http://example.com/sensor\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].SecuritySchemes, Does.Contain("nosec_sc")); + } + + [Test] + public void ExtractThingLevelSecurityArray() + { + string td = + "{\"security\":[\"auth1_sc\",\"auth2_sc\"],\"properties\":{\"p\":{\"forms\":[{" + + "\"href\":\"http://example.com/p\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms[0].SecuritySchemes, Does.Contain("auth1_sc")); + Assert.That(forms[0].SecuritySchemes, Does.Contain("auth2_sc")); + } + + [Test] + public void ExtractFormlessAffordanceProducesFormlessDescriptor() + { + string td = "{\"properties\":{\"nada\":{\"type\":\"string\"}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(1)); + Assert.That(forms[0].AffordanceName, Is.EqualTo("nada")); + Assert.That(forms[0].Href, Is.Null); + } + + [Test] + public void ExtractMultipleFormsProducesOneEntryPerForm() + { + string td = + "{\"properties\":{\"p\":{\"forms\":[" + + "{\"href\":\"http://example.com/p\"}," + + "{\"href\":\"http://backup.com/p\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(2)); + } + + [Test] + public void ExtractMultipleAffordancesAcrossKinds() + { + string td = + "{\"properties\":{\"temp\":{\"forms\":[{\"href\":\"http://example.com/temp\"}]}}," + + "\"actions\":{\"reset\":{\"forms\":[{\"href\":\"http://example.com/reset\"}]}}," + + "\"events\":{\"alarm\":{\"forms\":[{\"href\":\"http://example.com/alarm\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms, Has.Length.EqualTo(3)); + Assert.That(forms.Any(f => f.Kind == WotAffordanceKind.Property), Is.True); + Assert.That(forms.Any(f => f.Kind == WotAffordanceKind.Action), Is.True); + Assert.That(forms.Any(f => f.Kind == WotAffordanceKind.Event), Is.True); + } + + [Test] + public void ExtractJsonPointerForFirstForm() + { + string td = + "{\"properties\":{\"temp\":{\"forms\":[{\"href\":\"http://example.com/temp\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms[0].JsonPointer, Is.EqualTo("/properties/temp/forms/0")); + } + + [Test] + public void ExtractJsonPointerForSecondForm() + { + string td = + "{\"properties\":{\"temp\":{\"forms\":[" + + "{\"href\":\"http://a.com/t\"},{\"href\":\"http://b.com/t\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms[0].JsonPointer, Is.EqualTo("/properties/temp/forms/0")); + Assert.That(forms[1].JsonPointer, Is.EqualTo("/properties/temp/forms/1")); + } + + [Test] + public void ExtractEscapesSpecialCharactersInAffordanceName() + { + string td = + "{\"properties\":{\"te~mp/val\":{\"forms\":[{\"href\":\"http://example.com/temp\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms[0].JsonPointer, Does.Contain("te~0mp~1val")); + } + + [Test] + public void ExtractFormWithContentType() + { + string td = + "{\"properties\":{\"data\":{\"forms\":[{\"href\":\"http://example.com/data\"," + + "\"contentType\":\"application/octet-stream\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms[0].ContentType, Is.EqualTo("application/octet-stream")); + } + + [Test] + public void ExtractBothReadOnlyAndWriteOnlyYieldsReadProperty() + { + string td = + "{\"properties\":{\"odd\":{\"readOnly\":true,\"writeOnly\":true," + + "\"forms\":[{\"href\":\"http://example.com/odd\"}]}}}"; + var forms = WotFormExtractor.Extract(Utf8(td)); + + Assert.That(forms[0].Operations, Does.Contain("readproperty")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/WotPayloadCodecTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/WotPayloadCodecTests.cs new file mode 100644 index 0000000000..5d00007336 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/WotPayloadCodecTests.cs @@ -0,0 +1,578 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Text; +using NUnit.Framework; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for the built-in payload codecs and the codec registry. + /// + [TestFixture] + public sealed class WotPayloadCodecTests + { + private static readonly WotPayloadDescriptor s_jsonPayload = + new WotPayloadDescriptor("application/json", "json"); + + private static readonly WotPayloadDescriptor s_textPayload = + new WotPayloadDescriptor("text/plain", "text"); + + private static readonly WotPayloadDescriptor s_octetPayload = + new WotPayloadDescriptor("application/octet-stream", "octet-stream"); + + [TestCase(null, true)] + [TestCase("", true)] + [TestCase("application/json", true)] + [TestCase("APPLICATION/JSON", true)] + [TestCase("application/json; charset=utf-8", true)] + [TestCase("application/thing+json", true)] + [TestCase("application/ld+json", true)] + [TestCase("text/plain", false)] + [TestCase("application/octet-stream", false)] + [TestCase("application/cbor", false)] + public void JsonCodecCanHandleRecognizesContentTypes(string? contentType, bool expected) + { + Assert.That(JsonWotPayloadCodec.Instance.CanHandle(contentType), Is.EqualTo(expected)); + } + + [TestCase(null, false)] + [TestCase("", false)] + [TestCase("text/plain", true)] + [TestCase("text/csv", true)] + [TestCase("TEXT/HTML", true)] + [TestCase("application/json", false)] + [TestCase("application/octet-stream", false)] + public void TextCodecCanHandleRecognizesContentTypes(string? contentType, bool expected) + { + Assert.That(TextWotPayloadCodec.Instance.CanHandle(contentType), Is.EqualTo(expected)); + } + + [TestCase(null, false)] + [TestCase("", false)] + [TestCase("application/octet-stream", true)] + [TestCase("application/octet-stream; charset=binary", true)] + [TestCase("APPLICATION/OCTET-STREAM", true)] + [TestCase("application/json", false)] + [TestCase("text/plain", false)] + public void OctetStreamCodecCanHandleRecognizesContentTypes(string? contentType, bool expected) + { + Assert.That(OctetStreamWotPayloadCodec.Instance.CanHandle(contentType), Is.EqualTo(expected)); + } + + [Test] + public void JsonCodecHasStableId() + { + Assert.That(JsonWotPayloadCodec.Instance.Id, Is.EqualTo("json")); + } + + [Test] + public void TextCodecHasStableId() + { + Assert.That(TextWotPayloadCodec.Instance.Id, Is.EqualTo("text")); + } + + [Test] + public void OctetStreamCodecHasStableId() + { + Assert.That(OctetStreamWotPayloadCodec.Instance.Id, Is.EqualTo("octet-stream")); + } + + [Test] + public void JsonCodecDecodesEmptyDataAsNullVariant() + { + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode( + ReadOnlyMemory.Empty, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.IsNull, Is.True); + } + + [Test] + public void JsonCodecDecodesTrueValue() + { + byte[] data = Encoding.UTF8.GetBytes("true"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.True); + } + + [Test] + public void JsonCodecDecodesFalseValue() + { + byte[] data = Encoding.UTF8.GetBytes("false"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.False); + } + + [Test] + public void JsonCodecDecodesNullValue() + { + byte[] data = Encoding.UTF8.GetBytes("null"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.IsNull, Is.True); + } + + [Test] + public void JsonCodecDecodesStringValue() + { + byte[] data = Encoding.UTF8.GetBytes("\"hello world\""); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo("hello world")); + } + + [Test] + public void JsonCodecDecodesIntegerAsLong() + { + byte[] data = Encoding.UTF8.GetBytes("42"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo(42L)); + } + + [Test] + public void JsonCodecDecodesDoubleWhenNotFitsInt64() + { + byte[] data = Encoding.UTF8.GetBytes("1.5"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo(1.5)); + } + + [Test] + public void JsonCodecDecodesObjectAsRawText() + { + byte[] data = Encoding.UTF8.GetBytes("{\"a\":1}"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo("{\"a\":1}")); + } + + [Test] + public void JsonCodecDecodesArrayAsRawText() + { + byte[] data = Encoding.UTF8.GetBytes("[1,2,3]"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo("[1,2,3]")); + } + + [Test] + public void JsonCodecReportsMalformedJson() + { + byte[] data = Encoding.UTF8.GetBytes("{not valid json}"); + WotDecodeResult result = JsonWotPayloadCodec.Instance.Decode(data, s_jsonPayload); + + Assert.That(result.Success, Is.False); + Assert.That(result.Error, Is.Not.Null.And.Not.Empty); + } + + [Test] + public void JsonCodecEncodesBooleanTrue() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(true), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("true")); + } + + [Test] + public void JsonCodecEncodesBooleanFalse() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(false), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("false")); + } + + [Test] + public void JsonCodecEncodesString() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant("hello"), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("\"hello\"")); + } + + [Test] + public void JsonCodecEncodesNullVariantAsNull() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + Variant.Null, s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("null")); + } + + [Test] + public void JsonCodecEncodesByte() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant((byte)200), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("200")); + } + + [Test] + public void JsonCodecEncodesSByte() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant((sbyte)-100), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("-100")); + } + + [Test] + public void JsonCodecEncodesShort() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant((short)-32000), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("-32000")); + } + + [Test] + public void JsonCodecEncodesUShort() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant((ushort)60000), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("60000")); + } + + [Test] + public void JsonCodecEncodesInt() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(123456), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("123456")); + } + + [Test] + public void JsonCodecEncodesUInt() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(3000000000U), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("3000000000")); + } + + [Test] + public void JsonCodecEncodesLong() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(9000000000000L), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("9000000000000")); + } + + [Test] + public void JsonCodecEncodesULong() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(9000000000000UL), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Is.EqualTo("9000000000000")); + } + + [Test] + public void JsonCodecEncodesFloat() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(1.5f), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Does.Contain("1.5")); + } + + [Test] + public void JsonCodecEncodesDouble() + { + WotEncodeResult result = JsonWotPayloadCodec.Instance.Encode( + new Variant(3.14), s_jsonPayload); + + Assert.That(result.Success, Is.True); + string text = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(text, Does.Contain("3.14")); + } + + [Test] + public void TextCodecEncodesValueAsUtf8() + { + WotEncodeResult result = TextWotPayloadCodec.Instance.Encode( + new Variant("café"), s_textPayload); + + Assert.That(result.Success, Is.True); + string decoded = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(decoded, Is.EqualTo("café")); + } + + [Test] + public void TextCodecEncodesNullVariantAsEmpty() + { + WotEncodeResult result = TextWotPayloadCodec.Instance.Encode( + Variant.Null, s_textPayload); + + Assert.That(result.Success, Is.True); + string decoded = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(decoded, Is.EqualTo(string.Empty)); + } + + [Test] + public void TextCodecEncodesInteger() + { + WotEncodeResult result = TextWotPayloadCodec.Instance.Encode( + new Variant(42), s_textPayload); + + Assert.That(result.Success, Is.True); + string decoded = Encoding.UTF8.GetString(result.Data.ToArray()); + Assert.That(decoded, Is.EqualTo("42")); + } + + [Test] + public void TextCodecDecodesUtf8BytesAsString() + { + byte[] data = Encoding.UTF8.GetBytes("hello"); + WotDecodeResult result = TextWotPayloadCodec.Instance.Decode(data, s_textPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo("hello")); + } + + [Test] + public void TextCodecDecodesEmptyBytesAsEmptyString() + { + WotDecodeResult result = TextWotPayloadCodec.Instance.Decode( + ReadOnlyMemory.Empty, s_textPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo(string.Empty)); + } + + [Test] + public void OctetStreamCodecEncodesByteString() + { + var bs = new ByteString(new byte[] { 1, 2, 3 }); + WotEncodeResult result = OctetStreamWotPayloadCodec.Instance.Encode( + new Variant(bs), s_octetPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Data.ToArray(), Is.EqualTo(new byte[] { 1, 2, 3 })); + } + + [Test] + public void OctetStreamCodecEncodesNullVariantAsEmpty() + { + WotEncodeResult result = OctetStreamWotPayloadCodec.Instance.Encode( + Variant.Null, s_octetPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Data.IsEmpty, Is.True); + } + + [Test] + public void OctetStreamCodecEncodeStringAsUtf8() + { + WotEncodeResult result = OctetStreamWotPayloadCodec.Instance.Encode( + new Variant("abc"), s_octetPayload); + + Assert.That(result.Success, Is.True); + Assert.That(Encoding.UTF8.GetString(result.Data.ToArray()), Is.EqualTo("abc")); + } + + [Test] + public void OctetStreamCodecDecodesAsByteString() + { + byte[] data = { 10, 20, 30 }; + WotDecodeResult result = OctetStreamWotPayloadCodec.Instance.Decode(data, s_octetPayload); + + Assert.That(result.Success, Is.True); + Assert.That(result.Value.TryGetValue(out ByteString bs), Is.True); + Assert.That(bs.IsNull, Is.False); + Assert.That(bs.Memory.ToArray(), Is.EqualTo(new byte[] { 10, 20, 30 })); + } + + [Test] + public void RegistryDefaultHasThreeBuiltInCodecs() + { + var registry = new WotPayloadCodecRegistry(); + + Assert.That(registry.TrySelect("application/json", out _), Is.True); + Assert.That(registry.TrySelect("text/plain", out _), Is.True); + Assert.That(registry.TrySelect("application/octet-stream", out _), Is.True); + } + + [Test] + public void RegistryTrySelectReturnsFalseForUnknownContentType() + { + var registry = new WotPayloadCodecRegistry(); + + bool found = registry.TrySelect("application/x-unknown-format-xyzzy", out IWotPayloadCodec codec); + + Assert.That(found, Is.False); + Assert.That(codec, Is.Not.Null); + } + + [Test] + public void RegistryCustomCodecWinsOverBuiltIn() + { + var registry = new WotPayloadCodecRegistry(); + var custom = new StubCodec("application/x-custom"); + registry.Register(custom); + + bool found = registry.TrySelect("application/x-custom", out IWotPayloadCodec selected); + + Assert.That(found, Is.True); + Assert.That(selected, Is.SameAs(custom)); + } + + [Test] + public void RegistryRegisterNullThrows() + { + var registry = new WotPayloadCodecRegistry(); + Assert.Throws(() => registry.Register(null!)); + } + + [Test] + public void RegistryTrySelectNullReturnsTrueWithJsonCodec() + { + var registry = new WotPayloadCodecRegistry(); + + bool found = registry.TrySelect(null, out IWotPayloadCodec codec); + + Assert.That(found, Is.True); + Assert.That(codec.Id, Is.EqualTo("json")); + } + + [Test] + public void WotEncodeResultOkCarriesData() + { + byte[] data = { 1, 2, 3 }; + WotEncodeResult result = WotEncodeResult.Ok(data); + + Assert.That(result.Success, Is.True); + Assert.That(result.Error, Is.Null); + Assert.That(result.Data.ToArray(), Is.EqualTo(data)); + } + + [Test] + public void WotEncodeResultFailCarriesError() + { + WotEncodeResult result = WotEncodeResult.Fail("something went wrong"); + + Assert.That(result.Success, Is.False); + Assert.That(result.Error, Is.EqualTo("something went wrong")); + Assert.That(result.Data.IsEmpty, Is.True); + } + + [Test] + public void WotDecodeResultOkCarriesValue() + { + WotDecodeResult result = WotDecodeResult.Ok(new Variant(99)); + + Assert.That(result.Success, Is.True); + Assert.That(result.Error, Is.Null); + Assert.That(result.Value.AsBoxedObject(), Is.EqualTo(99)); + } + + [Test] + public void WotDecodeResultFailCarriesError() + { + WotDecodeResult result = WotDecodeResult.Fail("decode failure"); + + Assert.That(result.Success, Is.False); + Assert.That(result.Error, Is.EqualTo("decode failure")); + Assert.That(result.Value.IsNull, Is.True); + } + + private sealed class StubCodec : IWotPayloadCodec + { + private readonly string m_contentType; + + public StubCodec(string contentType) + { + m_contentType = contentType; + } + + public string Id => "stub"; + + public bool CanHandle(string? contentType) + { + return string.Equals(contentType, m_contentType, StringComparison.OrdinalIgnoreCase); + } + + public WotEncodeResult Encode(Variant value, WotPayloadDescriptor payload) + { + return WotEncodeResult.Ok(Array.Empty()); + } + + public WotDecodeResult Decode(ReadOnlyMemory data, WotPayloadDescriptor payload) + { + return WotDecodeResult.Ok(Variant.Null); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/WotProtocolBinderBaseAdditionalTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/WotProtocolBinderBaseAdditionalTests.cs new file mode 100644 index 0000000000..e35239fa72 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/WotProtocolBinderBaseAdditionalTests.cs @@ -0,0 +1,243 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Immutable; +using System.Linq; +using System.Text.Json; +using NUnit.Framework; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Additional tests for helpers: + /// teardown-op suppression in ResolveOperations, capability deduplication, + /// unsupported-op warning, synthetic endpoint from MakeEndpointOrSynthetic, + /// unknown security-scheme warning from ResolveSecurity, and + /// href-too-long rejection from RequireHref. + /// + [TestFixture] + public sealed class WotProtocolBinderBaseAdditionalTests + { + private static WotBindingPlanContext DefaultContext() + { + return new WotBindingPlanContext(); + } + + private static WotAffordanceForm MakePropertyForm( + string formJson, + ImmutableArray ops = default, + ImmutableArray securitySchemes = default) + { + using var formDoc = JsonDocument.Parse(formJson); + JsonElement formElement = formDoc.RootElement.Clone(); + + string? href = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("href", out JsonElement hrefEl) && + hrefEl.ValueKind == JsonValueKind.String) + { + href = hrefEl.GetString(); + } + + ImmutableArray operations = ops.IsDefault + ? (ImmutableArray)["readproperty", "writeproperty"] + : ops; + + return new WotAffordanceForm( + WotAffordanceKind.Property, + "p", + operations, + href, + null, + null, + securitySchemes.IsDefault ? [] : securitySchemes, + "/properties/p/forms/0", + formElement, + default); + } + + private static WotAffordanceForm MakeEventForm( + string formJson, + ImmutableArray securitySchemes = default) + { + using var formDoc = JsonDocument.Parse(formJson); + JsonElement formElement = formDoc.RootElement.Clone(); + + string? href = null; + if (formElement.ValueKind == JsonValueKind.Object && + formElement.TryGetProperty("href", out JsonElement hrefEl) && + hrefEl.ValueKind == JsonValueKind.String) + { + href = hrefEl.GetString(); + } + + return new WotAffordanceForm( + WotAffordanceKind.Event, + "ev", + ["subscribeevent", "unsubscribeevent"], + href, + null, + null, + securitySchemes.IsDefault ? [] : securitySchemes, + "/events/ev/forms/0", + formElement, + default); + } + + [Test] + public void ResolveOperationsDropsUnsubscribeEventTeardownOpForMqttPlanner() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakeEventForm( + """{"href":"mqtt://broker.example.com/events/temp"}"""); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Has.Length.EqualTo(1)); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.SubscribeEvent)); + Assert.That(result.Entries.Any(e => e.OpToken == "unsubscribeevent"), Is.False); + } + + [Test] + public void ResolveOperationsDropsUnobservePropertyTeardownOpForMqttPlanner() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com/sensors/temp"}""", + ops: ["observeproperty", "unobserveproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Has.Length.EqualTo(1)); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.ObserveProperty)); + Assert.That(result.Entries.Any(e => e.OpToken == "unobserveproperty"), Is.False); + } + + [Test] + public void ResolveOperationsDeduplicatesDuplicateCapabilityForHttpPlanner() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"http://example.com/p"}""", + ops: ["readproperty", "readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Has.Length.EqualTo(1)); + Assert.That(result.Entries[0].Operation, Is.EqualTo(WoTBindingCapabilityEnum.ReadProperty)); + } + + [Test] + public void ResolveOperationsEmitsUnsupportedOpWarningForProfinetWithObserveProperty() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"pnv:slot":0,"pnv:subslot":0,"pnv:index":0}""", + ops: ["readproperty", "observeproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries, Has.Length.EqualTo(1)); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.UnsupportedOperation && + d.Severity == WotDiagnosticSeverity.Warning), Is.True); + } + + [Test] + public void ResolvesSecurityEmitsWarningForUnknownSchemeInHttpPlanner() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"http://example.com/p","op":"readproperty"}""", + ops: ["readproperty"], + securitySchemes: ["myCustomScheme"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.UnknownSecurityScheme && + d.Severity == WotDiagnosticSeverity.Warning), Is.True); + } + + [Test] + public void ResolvesSecurityEmitsWarningForUnknownSchemeInMqttPlanner() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"mqtt://broker.example.com/sensors/temp","op":"readproperty"}""", + ops: ["readproperty"], + securitySchemes: ["bearer_sc"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.UnknownSecurityScheme && + d.Severity == WotDiagnosticSeverity.Warning), Is.True); + } + + [Test] + public void ResolvesSecurityNosecSchemeDoesNotEmitWarning() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = MakePropertyForm( + """{"href":"http://example.com/p","op":"readproperty"}""", + ops: ["readproperty"], + securitySchemes: ["nosec_sc"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.UnknownSecurityScheme), Is.False); + } + + [Test] + public void RequireHrefRejectsHrefExceedingMaxUriLength() + { + var planner = new HttpBindingPlanner(); + string longHref = "http://example.com/" + new string('a', 2048); + WotAffordanceForm form = MakePropertyForm( + "{\"href\":\"" + longHref + "\",\"op\":\"readproperty\"}", + ops: ["readproperty"]); + + WotBindingCompilation result = planner.Compile(form, DefaultContext()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.HasErrors, Is.True); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Bindings.Tests/WotProtocolBinderRegistryTests.cs b/tests/Opc.Ua.WotCon.Bindings.Tests/WotProtocolBinderRegistryTests.cs new file mode 100644 index 0000000000..cdde65fb6d --- /dev/null +++ b/tests/Opc.Ua.WotCon.Bindings.Tests/WotProtocolBinderRegistryTests.cs @@ -0,0 +1,332 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings.Http; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Bindings.Tests +{ + /// + /// Unit tests for : plan preparation, + /// target-mapping validation, activate / deactivate lifecycle and executor + /// resolution. + /// + [TestFixture] + public sealed class WotProtocolBinderRegistryTests + { + private static WotBindingPlanRequest HttpRequest(string propertiesJson) + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"title\":\"T\",\"properties\":{\"p\":{" + propertiesJson + "}}}"; + return WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td)); + } + + [Test] + public void PrepareWithNullRequestThrows() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + Assert.Throws(() => registry.Prepare(null!)); + } + + [Test] + public void PrepareWithNoFormsReturnsEmptyPlan() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var request = new WotBindingPlanRequest("xid", WoTDocumentKindEnum.ThingDescription, []); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.CompiledForms.IsEmpty, Is.True); + Assert.That(plan.UnsupportedForms.IsEmpty, Is.True); + } + + [Test] + public void PrepareWithNoMatchingBinderYieldsUnsupportedForm() + { + var registry = new WotProtocolBinderRegistry([]); + WotBindingPlanRequest request = HttpRequest( + "\"type\":\"number\",\"forms\":[{\"href\":\"http://example.com/p\"}]"); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + + [Test] + public void PrepareWithNoExecutorProducesNonExecutableForm() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + WotBindingPlanRequest request = HttpRequest( + "\"type\":\"number\",\"forms\":[{\"href\":\"http://example.com/p\"}]"); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms.All(f => !f.IsExecutable), Is.True); + Assert.That(plan.HasNonExecutableForms, Is.True); + } + + [Test] + public void PrepareTargetMappingAuthoredOnFormIsRejected() + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"properties\":{\"p\":{\"type\":\"number\",\"forms\":[{" + + "\"href\":\"http://example.com/p\",\"uav:mapToNodeId\":\"ns=2;i=1\"}]}}}"; + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var request = WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td)); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.TargetMappingAuthoredOnForm), Is.True); + } + + [Test] + public void PrepareTargetMappingOnActionAffordanceIsRejected() + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"actions\":{\"reset\":{\"uav:mapToNodeId\":\"ns=2;i=1\"," + + "\"forms\":[{\"href\":\"http://example.com/reset\"}]}}}"; + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var request = WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td)); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.TargetMappingNotOnProperty), Is.True); + } + + [Test] + public void PrepareTargetMappingFieldPathWithoutTypeIsRejected() + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"properties\":{\"p\":{\"uav:mapByFieldPath\":\"Value.Temperature\"," + + "\"forms\":[{\"href\":\"http://example.com/p\"}]}}}"; + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var request = WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td)); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.TargetMappingFieldPathRequiresType), Is.True); + } + + [Test] + public void PrepareValidTargetMappingIsAccepted() + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"properties\":{\"p\":{\"uav:mapToNodeId\":\"ns=2;i=1000\"," + + "\"uav:mapToType\":\"ns=1;i=5003\",\"uav:mapByFieldPath\":\"Body.Value\"," + + "\"forms\":[{\"href\":\"http://example.com/p\"}]}}}"; + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var request = WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td)); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.TargetMappingFieldPathRequiresType || + d.Code == WotBindingDiagnosticCode.TargetMappingAuthoredOnForm), Is.False); + } + + [Test] + public async Task ActivateAndDeactivateTracksActivePlan() + { + var registry = new WotProtocolBinderRegistry([]); + var plan = WotBindingPlan.Empty; + + await registry.ActivateAsync(plan).ConfigureAwait(false); + Assert.That(registry.IsActive(plan.ResourceXid), Is.True); + + await registry.DeactivateAsync(plan).ConfigureAwait(false); + Assert.That(registry.IsActive(plan.ResourceXid), Is.False); + } + + [Test] + public async Task ActivateNullThrows() + { + var registry = new WotProtocolBinderRegistry([]); + await Task.CompletedTask.ConfigureAwait(false); + Assert.ThrowsAsync( + async () => await registry.ActivateAsync(null!).ConfigureAwait(false)); + } + + [Test] + public async Task DeactivateNullThrows() + { + var registry = new WotProtocolBinderRegistry([]); + await Task.CompletedTask.ConfigureAwait(false); + Assert.ThrowsAsync( + async () => await registry.DeactivateAsync(null!).ConfigureAwait(false)); + } + + [Test] + public void TryGetExecutorReturnsFalseWhenNoneRegistered() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var identity = new HttpBindingPlanner().Identity; + + bool found = registry.TryGetExecutor(identity, out _); + + Assert.That(found, Is.False); + } + + [Test] + public void TryGetExecutorNullIdentityThrows() + { + var registry = new WotProtocolBinderRegistry([]); + Assert.Throws(() => registry.TryGetExecutor(null!, out _)); + } + + [Test] + public void OpenChannelAsyncWithoutExecutorThrows() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var form = new WotCompiledForm( + new WotBindingIdentity("w3c.http", "1.1", "urn:x"), + WotAffordanceKind.Property, "p", "/properties/p/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("http", "h", 80, "http://h"), + new WotAddressingDescriptor("path"), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ReadProperty, "readproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], isExecutable: false); + + Assert.ThrowsAsync( + async () => await registry.OpenChannelAsync(form).ConfigureAwait(false)); + } + + [Test] + public void OpenChannelAsyncWithNullFormThrows() + { + var registry = new WotProtocolBinderRegistry([]); + Assert.ThrowsAsync( + async () => await registry.OpenChannelAsync(null!).ConfigureAwait(false)); + } + + [Test] + public void RegistryConstructorIgnoresNullBinders() + { + var registry = new WotProtocolBinderRegistry( + new IWotProtocolBinder[] { null!, new HttpBindingPlanner() }); + + Assert.That(registry.Binders, Has.Count.EqualTo(1)); + } + + [Test] + public void RegistryConstructorDeduplicatesSameIdAndVersion() + { + var registry = new WotProtocolBinderRegistry( + [new HttpBindingPlanner(), new HttpBindingPlanner()]); + + Assert.That(registry.Binders, Has.Count.EqualTo(1)); + } + + [Test] + public void RegistryBindersAreInDeterministicOrdinalOrder() + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + + var keys = registry.Binders.Select(b => b.Identity.Key).ToList(); + var sorted = keys.OrderBy(k => k, StringComparer.Ordinal).ToList(); + Assert.That(keys, Is.EqualTo(sorted)); + } + + [Test] + public void RegistryCapabilitiesArePopulated() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + Assert.That(registry.Capabilities, Has.Count.EqualTo(1)); + } + + [Test] + public void RegistryConstructorNullBindersThrows() + { + Assert.Throws(() => new WotProtocolBinderRegistry(null!)); + } + + [Test] + public void PrepareFullySupported() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + WotBindingPlanRequest request = HttpRequest( + "\"type\":\"number\",\"forms\":[{\"href\":\"http://example.com/p\"}]"); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.FullySupported, Is.True); + } + + [Test] + public void PrepareResourceXidIsPreservedInPlan() + { + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + WotBindingPlanRequest request = HttpRequest( + "\"type\":\"number\",\"forms\":[{\"href\":\"http://example.com/p\"}]"); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.ResourceXid, Is.EqualTo("xid")); + } + + [Test] + public void PrepareTargetMappingPresentOnEventAffordanceIsRejected() + { + string td = + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"T\"," + + "\"events\":{\"alarm\":{\"uav:mapToNodeId\":\"ns=2;i=1\"," + + "\"forms\":[{\"href\":\"http://example.com/alarm\"}]}}}"; + var registry = new WotProtocolBinderRegistry([new HttpBindingPlanner()]); + var request = WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td)); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.TargetMappingNotOnProperty), Is.True); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Samples.Tests/AggregationStartupTests.cs b/tests/Opc.Ua.WotCon.Samples.Tests/AggregationStartupTests.cs new file mode 100644 index 0000000000..26fbeb9f96 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Samples.Tests/AggregationStartupTests.cs @@ -0,0 +1,130 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml.Linq; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using AggregationServer; + +namespace Opc.Ua.WotCon.Samples.Tests +{ + [TestFixture] + [Category("WotCon")] + [Category("Samples")] + public sealed class AggregationStartupTests + { + [Test] + public void SampleTargetsOnlyExecutableAggregationFrameworks() + { + XDocument server = LoadProject("AggregationServer"); + Assert.That( + ReadProperty(server, "TargetFrameworks", "'$(CustomTestTarget)' == ''"), + Is.EqualTo("net8.0;net9.0;net10.0")); + Assert.That( + ReadProperty(server, "RestrictForLegacyTfm", null), + Is.EqualTo("true")); + + Assert.That( + ReadProperty(LoadProject("AggregationClient"), "TargetFrameworks", null), + Is.EqualTo("$(AppTargetFrameworks)")); + Assert.That( + ReadProperty(LoadProject("FlatTagServer"), "TargetFrameworks", null), + Is.EqualTo("$(AppTargetFrameworks)")); + } + + [Test] + public void AggregationHostRegistersOpcUaExecutor() + { + using IHost host = AggregationServerHost.Build( + new AggregationServerOptions + { + EndpointUrl = "opc.tcp://127.0.0.1:62550/AggregationServerStartupTest", + ApplicationName = "AggregationServerStartupTest" + }); + var executorIds = new List(); + foreach (IWotBindingExecutor executor + in host.Services.GetServices()) + { + executorIds.Add(executor.Identity.Id); + } + + Assert.That( + executorIds, + Does.Contain("opc.opcua"), + "The documented OPC UA mappings must have a runtime executor."); + } + + private static XDocument LoadProject(string projectName) + { + return XDocument.Load( + Path.Combine( + FindRepositoryRoot(), + "samples", + "WotCon", + projectName, + projectName + ".csproj")); + } + + private static string ReadProperty( + XDocument project, + string propertyName, + string? condition) + { + foreach (XElement property in project.Descendants(propertyName)) + { + string? actualCondition = property.Attribute("Condition")?.Value; + if (string.Equals(actualCondition, condition, StringComparison.Ordinal)) + { + return property.Value; + } + } + throw new AssertionException( + $"Property '{propertyName}' with condition '{condition}' was not found."); + } + + private static string FindRepositoryRoot() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory is not null) + { + if (File.Exists(Path.Combine(directory.FullName, "UA.slnx"))) + { + return directory.FullName; + } + directory = directory.Parent; + } + throw new DirectoryNotFoundException("The repository root was not found."); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Samples.Tests/Opc.Ua.WotCon.Samples.Tests.csproj b/tests/Opc.Ua.WotCon.Samples.Tests/Opc.Ua.WotCon.Samples.Tests.csproj new file mode 100644 index 0000000000..e22ced2957 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Samples.Tests/Opc.Ua.WotCon.Samples.Tests.csproj @@ -0,0 +1,32 @@ + + + net10.0 + true + Opc.Ua.WotCon.Samples.Tests + enable + false + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/tests/Opc.Ua.WotCon.Samples.Tests/Properties/AssemblyInfo.cs b/tests/Opc.Ua.WotCon.Samples.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..7798c9bd57 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Samples.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/tests/Opc.Ua.WotCon.Samples.Tests/TestPorts.cs b/tests/Opc.Ua.WotCon.Samples.Tests/TestPorts.cs new file mode 100644 index 0000000000..2441de79e0 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Samples.Tests/TestPorts.cs @@ -0,0 +1,62 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; + +namespace Opc.Ua.WotCon.Samples.Tests +{ + internal static class TestPorts + { + public static int GetFreePort() + { + using var listener = new TcpListener(IPAddress.Loopback, 0); + listener.Start(); + try + { + return ((IPEndPoint)listener.LocalEndpoint).Port; + } + finally + { + listener.Stop(); + } + } + + public static int[] GetFreePorts(int count) + { + var ports = new HashSet(); + while (ports.Count < count) + { + ports.Add(GetFreePort()); + } + return [.. ports]; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEndToEndTests.cs b/tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEndToEndTests.cs new file mode 100644 index 0000000000..82c0220cc6 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEndToEndTests.cs @@ -0,0 +1,761 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text; +using System.Text.Json.Nodes; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Client; +using AggregationClient; + +namespace Opc.Ua.WotCon.Samples.Tests +{ + [TestFixture] + [Category("WotCon")] + [Category("Integration")] + [Category("Samples")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + [NonParallelizable] + public sealed class WotSampleEndToEndTests + { + private const string kPumpNamespaceUri = + "urn:opcfoundation.org:UA:WotAggregation:PumpInstance"; + + private const string kPumpsNamespaceUri = "http://opcfoundation.org/UA/Pumps/"; + private const string kDiNamespaceUri = "http://opcfoundation.org/UA/DI/"; + + [Test] + public async Task RealSamplesAggregateSubscribeAndReplaceGenerationAsync() + { + using var timeout = new CancellationTokenSource(TimeSpan.FromMinutes(8)); + WotSampleEnvironment environment = await WotSampleEnvironment + .StartAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable environmentLifetime = environment.ConfigureAwait(false); + + AggregationClientResult result = await AggregationClientRunner + .RunAsync(environment.ClientOptions, timeout.Token) + .ConfigureAwait(false); + + Assert.That(result.LoadResult.Uploaded, Has.Count.EqualTo(4)); + var uploadedResourceIds = new List(); + foreach (WotRegistryDocumentLoadOutcome upload in result.LoadResult.Uploaded) + { + uploadedResourceIds.Add(upload.Document.ResourceId); + } + Assert.That(uploadedResourceIds, Is.EqualTo(s_expectedResourceIds)); + WotRegistryRefreshResult firstRefresh = result.LoadResult.Refresh ?? + throw new InvalidOperationException("The real loader did not run Refresh."); + Assert.That(firstRefresh.HasFailures, Is.False, FormatRefresh(firstRefresh)); + bool pumpActive = false; + foreach (WoTResourceLoadResultDataType load in firstRefresh.Results) + { + pumpActive |= + load.ResourceId == "sample-pump" && + load.LoadState == WoTLoadStateEnum.Active; + } + Assert.That(pumpActive, Is.True); + Assert.That(result.Values, Has.Count.EqualTo(10)); + AssertResultDouble( + result, + "DifferentialPressure", + environment.SourceAValues.DifferentialPressure); + AssertResultDouble(result, "FluidTemperature", environment.SourceAValues.FluidTemperature); + AssertResultDouble(result, "MassFlow", environment.SourceAValues.MassFlow); + AssertResultDouble(result, "Level", environment.SourceAValues.Level); + AssertResultBoolean(result, "Cavitation", environment.SourceAValues.Cavitation); + AssertResultDouble( + result, + "BearingTemperature", + environment.SourceBValues.BearingTemperature); + AssertResultDouble(result, "PumpPowerInput", environment.SourceBValues.PumpPowerInput); + AssertResultDouble(result, "PumpEfficiency", environment.SourceBValues.PumpEfficiency); + AssertResultUInt32(result, "NumberOfStarts", environment.SourceBValues.NumberOfStarts); + AssertResultBoolean(result, "MotorOverheat", environment.SourceBValues.MotorOverheat); + + WotClientConnection connection = await environment + .ConnectAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable connectionLifetime = connection.ConfigureAwait(false); + ManagedSession session = connection.Session; + int pumpNamespaceIndex = session.NamespaceUris.GetIndex(kPumpNamespaceUri); + Assert.That(pumpNamespaceIndex, Is.GreaterThan(0), "The Pump namespace must exist."); + ushort pumpNs = checked((ushort)pumpNamespaceIndex); + var pumpNodeId = new NodeId("Pump1", pumpNs); + var operationalNodeId = new NodeId("Pump1.Operational", pumpNs); + var measurementsNodeId = new NodeId("Pump1.Operational.Measurements", pumpNs); + var eventsNodeId = new NodeId("Pump1.Events", pumpNs); + var processFluidNodeId = new NodeId("Pump1.Events.SupervisionProcessFluid", pumpNs); + var pumpOperationNodeId = new NodeId("Pump1.Events.SupervisionPumpOperation", pumpNs); + var differentialPressureNodeId = new NodeId( + "Pump1.Operational.Measurements.DifferentialPressure", + pumpNs); + + await AssertPumpHierarchyAsync( + session, + pumpNodeId, + operationalNodeId, + measurementsNodeId, + eventsNodeId, + processFluidNodeId, + pumpOperationNodeId, + timeout.Token).ConfigureAwait(false); + + WotClientConnection subscriptionConnection = await environment + .ConnectAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable subscriptionConnectionLifetime = + subscriptionConnection.ConfigureAwait(false); + ManagedSession subscriptionSession = subscriptionConnection.Session; + CreateSubscriptionResponse createSubscription = + await subscriptionSession.CreateSubscriptionAsync( + null, + 100, + 1000, + 10, + 0, + true, + 0, + timeout.Token).ConfigureAwait(false); + uint subscriptionId = createSubscription.SubscriptionId; + var request = new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = differentialPressureNodeId, + AttributeId = Attributes.Value + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = 1, + SamplingInterval = 50, + QueueSize = 10, + DiscardOldest = true + } + }; + CreateMonitoredItemsResponse createItem = + await subscriptionSession.CreateMonitoredItemsAsync( + null, + subscriptionId, + TimestampsToReturn.Both, + new MonitoredItemCreateRequest[] { request }.ToArrayOf(), + timeout.Token).ConfigureAwait(false); + Assert.That(createItem.Results, Has.Count.EqualTo(1)); + Assert.That(createItem.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + uint monitoredItemId = createItem.Results[0].MonitoredItemId; + (DataValue initial, ArrayOf acknowledgements) = + await PublishDataChangeAsync( + subscriptionSession, + [], + TimeSpan.FromSeconds(15), + timeout.Token).ConfigureAwait(false); + Assert.That(initial.StatusCode, Is.EqualTo(StatusCodes.Good)); + AssertDataValue(initial, environment.SourceAValues.DifferentialPressure); + using var retiredPublishLifetime = + CancellationTokenSource.CreateLinkedTokenSource(timeout.Token); + // CA2025 cannot see that the finally block cancels and awaits this task before + // the subscription connection is disposed. TODO: Remove when flow analysis supports it. +#pragma warning disable CA2025 + Task<(DataValue Value, ArrayOf Acknowledgements)> + retiredGenerationPublish = PublishDataChangeAsync( + subscriptionSession, + acknowledgements, + TimeSpan.FromMinutes(4), + retiredPublishLifetime.Token); +#pragma warning restore CA2025 + + try + { + string changedPump = CreateChangedPumpDocument(environment); + (WotRegistryGroupClient group, _) = await connection.Registry + .GetOrCreateThingDescriptionGroupAsync(timeout.Token) + .ConfigureAwait(false); + (WotRegistryResourceClient pumpResource, _, _) = await group + .GetOrCreateResourceAsync("sample-pump", string.Empty, timeout.Token) + .ConfigureAwait(false); + await pumpResource.UploadNewVersionAsync( + ByteString.From(Encoding.UTF8.GetBytes(changedPump)), + ct: timeout.Token).ConfigureAwait(false); + + WotRegistryRefreshResult secondRefresh = await connection.Registry + .RefreshAllAsync( + requestId: "sample-pump-replacement", + ct: timeout.Token).ConfigureAwait(false); + if (secondRefresh.HasFailures) + { + Assert.Fail(FormatRefresh(secondRefresh)); + } + Assert.That(secondRefresh.NewGeneration, Is.GreaterThan(firstRefresh.NewGeneration)); + + DataValue replacement = await ReadValueAsync( + session, + differentialPressureNodeId, + timeout.Token).ConfigureAwait(false); + Assert.That(replacement.StatusCode, Is.EqualTo(StatusCodes.Good)); + AssertDataValue(replacement, environment.SourceBValues.BearingTemperature); + + ArrayOf monitoredItemIds = [monitoredItemId]; + SetMonitoringModeResponse disabled = await subscriptionSession + .SetMonitoringModeAsync( + null, + subscriptionId, + MonitoringMode.Disabled, + monitoredItemIds, + timeout.Token).ConfigureAwait(false); + Assert.That(disabled.Results[0], Is.EqualTo(StatusCodes.Good)); + SetMonitoringModeResponse reporting = await subscriptionSession + .SetMonitoringModeAsync( + null, + subscriptionId, + MonitoringMode.Reporting, + monitoredItemIds, + timeout.Token).ConfigureAwait(false); + Assert.That(reporting.Results[0], Is.EqualTo(StatusCodes.Good)); + (DataValue retiredGenerationNotification, _) = + await retiredGenerationPublish.ConfigureAwait(false); + Assert.That(retiredGenerationNotification.StatusCode, Is.EqualTo(StatusCodes.Good)); + AssertDataValue( + retiredGenerationNotification, + environment.SourceAValues.DifferentialPressure); + } + finally + { + retiredPublishLifetime.Cancel(); + try + { + _ = await retiredGenerationPublish.ConfigureAwait(false); + } + catch (OperationCanceledException) when (retiredPublishLifetime.IsCancellationRequested) + { + } + catch (ServiceResultException ex) + when (retiredPublishLifetime.IsCancellationRequested && + ex.StatusCode == StatusCodes.BadRequestInterrupted) + { + } + DeleteSubscriptionsResponse deleted = await subscriptionSession + .DeleteSubscriptionsAsync( + null, + new uint[] { subscriptionId }.ToArrayOf(), + CancellationToken.None).ConfigureAwait(false); + Assert.That( + deleted.Results[0], + Is.EqualTo(StatusCodes.Good).Or.EqualTo(StatusCodes.BadSubscriptionIdInvalid)); + } + + DataValue afterDrain = await ReadValueAsync( + session, + differentialPressureNodeId, + timeout.Token).ConfigureAwait(false); + Assert.That(afterDrain.StatusCode, Is.EqualTo(StatusCodes.Good)); + AssertDataValue(afterDrain, environment.SourceBValues.BearingTemperature); + } + + [Test] + public async Task InvalidDocumentFailsThroughRealLoaderAsync() + { + using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(45)); + WotSampleEnvironment environment = await WotSampleEnvironment + .StartAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable environmentLifetime = environment.ConfigureAwait(false); + string documents = environment.CreateDocumentsCopy(); + await File.WriteAllTextAsync( + Path.Combine(documents, "invalid.td.json"), + "{not-json", + timeout.Token).ConfigureAwait(false); + await File.WriteAllTextAsync( + Path.Combine(documents, "documents.json"), + /*lang=json,strict*/ + """ + [{ + "dependsOn": [], + "documentKind": "ThingDescription", + "groupId": "thingdescriptions", + "path": "invalid.td.json", + "resourceId": "invalid" + }] + """, + timeout.Token).ConfigureAwait(false); + + Exception failure = await CaptureFailureAsync( + () => AggregationClientRunner.RunAsync( + environment.CreateClientOptions(documents), + timeout.Token)).ConfigureAwait(false); + + Assert.That(failure, Is.TypeOf()); + } + + [Test] + public async Task MissingManifestDependencyFailsBeforeUploadAsync() + { + using var timeout = new CancellationTokenSource(TimeSpan.FromSeconds(45)); + WotSampleEnvironment environment = await WotSampleEnvironment + .StartAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable environmentLifetime = environment.ConfigureAwait(false); + string documents = environment.CreateDocumentsCopy(); + await File.WriteAllTextAsync( + Path.Combine(documents, "documents.json"), + /*lang=json,strict*/ + """ + [{ + "dependsOn": ["not-present"], + "documentKind": "ThingModel", + "groupId": "thingmodels", + "path": "Opc.Ua.Di.tm.json", + "resourceId": "opc-ua-di" + }] + """, + timeout.Token).ConfigureAwait(false); + + Exception failure = await CaptureFailureAsync( + () => AggregationClientRunner.RunAsync( + environment.CreateClientOptions(documents), + timeout.Token)).ConfigureAwait(false); + + Assert.That(failure, Is.TypeOf()); + Assert.That(failure.Message, Does.Contain("missing or cyclic dependency")); + } + + [Test] + public async Task BadTargetMappingFailsRefreshAsync() + { + using var timeout = new CancellationTokenSource(TimeSpan.FromMinutes(4)); + WotSampleEnvironment environment = await WotSampleEnvironment + .StartAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable environmentLifetime = environment.ConfigureAwait(false); + string documents = environment.CreateDocumentsCopy(); + string pumpPath = Path.Combine(documents, "SamplePump.td.json"); + string pump = await File.ReadAllTextAsync(pumpPath, timeout.Token).ConfigureAwait(false); + pump = pump.Replace( + "nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;" + + "s=Pump1.Operational.Measurements.DifferentialPressure", + "nsu=urn:opcfoundation.org:UA:WotAggregation:PumpInstance;" + + "s=Pump1.Missing.DifferentialPressure", + StringComparison.Ordinal); + await File.WriteAllTextAsync(pumpPath, pump, timeout.Token).ConfigureAwait(false); + + Exception failure = await CaptureFailureAsync( + () => AggregationClientRunner.RunAsync( + environment.CreateClientOptions(documents), + timeout.Token)).ConfigureAwait(false); + + Assert.That(failure, Is.TypeOf()); + } + + [Test] + public async Task UnavailableUpstreamEndpointFailsMappedReadAsync() + { + using var timeout = new CancellationTokenSource(TimeSpan.FromMinutes(4)); + WotSampleEnvironment environment = await WotSampleEnvironment + .StartAsync(timeout.Token).ConfigureAwait(false); + await using ConfiguredAsyncDisposable environmentLifetime = environment.ConfigureAwait(false); + string unavailableEndpoint = + $"opc.tcp://127.0.0.1:{TestPorts.GetFreePort()}/UnavailableSource"; + + Exception failure = await CaptureFailureAsync( + () => AggregationClientRunner.RunAsync( + environment.CreateClientOptions( + environment.DocumentsDirectory, + sourceAEndpoint: unavailableEndpoint), + timeout.Token)).ConfigureAwait(false); + + Assert.That(failure, Is.TypeOf()); + } + + private static async Task AssertPumpHierarchyAsync( + ISession session, + NodeId pumpNodeId, + NodeId operationalNodeId, + NodeId measurementsNodeId, + NodeId eventsNodeId, + NodeId processFluidNodeId, + NodeId pumpOperationNodeId, + CancellationToken cancellationToken) + { + ushort pumpsNs = ResolveNamespace(session, kPumpsNamespaceUri); + ushort diNs = ResolveNamespace(session, kDiNamespaceUri); + await AssertTypeDefinitionAsync( + session, + pumpNodeId, + new NodeId(1052u, pumpsNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + new NodeId("Pump1.Identification", pumpNodeId.NamespaceIndex), + new NodeId(1005u, diNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + operationalNodeId, + new NodeId(1053u, pumpsNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + measurementsNodeId, + new NodeId(1054u, pumpsNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + eventsNodeId, + new NodeId(1019u, pumpsNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + processFluidNodeId, + new NodeId(1015u, pumpsNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + pumpOperationNodeId, + new NodeId(1016u, pumpsNs), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + new NodeId( + "Pump1.Events.SupervisionProcessFluid.Cavitation", + pumpNodeId.NamespaceIndex), + new NodeId(2373u), + cancellationToken).ConfigureAwait(false); + await AssertTypeDefinitionAsync( + session, + new NodeId( + "Pump1.Events.SupervisionPumpOperation.MotorOverheat", + pumpNodeId.NamespaceIndex), + new NodeId(2373u), + cancellationToken).ConfigureAwait(false); + + await AssertChildrenAsync( + session, + pumpNodeId, + cancellationToken, + "Identification", + "Operational", + "Events", + "Maintenance").ConfigureAwait(false); + await AssertChildrenAsync( + session, + operationalNodeId, + cancellationToken, + "Measurements").ConfigureAwait(false); + await AssertChildrenAsync( + session, + measurementsNodeId, + cancellationToken, + "DifferentialPressure", + "FluidTemperature", + "BearingTemperature", + "PumpPowerInput", + "MassFlow", + "PumpEfficiency", + "Level", + "NumberOfStarts").ConfigureAwait(false); + await AssertChildrenAsync( + session, + eventsNodeId, + cancellationToken, + "SupervisionProcessFluid", + "SupervisionPumpOperation").ConfigureAwait(false); + await AssertChildrenAsync( + session, + processFluidNodeId, + cancellationToken, + "Cavitation").ConfigureAwait(false); + await AssertChildrenAsync( + session, + pumpOperationNodeId, + cancellationToken, + "MotorOverheat").ConfigureAwait(false); + } + + private static async Task AssertTypeDefinitionAsync( + ISession session, + NodeId nodeId, + NodeId expectedTypeDefinition, + CancellationToken cancellationToken) + { + (_, _, ArrayOf references) = await session.BrowseAsync( + requestHeader: null, + view: null, + nodeId, + maxResultsToReturn: 1, + BrowseDirection.Forward, + Ua.ReferenceTypeIds.HasTypeDefinition, + includeSubtypes: false, + (uint)NodeClass.ObjectType | (uint)NodeClass.VariableType, + cancellationToken).ConfigureAwait(false); + Assert.That(references, Has.Count.EqualTo(1), $"{nodeId} must have a TypeDefinition."); + var actual = ExpandedNodeId.ToNodeId(references[0].NodeId, session.NamespaceUris); + Assert.That(actual, Is.EqualTo(expectedTypeDefinition), $"Unexpected TypeDefinition for {nodeId}."); + } + + private static async Task AssertChildrenAsync( + ISession session, + NodeId nodeId, + CancellationToken cancellationToken, + params string[] expectedNames) + { + (_, _, ArrayOf references) = await session.BrowseAsync( + requestHeader: null, + view: null, + nodeId, + maxResultsToReturn: 0, + BrowseDirection.Forward, + Ua.ReferenceTypeIds.HierarchicalReferences, + includeSubtypes: true, + (uint)NodeClass.Object | (uint)NodeClass.Variable, + cancellationToken).ConfigureAwait(false); + var names = new HashSet(StringComparer.Ordinal); + foreach (ReferenceDescription reference in references) + { + if (reference.BrowseName.Name is string name) + { + names.Add(name); + } + } + foreach (string expectedName in expectedNames) + { + Assert.That(names, Does.Contain(expectedName), $"{nodeId} is missing {expectedName}."); + } + } + + private static async Task ReadValueAsync( + ManagedSession session, + NodeId nodeId, + CancellationToken cancellationToken) + { + ArrayOf nodesToRead = + [ + new ReadValueId + { + NodeId = nodeId, + AttributeId = Attributes.Value + } + ]; + ReadResponse response = await session.ReadAsync( + null, + 0, + TimestampsToReturn.Both, + nodesToRead, + cancellationToken).ConfigureAwait(false); + return response.Results[0]; + } + + private static async Task<( + DataValue Value, + ArrayOf Acknowledgements)> PublishDataChangeAsync( + ManagedSession session, + ArrayOf acknowledgements, + TimeSpan timeout, + CancellationToken cancellationToken) + { + using var publishTimeout = + CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); + publishTimeout.CancelAfter(timeout); + try + { + while (true) + { + PublishResponse response = await session.PublishAsync( + null, + acknowledgements, + publishTimeout.Token).ConfigureAwait(false); + uint sequenceNumber = response.NotificationMessage.SequenceNumber; + if (sequenceNumber != 0) + { + acknowledgements = + [ + new SubscriptionAcknowledgement + { + SubscriptionId = response.SubscriptionId, + SequenceNumber = sequenceNumber + } + ]; + } + foreach (ExtensionObject notificationData + in response.NotificationMessage.NotificationData) + { + if (ExtensionObject.ToEncodeable(notificationData) is not DataChangeNotification dataChange) + { + continue; + } + foreach (MonitoredItemNotification notification in dataChange.MonitoredItems) + { + if (notification.ClientHandle == 1) + { + if (notification.Value.StatusCode == + StatusCodes.BadWaitingForInitialData) + { + continue; + } + return (notification.Value, acknowledgements); + } + } + } + } + } + catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) + { + throw new AssertionException("Timed out waiting for a mapped value notification."); + } + } + + private static void AssertResultDouble( + AggregationClientResult result, + string name, + double expected) + { + WotPumpValueResult value = FindResultValue(result, name); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good), name); + Assert.That(value.Value.TryGetValue(out double actual), Is.True, name); + Assert.That(actual, Is.EqualTo(expected), name); + } + + private static void AssertResultBoolean( + AggregationClientResult result, + string name, + bool expected) + { + WotPumpValueResult value = FindResultValue(result, name); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good), name); + Assert.That(value.Value.TryGetValue(out bool actual), Is.True, name); + Assert.That(actual, Is.EqualTo(expected)); + } + + private static void AssertResultUInt32( + AggregationClientResult result, + string name, + uint expected) + { + WotPumpValueResult value = FindResultValue(result, name); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.Good), name); + Assert.That(value.Value.TryGetValue(out uint actual), Is.True, name); + Assert.That(actual, Is.EqualTo(expected)); + } + + private static WotPumpValueResult FindResultValue( + AggregationClientResult result, + string name) + { + foreach (WotPumpValueResult candidate in result.Values) + { + if (candidate.Name == name) + { + return candidate; + } + } + throw new AssertionException($"The loader did not return '{name}'."); + } + + private static void AssertDataValue(DataValue value, double expected) + { + Assert.That(value.WrappedValue.TryGetValue(out double actual), Is.True); + Assert.That(actual, Is.EqualTo(expected)); + } + + private static string CreateChangedPumpDocument(WotSampleEnvironment environment) + { + string path = Path.Combine(environment.DocumentsDirectory, "SamplePump.td.json"); + JsonObject root = JsonNode.Parse(File.ReadAllText(path))?.AsObject() ?? + throw new InvalidDataException("SamplePump.td.json is empty."); + JsonObject properties = root["properties"]?.AsObject() ?? + throw new InvalidDataException("The Pump properties are missing."); + JsonObject differentialPressure = properties["DifferentialPressure"]?.AsObject() ?? + throw new InvalidDataException("DifferentialPressure is missing."); + JsonArray forms = differentialPressure["forms"]?.AsArray() ?? + throw new InvalidDataException("DifferentialPressure forms are missing."); + JsonObject form = forms[0]?.AsObject() ?? + throw new InvalidDataException("DifferentialPressure form is missing."); + form["href"] = environment.ClientOptions.SourceBEndpoint; + form["uav:id"] = + "nsu=urn:opcfoundation.org:UA:WotAggregation:SourceB;" + + "s=Pump1.Operational.Measurements.BearingTemperature"; + + string content = root.ToJsonString(); + return content + .Replace( + "${SOURCE_A_ENDPOINT}", + environment.ClientOptions.SourceAEndpoint, + StringComparison.Ordinal) + .Replace( + "${SOURCE_B_ENDPOINT}", + environment.ClientOptions.SourceBEndpoint, + StringComparison.Ordinal); + } + + private static async Task CaptureFailureAsync( + Func> action) + { + try + { + _ = await action().ConfigureAwait(false); + } + catch (Exception ex) + { + return ex; + } + throw new AssertionException("The workflow unexpectedly succeeded."); + } + + private static ushort ResolveNamespace(ISession session, string namespaceUri) + { + int namespaceIndex = session.NamespaceUris.GetIndex(namespaceUri); + Assert.That(namespaceIndex, Is.GreaterThan(0), $"Missing namespace {namespaceUri}."); + return checked((ushort)namespaceIndex); + } + + private static string FormatRefresh(WotRegistryRefreshResult refresh) + { + var details = new List + { + $"Summary: {refresh.Summary.Outcome}; total={refresh.Summary.Total}; " + + $"succeeded={refresh.Summary.Succeeded}; failed={refresh.Summary.Failed}; " + + $"generation={refresh.NewGeneration}" + }; + foreach (WoTResourceLoadResultDataType result in refresh.Results) + { + details.Add( + $"{result.ResourceId}: {result.Phase}/{result.Outcome}: {result.Message}"); + } + return string.Join("; ", details); + } + + private static readonly string[] s_expectedResourceIds = + [ + "opc-ua-di", + "opc-ua-machinery", + "opc-ua-pumps", + "sample-pump" + ]; + } +} diff --git a/tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEnvironment.cs b/tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEnvironment.cs new file mode 100644 index 0000000000..13ce8067b9 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Samples.Tests/WotSampleEnvironment.cs @@ -0,0 +1,385 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Client; +using AggregationClient; +using AggregationServer; +using FlatTagServer; + +namespace Opc.Ua.WotCon.Samples.Tests +{ + internal sealed class WotSampleEnvironment : IAsyncDisposable + { + private WotSampleEnvironment( + string root, + IHost sourceAHost, + IHost sourceBHost, + IHost aggregationHost, + AggregationClientOptions clientOptions, + FlatTagValues sourceAValues, + FlatTagValues sourceBValues) + { + Root = root; + SourceAHost = sourceAHost; + SourceBHost = sourceBHost; + AggregationHost = aggregationHost; + ClientOptions = clientOptions; + SourceAValues = sourceAValues; + SourceBValues = sourceBValues; + } + + public string Root { get; } + + public IHost SourceAHost { get; } + + public IHost SourceBHost { get; } + + public IHost AggregationHost { get; } + + public AggregationClientOptions ClientOptions { get; } + + public FlatTagValues SourceAValues { get; } + + public FlatTagValues SourceBValues { get; } + + public string DocumentsDirectory => FindDocumentsDirectory(); + + public static async Task StartAsync( + CancellationToken cancellationToken) + { + string id = Guid.NewGuid().ToString("N"); + string root = Path.Combine( + TestContext.CurrentContext.WorkDirectory, + nameof(WotSampleEnvironment), + id); + Directory.CreateDirectory(root); + + int[] ports = TestPorts.GetFreePorts(3); + int sourceAPort = ports[0]; + int sourceBPort = ports[1]; + int aggregationPort = ports[2]; + string sourceAEndpoint = $"opc.tcp://127.0.0.1:{sourceAPort}/SourceA"; + string sourceBEndpoint = $"opc.tcp://127.0.0.1:{sourceBPort}/SourceB"; + string aggregationEndpoint = + $"opc.tcp://127.0.0.1:{aggregationPort}/AggregationServer"; + + var sourceAValues = new FlatTagValues + { + DifferentialPressure = 111.25, + FluidTemperature = 301.15, + MassFlow = 0.42, + Level = 4.25, + Cavitation = true, + BearingTemperature = 340.15, + PumpPowerInput = 21.0, + PumpEfficiency = 82.0, + NumberOfStarts = 99, + MotorOverheat = false + }; + var sourceBValues = new FlatTagValues + { + DifferentialPressure = 222.5, + FluidTemperature = 310.15, + MassFlow = 0.84, + Level = 8.5, + Cavitation = false, + BearingTemperature = 333.15, + PumpPowerInput = 17.75, + PumpEfficiency = 91.5, + NumberOfStarts = 23, + MotorOverheat = true + }; + + IHost sourceAHost = FlatTagServerHost.Build(new FlatTagServerOptions + { + EndpointUrl = sourceAEndpoint, + SourceNamespaceUri = FlatTagServerOptions.SourceANamespaceUri, + ApplicationName = $"FlatTagServerSourceA{id}", + InstanceName = "SourceA", + PkiRoot = Path.Combine(root, "SourceA", "pki"), + Values = sourceAValues + }); + IHost sourceBHost = FlatTagServerHost.Build(new FlatTagServerOptions + { + EndpointUrl = sourceBEndpoint, + SourceNamespaceUri = FlatTagServerOptions.SourceBNamespaceUri, + ApplicationName = $"FlatTagServerSourceB{id}", + InstanceName = "SourceB", + PkiRoot = Path.Combine(root, "SourceB", "pki"), + Values = sourceBValues + }); + IHost aggregationHost = AggregationServerHost.Build( + new AggregationServerOptions + { + EndpointUrl = aggregationEndpoint, + ApplicationName = $"AggregationServer{id}", + PkiRoot = Path.Combine(root, "Aggregation", "pki") + }); + var clientOptions = new AggregationClientOptions + { + AggregationEndpoint = aggregationEndpoint, + SourceAEndpoint = sourceAEndpoint, + SourceBEndpoint = sourceBEndpoint, + ApplicationName = $"AggregationClient{id}", + PkiRoot = Path.Combine(root, "Client", "pki"), + DocumentsDirectory = FindDocumentsDirectory() + }; + + var environment = new WotSampleEnvironment( + root, + sourceAHost, + sourceBHost, + aggregationHost, + clientOptions, + sourceAValues, + sourceBValues); + try + { + await sourceAHost.StartAsync(cancellationToken).ConfigureAwait(false); + await sourceBHost.StartAsync(cancellationToken).ConfigureAwait(false); + await WaitForTcpAsync(sourceAPort, cancellationToken).ConfigureAwait(false); + await WaitForTcpAsync(sourceBPort, cancellationToken).ConfigureAwait(false); + await aggregationHost.StartAsync(cancellationToken).ConfigureAwait(false); + await environment.WaitForAggregationAsync(cancellationToken).ConfigureAwait(false); + return environment; + } + catch + { + await environment.DisposeAsync().ConfigureAwait(false); + throw; + } + } + + public AggregationClientOptions CreateClientOptions( + string documentsDirectory, + string? sourceAEndpoint = null, + string? sourceBEndpoint = null) + { + return new AggregationClientOptions + { + AggregationEndpoint = ClientOptions.AggregationEndpoint, + SourceAEndpoint = sourceAEndpoint ?? ClientOptions.SourceAEndpoint, + SourceBEndpoint = sourceBEndpoint ?? ClientOptions.SourceBEndpoint, + ApplicationName = ClientOptions.ApplicationName + Guid.NewGuid().ToString("N"), + PkiRoot = Path.Combine(Root, "Clients", Guid.NewGuid().ToString("N"), "pki"), + DocumentsDirectory = documentsDirectory + }; + } + + public Task ConnectAsync( + CancellationToken cancellationToken) + { + AggregationClientOptions options = CreateClientOptions(DocumentsDirectory); + return WotClientConnection.CreateAsync(options, cancellationToken); + } + + public string CreateDocumentsCopy() + { + string target = Path.Combine(Root, "Documents", Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(target); + foreach (string source in Directory.EnumerateFiles(DocumentsDirectory)) + { + File.Copy(source, Path.Combine(target, Path.GetFileName(source))); + } + return target; + } + + public async ValueTask DisposeAsync() + { + await StopHostAsync(AggregationHost).ConfigureAwait(false); + await StopHostAsync(SourceBHost).ConfigureAwait(false); + await StopHostAsync(SourceAHost).ConfigureAwait(false); + + AggregationHost.Dispose(); + SourceBHost.Dispose(); + SourceAHost.Dispose(); + if (Directory.Exists(Root)) + { + Directory.Delete(Root, recursive: true); + } + } + + private static async Task StopHostAsync(IHost host) + { + try + { + await host.StopAsync(CancellationToken.None).ConfigureAwait(false); + } +#pragma warning disable RCS1075 // intentional best-effort swallow during teardown (see comment) + catch (Exception) + { + // Cleanup is best effort after a failed startup or test. + } +#pragma warning restore RCS1075 + } + + private async Task WaitForAggregationAsync(CancellationToken cancellationToken) + { + while (true) + { + cancellationToken.ThrowIfCancellationRequested(); + try + { + WotClientConnection connection = await ConnectAsync(cancellationToken) + .ConfigureAwait(false); + await using (connection.ConfigureAwait(false)) + { + return; + } + } + catch (ServiceResultException ex) + when (ex.StatusCode == StatusCodes.BadServerHalted || + ex.StatusCode == StatusCodes.BadServerNotConnected || + ex.StatusCode == StatusCodes.BadConnectionRejected) + { + await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken) + .ConfigureAwait(false); + } + catch (SocketException) + { + await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken) + .ConfigureAwait(false); + } + } + } + + private static async Task WaitForTcpAsync( + int port, + CancellationToken cancellationToken) + { + while (true) + { + cancellationToken.ThrowIfCancellationRequested(); + using var client = new TcpClient(); + try + { + await client.ConnectAsync("127.0.0.1", port, cancellationToken) + .ConfigureAwait(false); + return; + } + catch (SocketException) + { + await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken) + .ConfigureAwait(false); + } + } + } + + private static string FindDocumentsDirectory() + { + var directory = new DirectoryInfo(AppContext.BaseDirectory); + while (directory != null) + { + string solution = Path.Combine(directory.FullName, "UA.slnx"); + if (File.Exists(solution)) + { + string documents = Path.Combine( + directory.FullName, + "samples", + "WotCon", + "AggregationClient", + "Documents"); + if (Directory.Exists(documents)) + { + return documents; + } + } + directory = directory.Parent; + } + throw new DirectoryNotFoundException( + "The checked-in samples\\AggregationClient\\Documents directory was not found."); + } + } + + internal sealed class WotClientConnection : IAsyncDisposable + { + private WotClientConnection(IHost host, ManagedSession session, WotRegistryClient registry) + { + Host = host; + Session = session; + Registry = registry; + } + + public IHost Host { get; } + + public ManagedSession Session { get; } + + public WotRegistryClient Registry { get; } + + public static async Task CreateAsync( + AggregationClientOptions options, + CancellationToken cancellationToken) + { + IHost host = AggregationClientRunner.BuildHost(options); + try + { + await host.StartAsync(cancellationToken).ConfigureAwait(false); + Func> connect = + host.Services.GetRequiredService< + Func>>(); + ManagedSession session = await connect(cancellationToken).ConfigureAwait(false); + session.MessageContext.NamespaceUris.Update(session.NamespaceUris.ToArray()); + Func> createClient = + host.Services.GetRequiredService< + Func>>(); + WotRegistryClient registry = await createClient(session, cancellationToken) + .ConfigureAwait(false); + return new WotClientConnection(host, session, registry); + } + catch + { + await host.StopAsync(CancellationToken.None).ConfigureAwait(false); + host.Dispose(); + throw; + } + } + + public async ValueTask DisposeAsync() + { + try + { + await Session.DisposeAsync().ConfigureAwait(false); + } + finally + { + await Host.StopAsync(CancellationToken.None).ConfigureAwait(false); + Host.Dispose(); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Binding/WotBinderRegistryTests.cs b/tests/Opc.Ua.WotCon.Tests/Binding/WotBinderRegistryTests.cs new file mode 100644 index 0000000000..f91e16b604 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Binding/WotBinderRegistryTests.cs @@ -0,0 +1,252 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Tests.Support; + +namespace Opc.Ua.WotCon.Tests.Binding +{ + /// + /// Exercises the aggregating : + /// deterministic selection, version coexistence, executable upgrade when an + /// executor is present, capability exposure and unsupported classification. + /// + [TestFixture] + public sealed class WotBinderRegistryTests + { + private static readonly string[] s_stubVersions = ["1.0", "2.0"]; + + private static readonly WoTBindingCapabilityEnum[] s_readCapabilities = + [WoTBindingCapabilityEnum.ReadProperty]; + + private static readonly string[] s_jsonContentTypes = ["application/json"]; + + private static WotBindingPlanRequest Request(string affordance, string href, string extraTerms = "") + { + string terms = string.IsNullOrEmpty(extraTerms) ? string.Empty : "," + extraTerms; + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"" + + affordance + + "\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + href + + "\"" + + terms + + "}]}}}"; + return WotBindingPlanRequest.FromDocument("xid", WoTDocumentKindEnum.ThingDescription, + System.Text.Encoding.UTF8.GetBytes(td)); + } + + [Test] + public void PrepareSelectsBinderByScheme() + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + + WotBindingPlan modbus = registry.Prepare(Request("m", "modbus+tcp://plc:502/1", + "\"modv:entity\":\"holdingRegister\",\"modv:address\":0,\"modv:quantity\":1")); + WotBindingPlan http = registry.Prepare(Request("h", "https://d/x")); + + Assert.That(modbus.CompiledForms.All(f => f.Binding.Id == "w3c.modbus"), Is.True); + Assert.That(http.CompiledForms.All(f => f.Binding.Id == "w3c.http"), Is.True); + } + + [Test] + public void PrepareNoBinderMarksFormUnsupported() + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + + WotBindingPlan plan = registry.Prepare(Request("x", "ftp://legacy/thing")); + + Assert.That(plan.FullySupported, Is.False); + Assert.That(plan.UnsupportedForms, Is.Not.Empty); + } + + [Test] + public void PreparePlannerOnlyProducesNonExecutableForms() + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + + WotBindingPlan plan = registry.Prepare(Request("t", "coap://d/temp", "\"cov:method\":\"GET\"")); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.HasExecutableForms, Is.False); + Assert.That(plan.HasNonExecutableForms, Is.True); + } + + [Test] + public void PrepareModbusReadOnlyEntityDefaultOpsKeepsReadPlan() + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + + // An input register carries the default read+write property ops. The + // write op is not executable against a read-only entity, but it must be + // dropped with a warning rather than an error: an error would set + // HasErrors and cause the whole form (read binding included) to be + // dropped as unsupported. + WotBindingPlan input = registry.Prepare(Request("sensor", "modbus+tcp://plc:502/1", + "\"modv:entity\":\"inputRegister\",\"modv:address\":0,\"modv:quantity\":1")); + WotBindingPlan discrete = registry.Prepare(Request("flag", "modbus+tcp://plc:502/1", + "\"modv:entity\":\"discreteInput\",\"modv:address\":0,\"modv:quantity\":1")); + + foreach (WotBindingPlan plan in new[] { input, discrete }) + { + Assert.That(plan.FullySupported, Is.True, "The read-only form must not be dropped as unsupported."); + Assert.That( + plan.CompiledForms.Any(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True, + "The read binding must be preserved."); + Assert.That( + plan.CompiledForms.Any(f => f.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.False, + "The read-only write op must be dropped, not materialized."); + Assert.That( + plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.ConflictingFields && + d.Severity == Wot.WotDiagnosticSeverity.Warning), + Is.True, + "The dropped write must be reported as a warning, not an error."); + } + } + + [Test] + public void PrepareWithExecutorUpgradesToExecutable() + { + var store = new MemoryWotStore(); + var registry = new WotProtocolBinderRegistry( + [new MemoryWotBinder()], + [new MemoryWotBindingExecutor(store)]); + + WotBindingPlan plan = registry.Prepare(Request("t", "mem://store/key")); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.HasExecutableForms, Is.True); + Assert.That(plan.CompiledForms.Any(f => f.IsExecutable), Is.True); + } + + [Test] + public void RegistryExposesOneCapabilityPerBinder() + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + + IReadOnlyList capabilities = registry.Capabilities; + + Assert.That(capabilities, Has.Count.EqualTo(8)); + Assert.That(capabilities.Select(c => c.BindingUri), + Has.Some.EqualTo(HttpBindingPlanner.BindingUri)); + Assert.That(capabilities.Select(c => c.BindingUri), + Has.Some.EqualTo(OpcUaBindingPlanner.BindingUri)); + } + + [Test] + public void RegistryMultipleVersionsCoexist() + { + var registry = new WotProtocolBinderRegistry( + [ + new StubBinder("1.0"), + new StubBinder("2.0") + ]); + + Assert.That(registry.Binders, Has.Count.EqualTo(2)); + Assert.That( + registry.Binders.Select(b => b.Identity.Version), + Is.EquivalentTo(s_stubVersions)); + Assert.That(registry.Capabilities, Has.Count.EqualTo(2)); + } + + [Test] + public void RegistryExplicitPinOverridesSchemeSelection() + { + var registry = new WotProtocolBinderRegistry( + [ + new HttpBindingPlanner(), + new StubBinder("1.0") + ]); + + // A stub-scheme href with an explicit pin on the stub binder id. + const string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"t\":{\"forms\":[{\"href\":\"stub://d/x\"}]}}}"; + var selection = new WotBindingSelectionContext( + ["stub.binder"], + []); + var request = new WotBindingPlanRequest("xid", WoTDocumentKindEnum.ThingDescription, + WotFormExtractor.Extract(System.Text.Encoding.UTF8.GetBytes(td)), + selection: selection); + + WotBindingPlan plan = registry.Prepare(request); + + Assert.That(plan.CompiledForms.All(f => f.Binding.Id == "stub.binder"), Is.True); + } + + /// + /// A minimal stub binder used for version and selection tests. + /// + private sealed class StubBinder : WotProtocolBinderBase + { + private static readonly string[] s_schemes = ["stub"]; + + public StubBinder(string version) + { + Identity = new WotBindingIdentity("stub.binder", version, "urn:stub", "Stub"); + Capability = new WotBindingCapability("urn:stub", "Stub", + new WotBindingSource("urn:stub", version, WotBindingMaturity.UnofficialDraft), + s_readCapabilities, + s_jsonContentTypes, + isExecutable: false); + } + + public override WotBindingIdentity Identity { get; } + + public override WotBindingCapability Capability { get; } + + protected override IReadOnlyCollection Schemes => s_schemes; + + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, null); + } + + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var entry = new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("stub", "d", -1, "stub://d"), + new WotAddressingDescriptor(form.AffordanceName), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ReadProperty, "readproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], + isExecutable: false); + return WotBindingCompilation.Supported( + [entry], + []); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Binding/WotBindingTestSupport.cs b/tests/Opc.Ua.WotCon.Tests/Binding/WotBindingTestSupport.cs new file mode 100644 index 0000000000..47c3a81b86 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Binding/WotBindingTestSupport.cs @@ -0,0 +1,117 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Text.Json; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Tests.Binding +{ + /// + /// Shared helpers for the protocol-binding planner and registry tests. + /// + internal static class WotBindingTestSupport + { + /// + /// Extracts a single, non-empty form for an affordance from a document. + /// + public static WotAffordanceForm Form(string json, string affordance) + { + ImmutableArray forms = WotFormExtractor.Extract(Encoding.UTF8.GetBytes(json)); + return forms.First(f => f.AffordanceName == affordance && + f.FormElement.ValueKind == JsonValueKind.Object); + } + + /// + /// Extracts all forms from a document. + /// + public static ImmutableArray Forms(string json) + { + return WotFormExtractor.Extract(Encoding.UTF8.GetBytes(json)); + } + + /// + /// Creates a default plan context. + /// + public static WotBindingPlanContext Context() + { + return new(); + } + + /// + /// Wraps a property affordance with a single form in a Thing Description. + /// + public static string Property(string name, string formJson, string extraAffordanceTerms = "") + { + string terms = string.IsNullOrEmpty(extraAffordanceTerms) ? string.Empty : "," + extraAffordanceTerms; + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"title\":\"t\",\"properties\":{\"" + + name + + "\":{\"type\":\"number\"" + + terms + + ",\"forms\":[" + + formJson + + "]}}}"; + } + + /// + /// Wraps an action affordance with a single form in a Thing Description. + /// + public static string Action(string name, string formJson, string extraAffordanceTerms = "") + { + string terms = string.IsNullOrEmpty(extraAffordanceTerms) ? string.Empty : extraAffordanceTerms + ","; + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"title\":\"t\",\"actions\":{\"" + + name + + "\":{" + + terms + + "\"forms\":[" + + formJson + + "]}}}"; + } + + /// + /// Wraps an event affordance with a single form in a Thing Description. + /// + public static string Event(string name, string formJson, string extraAffordanceTerms = "") + { + string terms = string.IsNullOrEmpty(extraAffordanceTerms) ? string.Empty : extraAffordanceTerms + ","; + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"title\":\"t\",\"events\":{\"" + + name + + "\":{" + + terms + + "\"forms\":[" + + formJson + + "]}}}"; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Binding/WotCodecTests.cs b/tests/Opc.Ua.WotCon.Tests/Binding/WotCodecTests.cs new file mode 100644 index 0000000000..b54f5ed138 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Binding/WotCodecTests.cs @@ -0,0 +1,101 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Tests.Binding +{ + /// + /// Round-trip and selection tests for the built-in payload codecs. + /// + [TestFixture] + public sealed class WotCodecTests + { + private static readonly WotPayloadDescriptor s_json = new("application/json", "json"); + private static readonly WotPayloadDescriptor s_text = new("text/plain", "text"); + + private static readonly WotPayloadDescriptor s_octet = + new("application/octet-stream", "octet-stream"); + + [Test] + public void JsonRoundTripsScalars() + { + AssertRoundTrip(JsonWotPayloadCodec.Instance, s_json, new Variant(42L), 42L); + AssertRoundTrip(JsonWotPayloadCodec.Instance, s_json, new Variant(true), true); + AssertRoundTrip(JsonWotPayloadCodec.Instance, s_json, new Variant("hello"), "hello"); + AssertRoundTrip(JsonWotPayloadCodec.Instance, s_json, new Variant(3.5), 3.5); + } + + [Test] + public void TextRoundTripsString() + { + WotEncodeResult encoded = TextWotPayloadCodec.Instance.Encode(new Variant("abc"), s_text); + Assert.That(encoded.Success, Is.True); + WotDecodeResult decoded = TextWotPayloadCodec.Instance.Decode(encoded.Data, s_text); + Assert.That(decoded.Value.AsBoxedObject(), Is.EqualTo("abc")); + } + + [Test] + public void OctetStreamRoundTripsBytes() + { + byte[] payload = [1, 2, 3, 4]; + WotEncodeResult encoded = OctetStreamWotPayloadCodec.Instance.Encode( + new Variant(new ByteString(payload)), s_octet); + Assert.That(encoded.Success, Is.True); + Assert.That(encoded.Data.ToArray(), Is.EqualTo(payload)); + WotDecodeResult decoded = OctetStreamWotPayloadCodec.Instance.Decode(encoded.Data, s_octet); + WotEncodeResult reencoded = OctetStreamWotPayloadCodec.Instance.Encode(decoded.Value, s_octet); + Assert.That(reencoded.Data.ToArray(), Is.EqualTo(payload)); + } + + [Test] + public void RegistrySelectsByContentType() + { + WotPayloadCodecRegistry registry = WotPayloadCodecRegistry.Default; + + Assert.That(registry.TrySelect("application/json", out IWotPayloadCodec json), Is.True); + Assert.That(json.Id, Is.EqualTo("json")); + Assert.That(registry.TrySelect("text/plain", out IWotPayloadCodec text), Is.True); + Assert.That(text.Id, Is.EqualTo("text")); + Assert.That(registry.TrySelect("application/octet-stream", out IWotPayloadCodec octet), Is.True); + Assert.That(octet.Id, Is.EqualTo("octet-stream")); + } + + private static void AssertRoundTrip( + JsonWotPayloadCodec codec, WotPayloadDescriptor payload, Variant value, object expected) + { + WotEncodeResult encoded = codec.Encode(value, payload); + Assert.That(encoded.Success, Is.True); + WotDecodeResult decoded = codec.Decode(encoded.Data, payload); + Assert.That(decoded.Success, Is.True); + Assert.That(decoded.Value.AsBoxedObject(), Is.EqualTo(expected)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Binding/WotCustomBinderSampleTests.cs b/tests/Opc.Ua.WotCon.Tests/Binding/WotCustomBinderSampleTests.cs new file mode 100644 index 0000000000..225cbab49f --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Binding/WotCustomBinderSampleTests.cs @@ -0,0 +1,84 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Tests.Support; + +namespace Opc.Ua.WotCon.Tests.Binding +{ + /// + /// Verifies the worked sample custom binder end-to-end: it validates and + /// compiles a mem:// form and its executor performs read / write against + /// the in-process store, demonstrating the third-party code-behind pattern. + /// + [TestFixture] + public sealed class WotCustomBinderSampleTests + { + [Test] + public async Task SampleBinderCompilesAndExecutesReadWrite() + { + var store = new MemoryWotStore(); + var registry = new WotProtocolBinderRegistry( + [new MemoryWotBinder()], + [new MemoryWotBindingExecutor(store)]); + + const string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"title\":\"t\"," + + "\"properties\":{\"setpoint\":{\"type\":\"number\",\"forms\":[{\"href\":\"mem://store/setpoint\"}]}}}"; + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(td))); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.HasExecutableForms, Is.True); + + WotCompiledForm write = plan.CompiledForms.First( + f => f.Operation == WoTBindingCapabilityEnum.WriteProperty); + WotCompiledForm read = plan.CompiledForms.First(f => f.Operation == WoTBindingCapabilityEnum.ReadProperty); + + IWotBindingChannel writeChannel = await registry.OpenChannelAsync(write).ConfigureAwait(false); + await using (writeChannel.ConfigureAwait(false)) + { + WotWriteResult result = await writeChannel.WriteAsync( + new DataValue(new Variant(42.5))).ConfigureAwait(false); + Assert.That(result.Success, Is.True); + } + + IWotBindingChannel readChannel = await registry.OpenChannelAsync(read).ConfigureAwait(false); + await using (readChannel.ConfigureAwait(false)) + { + WotReadResult result = await readChannel.ReadAsync().ConfigureAwait(false); + Assert.That(result.Success, Is.True); + Assert.That(result.Value.WrappedValue.AsBoxedObject(), Is.EqualTo(42.5)); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Binding/WotPlannerTests.cs b/tests/Opc.Ua.WotCon.Tests/Binding/WotPlannerTests.cs new file mode 100644 index 0000000000..a33678dda5 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Binding/WotPlannerTests.cs @@ -0,0 +1,751 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Tests.Binding +{ + /// + /// Exercises the eight shipped planner / validator binders (HTTP, CoAP, MQTT, + /// Modbus TCP, BACnet, PROFINET, LoRaWAN and OPC UA) across positive, + /// negative and bounds cases, verifying href / vocabulary validation, op + /// compatibility, required fields, immutable metadata and JSON-Pointer + /// diagnostics. + /// + [TestFixture] + public sealed class WotPlannerTests + { + [Test] + public void HttpValidPropertyCompilesReadAndWrite() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"https://d.example.com/temp\",\"contentType\":\"application/json\"}"), + "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.HasErrors, Is.False); + Assert.That(result.Entries.Select(e => e.Operation), + Is.EquivalentTo( + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty + ])); + WotCompiledForm read = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.ReadProperty); + Assert.That(read.Endpoint.Scheme, Is.EqualTo("https")); + Assert.That(read.OperationInfo.Method, Is.EqualTo("GET")); + Assert.That(result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.WriteProperty) + .OperationInfo.Method, Is.EqualTo("PUT")); + } + + [Test] + public void HttpMethodOverrideIsHonoured() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Action( + "run", + /*lang=json,strict*/ + "{\"href\":\"http://d/run\",\"htv:methodName\":\"POST\"}"), + "run"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].OperationInfo.Method, Is.EqualTo("POST")); + } + + [Test] + public void HttpInvalidMethodIsRejectedWithPointer() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"http://d/x\",\"htv:methodName\":\"FETCHY\"}"), + "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + WotBindingDiagnostic error = result.Diagnostics.First(d => d.IsError); + Assert.That(error.Code, Is.EqualTo(WotBindingDiagnosticCode.InvalidFieldValue)); + Assert.That(error.JsonPointer, Does.Contain("htv:methodName")); + } + + [Test] + public void HttpMissingSchemeIsRejected() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("temp", /*lang=json,strict*/ "{\"href\":\"relative/path\"}"), "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.InvalidHref), Is.True); + } + + [Test] + public void MqttValidPropertyResolvesTopicAndQos() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"mqtt://broker:1883/things/temp\",\"mqv:qos\":1,\"mqv:retain\":true}"), + "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm write = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.WriteProperty); + Assert.That(write.Addressing.Target, Is.EqualTo("things/temp")); + Assert.That(write.Addressing.Metadata["qos"], Is.EqualTo("1")); + Assert.That(write.Addressing.Metadata["retain"], Is.EqualTo("true")); + Assert.That(write.OperationInfo.Method, Is.EqualTo("publish")); + } + + [Test] + public void MqttInvalidQosIsRejected() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"mqtt://b:1883/t\",\"mqv:qos\":5}"), "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.InvalidFieldValue && + d.Term == "mqv:qos"), Is.True); + } + + [Test] + public void ModbusHoldingRegisterInt32Compiles() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("level", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":100,\"modv:quantity\":2,\"modv:type\":\"int32\"}"), + "level"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm read = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.ReadProperty); + Assert.That(read.Addressing.Metadata["entity"], Is.EqualTo("holdingRegister")); + Assert.That(read.Addressing.Metadata["address"], Is.EqualTo("100")); + Assert.That(read.Addressing.Metadata["quantity"], Is.EqualTo("2")); + Assert.That(read.Addressing.Metadata["unitId"], Is.EqualTo("1")); + Assert.That(read.Payload.Metadata["type"], Is.EqualTo("int32")); + Assert.That(read.OperationInfo.Method, Is.EqualTo("readHoldingRegisters")); + } + + [TestCase(3, "uint64")] + [TestCase(2, null)] + public void ModbusRegisterWriteWidthMismatchIsRejected(int quantity, string? type) + { + var planner = new ModbusBindingPlanner(); + string typeField = type is null ? string.Empty : ",\"modv:type\":\"" + type + "\""; + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("level", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":100,\"modv:quantity\":" + + quantity.ToString(System.Globalization.CultureInfo.InvariantCulture) + + typeField + + ",\"op\":[\"writeproperty\"]}"), + "level"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + WotBindingDiagnostic diagnostic = result.Diagnostics.Single(d => + d.Code == WotBindingDiagnosticCode.ConflictingFields && + d.Term == "modv:quantity"); + Assert.That(diagnostic.Message, Does.Contain("encoded width")); + Assert.That(diagnostic.Message, Does.Contain($"modv:type '{type ?? "uint16"}'")); + } + + [TestCase(1, "uint16", "writeSingleHoldingRegister")] + [TestCase(2, "uint32", "writeMultipleHoldingRegisters")] + [TestCase(4, "uint64", "writeMultipleHoldingRegisters")] + public void ModbusRegisterWriteMatchingScalarWidthCompiles( + int quantity, + string type, + string expectedMethod) + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("level", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":100,\"modv:quantity\":" + + quantity.ToString(System.Globalization.CultureInfo.InvariantCulture) + + ",\"modv:type\":\"" + + type + + "\",\"op\":[\"writeproperty\"]}"), + "level"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm write = result.Entries.Single(); + Assert.That(write.OperationInfo.Method, Is.EqualTo(expectedMethod)); + } + + [Test] + public void ModbusQuantityBeyondBoundsIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("bulk", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:quantity\":200}"), + "bulk"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.BoundsExceeded), Is.True); + } + + [Test] + public void ModbusWriteToReadOnlyEntityIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("sensor", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"inputRegister\"," + + "\"modv:address\":0,\"modv:quantity\":1}"), + "sensor"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + // The read entry compiles; the write entry is rejected as read-only. + Assert.That(result.Entries.Any(e => e.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.True); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.ConflictingFields), Is.True); + } + + [Test] + public void ModbusAddressBeyond16BitIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("far", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":70000,\"modv:quantity\":1}"), + "far"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Term == "modv:address"), Is.True); + } + + [Test] + public void ModbusAddressPlusQuantityOverflowIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("edge", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":65530,\"modv:quantity\":10}"), + "edge"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.BoundsExceeded), Is.True); + } + + [Test] + public void ModbusFunctionOnlyNumericCodeMapsEntityAndMethod() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("reg", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":3," + + "\"modv:address\":10,\"modv:quantity\":2,\"modv:type\":\"int32\"}"), + "reg"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm read = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.ReadProperty); + Assert.That(read.Addressing.Metadata["entity"], Is.EqualTo("holdingRegister")); + Assert.That(read.Addressing.Metadata["functionCode"], Is.EqualTo("3")); + Assert.That(read.OperationInfo.Method, Is.EqualTo("readHoldingRegisters")); + // A read function drops the default write op with a diagnostic. + Assert.That(result.Entries.Any(e => e.Operation == WoTBindingCapabilityEnum.WriteProperty), Is.False); + } + + [Test] + public void ModbusFunctionOnlyMnemonicMapsCoilWrite() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("relay", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":\"writeSingleCoil\"," + + "\"modv:address\":5}"), + "relay"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm write = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.WriteProperty); + Assert.That(write.Addressing.Metadata["entity"], Is.EqualTo("coil")); + Assert.That(write.OperationInfo.Method, Is.EqualTo("writeSingleCoil")); + // A write function drops the default read op with a diagnostic. + Assert.That(result.Entries.Any(e => e.Operation == WoTBindingCapabilityEnum.ReadProperty), Is.False); + } + + [Test] + public void ModbusMultiBitReadCompilesBooleanArrayPayload() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("inputs", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"discreteInput\"," + + "\"modv:address\":5,\"modv:quantity\":9,\"op\":[\"readproperty\"]}"), + "inputs"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm read = result.Entries.Single(); + Assert.That(read.OperationInfo.Method, Is.EqualTo("readDiscreteInput")); + Assert.That(read.Payload.CodecId, Is.EqualTo(OctetStreamWotPayloadCodec.Instance.Id)); + Assert.That(read.Payload.Metadata["type"], Is.EqualTo("boolean[]")); + } + + [Test] + public void ModbusFunction15QuantityOneKeepsScalarPayload() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("relay", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":15," + + "\"modv:address\":5,\"modv:quantity\":1,\"op\":[\"writeproperty\"]}"), + "relay"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm write = result.Entries.Single(); + Assert.That(write.OperationInfo.Method, Is.EqualTo("writeMultipleCoils")); + Assert.That(write.Payload.CodecId, Is.EqualTo(OctetStreamWotPayloadCodec.Instance.Id)); + Assert.That(write.Payload.Metadata["type"], Is.EqualTo("boolean")); + } + + [TestCase(5)] + [TestCase(6)] + public void ModbusSingleWriteFunctionRejectsMultipleQuantity(int function) + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("relay", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":" + + function.ToString(System.Globalization.CultureInfo.InvariantCulture) + + "," + + "\"modv:address\":5,\"modv:quantity\":2,\"op\":[\"writeproperty\"]}"), + "relay"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + WotBindingDiagnostic diagnostic = result.Diagnostics.Single(d => + d.Code == WotBindingDiagnosticCode.ConflictingFields && + d.Term == "modv:quantity"); + Assert.That(diagnostic.Message, Does.Contain("requires modv:quantity 1")); + } + + [TestCase(1, 2000, true)] + [TestCase(1, 2001, false)] + [TestCase(15, 1968, true)] + [TestCase(15, 1969, false)] + [TestCase(16, 124, false)] + public void ModbusFunctionProtocolMaximumIsEnforced(int function, int quantity, bool supported) + { + var planner = new ModbusBindingPlanner(); + string operation = function is 15 or 16 ? "writeproperty" : "readproperty"; + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("bits", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":" + + function.ToString(System.Globalization.CultureInfo.InvariantCulture) + + ",\"modv:address\":0,\"modv:quantity\":" + + quantity.ToString(System.Globalization.CultureInfo.InvariantCulture) + + ",\"op\":[\"" + + operation + + "\"]}"), + "bits"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.EqualTo(supported)); + if (!supported) + { + Assert.That( + result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.BoundsExceeded), + Is.True); + } + } + + [Test] + public void ModbusEntityFunctionMismatchIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("bad", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"coil\"," + + "\"modv:function\":\"readHoldingRegisters\",\"modv:address\":0}"), + "bad"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.IsError && + d.Code == WotBindingDiagnosticCode.ConflictingFields), Is.True); + } + + [Test] + public void ModbusInvalidFunctionIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "weird", + /*lang=json,strict*/ + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":99,\"modv:address\":0}"), + "weird"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.InvalidFieldValue && + d.Term == "modv:function"), Is.True); + } + + [Test] + public void ModbusExplicitWriteOpWithReadFunctionIsRejected() + { + var planner = new ModbusBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("ro", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:function\":\"readCoil\"," + + "\"modv:address\":0,\"op\":[\"writeproperty\"]}"), + "ro"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + // The only op is a write against a read function; every entry is dropped. + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.ConflictingFields), Is.True); + } + + [Test] + public void MqttsSchemeCompilesWithSecureEndpoint() + { + var planner = new MqttBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"mqtts://broker:8883/things/temp\",\"mqv:qos\":1}"), + "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm write = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.WriteProperty); + Assert.That(write.Endpoint.Scheme, Is.EqualTo("mqtts")); + Assert.That(write.Endpoint.Port, Is.EqualTo(8883)); + } + + [Test] + public void CoapValidFormCompilesButNonExecutable() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"coap://d/temp\",\"cov:method\":\"GET\"}"), "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries.All(e => e.IsExecutable), Is.False, + "The CoAP planner declares its forms non-executable (Capability.IsExecutable == false)."); + } + + [Test] + public void CoapInvalidMethodIsRejected() + { + var planner = new CoapBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"coap://d/x\",\"cov:method\":\"NOPE\"}"), "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Term == "cov:method"), Is.True); + } + + [Test] + public void BacnetValidObjectCompiles() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("t", + "{\"bacv:objectType\":\"analogInput\",\"bacv:instanceNumber\":1," + + "\"bacv:propertyIdentifier\":\"presentValue\"}"), + "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Target, Is.EqualTo("analogInput:1:presentValue")); + Assert.That(result.Entries.All(e => e.IsExecutable), Is.False); + } + + [Test] + public void BacnetMissingInstanceIsRejected() + { + var planner = new BacnetBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"bacv:objectType\":\"analogInput\",\"bacv:propertyIdentifier\":\"presentValue\"}"), + "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.MissingRequiredField && + d.Term == "bacv:instanceNumber"), Is.True); + } + + [Test] + public void ProfinetValidSlotCompiles() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"pnv:slot\":1,\"pnv:subslot\":2,\"pnv:index\":100}"), "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries.All(e => e.IsExecutable), Is.False); + } + + [Test] + public void ProfinetMissingIndexIsRejected() + { + var planner = new ProfinetBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("t", /*lang=json,strict*/ "{\"pnv:slot\":1,\"pnv:subslot\":2}"), "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Term == "pnv:index"), Is.True); + } + + [Test] + public void LoRaWanValidDeviceCompiles() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"lorawan:DevEUI\":\"0011223344556677\",\"lorawan:fPort\":10}"), "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + Assert.That(result.Entries[0].Addressing.Metadata["devEui"], Is.EqualTo("0011223344556677")); + Assert.That(result.Entries.All(e => e.IsExecutable), Is.False); + } + + [Test] + public void LoRaWanInvalidDevEuiIsRejected() + { + var planner = new LoRaWanBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("t", /*lang=json,strict*/ "{\"lorawan:DevEUI\":\"not-hex\"}"), "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.InvalidFieldValue), Is.True); + } + + [Test] + public void OpcUaValidNodeIdCompiles() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"opc.tcp://server:4840\",\"uav:id\":\"ns=2;i=5\"}"), "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm read = result.Entries.First(e => e.Operation == WoTBindingCapabilityEnum.ReadProperty); + Assert.That(read.Addressing.Target, Is.EqualTo("ns=2;i=5")); + Assert.That(read.Endpoint.Scheme, Is.EqualTo("opc.tcp")); + Assert.That(read.OperationInfo.Method, Is.EqualTo("Read")); + } + + [Test] + public void OpcUaMissingNodeIdIsRejected() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property("t", /*lang=json,strict*/ "{\"href\":\"opc.tcp://server:4840\"}"), "t"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.False); + Assert.That(result.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.MissingRequiredField), Is.True); + } + + [Test] + public void OpcUaActionCarriesComponentOf() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Action( + "run", + /*lang=json,strict*/ + "{\"href\":\"opc.tcp://server:4840\",\"uav:id\":\"ns=2;i=9\",\"uav:componentOf\":\"ns=2;i=1\"}"), + "run"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm invoke = result.Entries[0]; + Assert.That(invoke.Operation, Is.EqualTo(WoTBindingCapabilityEnum.InvokeAction)); + Assert.That(invoke.Addressing.Metadata["componentOf"], Is.EqualTo("ns=2;i=1")); + Assert.That(invoke.OperationInfo.Method, Is.EqualTo("Call")); + } + + [Test] + public void OpcUaEventCarriesAuthoredEventFields() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Event("alarmActive", + "{\"href\":\"opc.tcp://server:4840\",\"uav:id\":\"ns=2;i=42\"," + + "\"uav:eventFields\":[\"ActiveState/Id\",\"Severity\"],\"op\":[\"subscribeevent\"]}"), + "alarmActive"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm subscribe = result.Entries.First( + e => e.Operation == WoTBindingCapabilityEnum.SubscribeEvent); + Assert.That(subscribe.Addressing.Metadata["eventFields"], Is.EqualTo("ActiveState/Id|Severity")); + } + + [Test] + public void OpcUaEventWithoutEventFieldsOmitsMetadataKey() + { + var planner = new OpcUaBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Event( + "trigger", + /*lang=json,strict*/ + "{\"href\":\"opc.tcp://server:4840\",\"uav:id\":\"ns=2;i=42\",\"op\":[\"subscribeevent\"]}"), + "trigger"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + + Assert.That(result.IsSupported, Is.True); + WotCompiledForm subscribe = result.Entries.First( + e => e.Operation == WoTBindingCapabilityEnum.SubscribeEvent); + Assert.That(subscribe.Addressing.Metadata.ContainsKey("eventFields"), Is.False); + } + + [Test] + public void CapabilitiesPinSourcesAndNeverClaimRegistryCurrent() + { + foreach (IWotProtocolBinder binder in WotBuiltInBinders.CreateAll()) + { + Assert.That(binder.Capability.Source.SpecificationUri, Is.Not.Empty, + $"{binder.Identity.Id} must pin a source URL."); + Assert.That(binder.Capability.Source.Maturity, Is.Not.EqualTo(WotBindingMaturity.RegistryCurrent), + $"{binder.Identity.Id} must not claim W3C Registry Current status."); + WoTBindingCapabilityDataType dataType = binder.Capability.ToDataType(); + Assert.That(dataType.BindingUri, Is.Not.Empty); + Assert.That(dataType.DraftMaturity, Is.Not.Empty); + } + } + + [Test] + public void DiagnosticsExposeJsonPointerViaSharedModel() + { + var planner = new HttpBindingPlanner(); + WotAffordanceForm form = WotBindingTestSupport.Form( + WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"contentType\":\"application/json\"}"), "temp"); + + WotBindingCompilation result = planner.Compile(form, WotBindingTestSupport.Context()); + WotBindingDiagnostic diagnostic = result.Diagnostics.First(d => d.IsError); + var shared = diagnostic.ToWotDiagnostic(); + + Assert.That(shared.Location?.JsonPointer, Does.StartWith("/properties/temp/forms/0")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Binding/WotTargetMappingTests.cs b/tests/Opc.Ua.WotCon.Tests/Binding/WotTargetMappingTests.cs new file mode 100644 index 0000000000..08bca94981 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Binding/WotTargetMappingTests.cs @@ -0,0 +1,408 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Linq; +using System.Text; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Tests.Binding +{ + /// + /// Exercises the OPC 10101 §6.5.4 uav:mapToNodeId / uav:mapToType + /// / uav:mapByFieldPath target-mapping terms: they are protocol-neutral + /// (a non-OPC-UA source may be mapped onto an OPC UA target), valid only on + /// property affordances, mapByFieldPath requires mapToType, the + /// terms must never be authored on a form, and the resulting + /// is carried by every compiled entry. + /// Validation is centralized in + /// so it applies identically to every protocol. + /// + [TestFixture] + public sealed class WotTargetMappingTests + { + private static WotBindingPlan Prepare(string document) + { + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + var request = WotBindingPlanRequest.FromDocument( + "xid", WoTDocumentKindEnum.ThingDescription, Encoding.UTF8.GetBytes(document)); + return registry.Prepare(request); + } + + [Test] + public void MapToNodeIdOnModbusPropertyPropagatesToCompiledEntries() + { + string document = WotBindingTestSupport.Property("sensor", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:quantity\":1}", + "\"uav:mapToNodeId\":\"ns=2;s=Sensor1\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms.All(f => f.TargetMapping.TargetNodeId == "ns=2;s=Sensor1"), Is.True); + } + + [Test] + public void MapToNodeIdOnHttpPropertyIsAccepted() + { + string document = WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"https://d.example.com/temp\",\"contentType\":\"application/json\"}", + "\"uav:mapToNodeId\":\"ns=2;s=Temp\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms.All(f => f.TargetMapping.TargetNodeId == "ns=2;s=Temp"), Is.True); + } + + [Test] + public void MapToNodeIdOnOpcUaPropertyIsAccepted() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"opc.tcp://server:4840\",\"uav:id\":\"ns=2;i=5\"}", + "\"uav:mapToNodeId\":\"ns=3;s=Mapped\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms.All(f => f.TargetMapping.TargetNodeId == "ns=3;s=Mapped"), Is.True); + } + + [Test] + public void MapToTypeWithFieldPathOnPropertyIsAccepted() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapToType\":\"ns=2;i=100\",\"uav:mapByFieldPath\":\"Value/SubField\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.Diagnostics.Any(d => d.IsError), Is.False); + WotCompiledForm entry = plan.CompiledForms[0]; + Assert.That(entry.TargetMapping.TargetTypeNodeId, Is.EqualTo("ns=2;i=100")); + Assert.That(entry.TargetMapping.FieldPath, Is.EqualTo("Value/SubField")); + } + + [Test] + public void MapByFieldPathWithoutMapToTypeIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapByFieldPath\":\"Value/SubField\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingFieldPathRequiresType), + Is.True); + } + + [Test] + public void MapToNodeIdAndMapToTypeTogetherAreAccepted() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapToNodeId\":\"ns=2;s=Target\",\"uav:mapToType\":\"ns=2;i=100\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms[0].TargetMapping.TargetNodeId, Is.EqualTo("ns=2;s=Target")); + Assert.That(plan.CompiledForms[0].TargetMapping.TargetTypeNodeId, Is.EqualTo("ns=2;i=100")); + } + + [Test] + public void MapToNodeIdOnActionIsRejected() + { + string document = WotBindingTestSupport.Action( + "run", + /*lang=json,strict*/ + "{\"href\":\"https://d/run\",\"htv:methodName\":\"POST\"}", + "\"uav:mapToNodeId\":\"ns=2;s=X\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingNotOnProperty), + Is.True); + } + + [Test] + public void MapToNodeIdOnEventIsRejected() + { + string document = WotBindingTestSupport.Event( + "alarm", + /*lang=json,strict*/ + "{\"href\":\"opc.tcp://server:4840\",\"uav:id\":\"ns=2;i=42\",\"op\":[\"subscribeevent\"]}", + "\"uav:mapToNodeId\":\"ns=2;s=X\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingNotOnProperty), + Is.True); + } + + [Test] + public void MapByFieldPathOnActionReportsOnlyPropertyAffordanceError() + { + string document = WotBindingTestSupport.Action( + "run", + /*lang=json,strict*/ + "{\"href\":\"https://d/run\",\"htv:methodName\":\"POST\"}", + "\"uav:mapByFieldPath\":\"Value\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That( + plan.Diagnostics.Count(d => d.Code == WotBindingDiagnosticCode.TargetMappingNotOnProperty), + Is.EqualTo(1)); + Assert.That( + plan.Diagnostics.Any(d => + d.Code == WotBindingDiagnosticCode.TargetMappingFieldPathRequiresType), + Is.False); + Assert.That( + plan.Diagnostics.Single(d => + d.Code == WotBindingDiagnosticCode.TargetMappingNotOnProperty).JsonPointer, + Is.EqualTo("/actions/run/uav:mapByFieldPath")); + } + + [Test] + public void MapToNodeIdAuthoredOnFormIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\",\"uav:mapToNodeId\":\"ns=2;s=X\"}"); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingAuthoredOnForm), + Is.True); + } + + [Test] + public void MapToTypeAuthoredOnFormIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\",\"uav:mapToType\":\"ns=2;i=1\"}"); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingAuthoredOnForm), + Is.True); + } + + [Test] + public void NonStringMapToNodeIdOnPropertyIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapToNodeId\":42"); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingInvalidValue), + Is.True); + } + + [Test] + public void NonStringMapToNodeIdOnFormIsRejectedAsFormMisuse() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\",\"uav:mapToNodeId\":42}"); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingAuthoredOnForm), + Is.True); + } + + [Test] + public void MapToNodeIdEmptyIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapToNodeId\":\"\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingEmptyValue), + Is.True); + } + + [Test] + public void MapToTypeEmptyIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapToType\":\"\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingEmptyValue), + Is.True); + } + + [Test] + public void MapByFieldPathEmptyIsRejected() + { + string document = WotBindingTestSupport.Property( + "t", + /*lang=json,strict*/ + "{\"href\":\"https://d/x\",\"contentType\":\"application/json\"}", + "\"uav:mapToType\":\"ns=2;i=1\",\"uav:mapByFieldPath\":\"\""); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.False); + Assert.That( + plan.Diagnostics.Any(d => d.Code == WotBindingDiagnosticCode.TargetMappingEmptyValue), + Is.True); + } + + [Test] + public void MapToNodeIdPropagatesToEveryCompiledOperationEntry() + { + string document = WotBindingTestSupport.Property("sensor", + "{\"href\":\"modbus+tcp://plc:502/1\",\"modv:entity\":\"holdingRegister\"," + + "\"modv:address\":0,\"modv:quantity\":1}", + "\"uav:mapToNodeId\":\"ns=2;s=Sensor1\""); + + WotBindingPlan plan = Prepare(document); + + // A holding register defaults to both read and write property ops. + Assert.That(plan.CompiledForms, Has.Length.GreaterThan(1)); + Assert.That(plan.CompiledForms.All(f => f.TargetMapping.TargetNodeId == "ns=2;s=Sensor1"), Is.True); + } + + [Test] + public void NoMappingTermsAuthoredCompiledEntriesCarryEmptyTargetMapping() + { + string document = WotBindingTestSupport.Property( + "temp", + /*lang=json,strict*/ + "{\"href\":\"https://d.example.com/temp\",\"contentType\":\"application/json\"}"); + + WotBindingPlan plan = Prepare(document); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms.All(f => f.TargetMapping.IsEmpty), Is.True); + } + + [Test] + public void FormExtractorParsesTargetMappingFromAffordanceElement() + { + string document = WotBindingTestSupport.Property("t", /*lang=json,strict*/ "{\"href\":\"https://d/x\"}", + "\"uav:mapToNodeId\":\"ns=2;s=X\",\"uav:mapToType\":\"ns=2;i=10\",\"uav:mapByFieldPath\":\"A/B\""); + + WotAffordanceForm form = WotBindingTestSupport.Form(document, "t"); + + Assert.That(form.TargetMapping.TargetNodeId, Is.EqualTo("ns=2;s=X")); + Assert.That(form.TargetMapping.TargetTypeNodeId, Is.EqualTo("ns=2;i=10")); + Assert.That(form.TargetMapping.FieldPath, Is.EqualTo("A/B")); + } + + [Test] + public void FormExtractorWithNoMappingTermsProducesEmptyTargetMapping() + { + string document = WotBindingTestSupport.Property("t", /*lang=json,strict*/ "{\"href\":\"https://d/x\"}"); + + WotAffordanceForm form = WotBindingTestSupport.Form(document, "t"); + + Assert.That(form.TargetMapping.IsEmpty, Is.True); + } + + [Test] + public void CompiledFormWithTargetMappingReturnsNewInstanceWithUpdatedMapping() + { + var original = new WotCompiledForm( + new WotBindingIdentity("test.binder", "1.0", "urn:test", "Test"), + WotAffordanceKind.Property, "t", "/properties/t/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("stub", "d", -1, "stub://d"), + new WotAddressingDescriptor("t"), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ReadProperty, "readproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], + isExecutable: false); + + Assert.That(original.TargetMapping.IsEmpty, Is.True); + + var mapping = new WotTargetMappingDescriptor(targetNodeId: "ns=2;s=X"); + WotCompiledForm mapped = original.WithTargetMapping(mapping); + + Assert.That(mapped, Is.Not.SameAs(original)); + Assert.That(mapped.TargetMapping.TargetNodeId, Is.EqualTo("ns=2;s=X")); + Assert.That(original.TargetMapping.IsEmpty, Is.True, "The original entry must stay unchanged."); + + WotCompiledForm same = mapped.WithTargetMapping(mapping); + Assert.That(same, Is.SameAs(mapped)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Client/WotConnectivityClientTests.cs b/tests/Opc.Ua.WotCon.Tests/Client/WotConnectivityClientTests.cs new file mode 100644 index 0000000000..9c273c5860 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Client/WotConnectivityClientTests.cs @@ -0,0 +1,340 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Client; + +namespace Opc.Ua.WotCon.Tests.Client +{ + [TestFixture] + [Category("WotCon")] + [Category("Client")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + public sealed class WotConnectivityClientTests + { + [Test] + public void ConstructorRejectsInvalidArguments() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var managementId = new NodeId("management", 2); + + Assert.That( + () => new WotConnectivityClient(null!, managementId, telemetry), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("session")); + Assert.That( + () => new WotConnectivityClient(session.Object, NodeId.Null, telemetry), + Throws.ArgumentException.With.Property("ParamName").EqualTo("managementObjectId")); + Assert.That( + () => new WotConnectivityClient(session.Object, managementId, null!), + Throws.ArgumentNullException.With.Property("ParamName").EqualTo("telemetry")); + } + + [Test] + public async Task ForServerAsyncResolvesManagementObjectAsync() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var managementId = new NodeId("management", 2); + SetupTranslate(session, StatusCodes.Good, managementId); + + WotConnectivityClient client = await WotConnectivityClient + .ForServerAsync(session.Object, telemetry) + .ConfigureAwait(false); + + Assert.That(client.Session, Is.SameAs(session.Object)); + Assert.That(client.ManagementObjectId, Is.EqualTo(managementId)); + Assert.That(client.Telemetry, Is.SameAs(telemetry)); + } + + [Test] + public void ForServerAsyncRejectsMissingEntryPoint() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + SetupTranslate(session, StatusCodes.BadNoMatch, NodeId.Null); + + Assert.That( + () => WotConnectivityClient + .ForServerAsync(session.Object, telemetry) + .AsTask(), + Throws.InstanceOf() + .With.Property(nameof(ServiceResultException.StatusCode)) + .EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public async Task OpenAssetAsyncReturnsClientWithDisplayNameAsync() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var assetId = new NodeId("asset", 2); + var fileId = new NodeId("file", 2); + SetupTranslate(session, StatusCodes.Good, fileId); + SetupRead(session, new DataValue(new LocalizedText("Boiler"))); + var client = new WotConnectivityClient( + session.Object, + new NodeId("management", 2), + telemetry); + + WotAssetClient asset = await client.OpenAssetAsync(assetId).ConfigureAwait(false); + + Assert.That(asset.AssetId, Is.EqualTo(assetId)); + Assert.That(asset.Name, Is.EqualTo("Boiler")); + Assert.That(asset.File.ObjectId, Is.EqualTo(fileId)); + } + + [Test] + public async Task OpenAssetAsyncUsesEmptyNameWhenDisplayNameReadFailsAsync() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var assetId = new NodeId("asset", 2); + SetupTranslate(session, StatusCodes.Good, new NodeId("file", 2)); + SetupRead(session, DataValue.FromStatusCode(StatusCodes.BadNodeIdUnknown)); + var client = new WotConnectivityClient( + session.Object, + new NodeId("management", 2), + telemetry); + + WotAssetClient asset = await client.OpenAssetAsync(assetId).ConfigureAwait(false); + + Assert.That(asset.Name, Is.Empty); + } + + [Test] + public void OpenAssetAsyncRejectsMissingAssetAndFile() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var client = new WotConnectivityClient( + session.Object, + new NodeId("management", 2), + telemetry); + + Assert.That( + () => client.OpenAssetAsync(NodeId.Null).AsTask(), + Throws.ArgumentException.With.Property("ParamName").EqualTo("assetId")); + + SetupTranslate(session, StatusCodes.BadNoMatch, NodeId.Null); + Assert.That( + () => client.OpenAssetAsync(new NodeId("asset", 2)).AsTask(), + Throws.InstanceOf() + .With.Property(nameof(ServiceResultException.StatusCode)) + .EqualTo(StatusCodes.BadNoMatch)); + } + + [Test] + public async Task EnumerateAssetsAsyncReturnsBrowseSnapshotAsync() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var managementId = new NodeId("management", 2); + var assetOne = new NodeId("asset-1", 2); + var assetTwo = new NodeId("asset-2", 2); + session + .Setup(s => s.BrowseAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .ReturnsAsync(new BrowseResponse + { + ResponseHeader = new ResponseHeader(), + Results = new[] + { + new BrowseResult + { + StatusCode = StatusCodes.Good, + References = new[] + { + new ReferenceDescription + { + NodeId = new ExpandedNodeId(assetOne), + DisplayName = new LocalizedText("Asset One") + }, + new ReferenceDescription + { + NodeId = new ExpandedNodeId(assetTwo), + DisplayName = LocalizedText.Null + } + }.ToArrayOf() + } + }.ToArrayOf(), + DiagnosticInfos = default + }); + var client = new WotConnectivityClient(session.Object, managementId, telemetry); + var entries = new List(); + + await foreach (WotAssetEntry entry in client.EnumerateAssetsAsync() + .ConfigureAwait(false)) + { + entries.Add(entry); + } + + Assert.That(entries, Has.Count.EqualTo(2)); + Assert.That(entries[0], Is.EqualTo(new WotAssetEntry(assetOne, "Asset One"))); + Assert.That(entries[1], Is.EqualTo(new WotAssetEntry(assetTwo, string.Empty))); + } + + [Test] + public async Task AssetClientEnumeratesPropertiesAndActionsAsync() + { + (Mock session, ITelemetryContext telemetry) = CreateSession(); + var propertyId = new NodeId("temperature", 2); + var actionId = new NodeId("reset", 2); + session + .SetupSequence(s => s.BrowseAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .ReturnsAsync(CreateBrowseResponse(propertyId, "Temperature")) + .ReturnsAsync(CreateBrowseResponse(actionId, "Reset")); + var file = new WoTAssetFileTypeClient( + session.Object, + new NodeId("file", 2), + telemetry); + var asset = new WotAssetClient( + session.Object, + new NodeId("asset", 2), + "Boiler", + file, + telemetry); + var properties = new List(); + var actions = new List(); + + await foreach (WotAssetVariableEntry entry in asset.EnumeratePropertiesAsync() + .ConfigureAwait(false)) + { + properties.Add(entry); + } + await foreach (WotAssetVariableEntry entry in asset.EnumerateActionsAsync() + .ConfigureAwait(false)) + { + actions.Add(entry); + } + + Assert.That( + properties, + Is.EqualTo([new WotAssetVariableEntry(propertyId, "Temperature")])); + Assert.That( + actions, + Is.EqualTo([new WotAssetVariableEntry(actionId, "Reset")])); + } + + private static (Mock Session, ITelemetryContext Telemetry) CreateSession() + { + ITelemetryContext telemetry = Mock.Of(); + var messageContext = ServiceMessageContext.Create(telemetry); + messageContext.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + var session = new Mock(MockBehavior.Strict); + session.SetupGet(s => s.MessageContext).Returns(messageContext); + session.SetupGet(s => s.NamespaceUris).Returns(messageContext.NamespaceUris); + return (session, telemetry); + } + + private static void SetupTranslate( + Mock session, + StatusCode statusCode, + NodeId targetId) + { + ArrayOf targets = targetId.IsNull + ? [] + : new[] + { + new BrowsePathTarget + { + TargetId = new ExpandedNodeId(targetId), + RemainingPathIndex = uint.MaxValue + } + }.ToArrayOf(); + session + .Setup(s => s.TranslateBrowsePathsToNodeIdsAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .ReturnsAsync(new TranslateBrowsePathsToNodeIdsResponse + { + ResponseHeader = new ResponseHeader(), + Results = new[] + { + new BrowsePathResult + { + StatusCode = statusCode, + Targets = targets + } + }.ToArrayOf(), + DiagnosticInfos = default + }); + } + + private static void SetupRead(Mock session, DataValue result) + { + session + .Setup(s => s.ReadAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .ReturnsAsync(new ReadResponse + { + ResponseHeader = new ResponseHeader(), + Results = new[] { result }.ToArrayOf(), + DiagnosticInfos = default + }); + } + + private static BrowseResponse CreateBrowseResponse(NodeId nodeId, string browseName) + { + return new BrowseResponse + { + ResponseHeader = new ResponseHeader(), + Results = new[] + { + new BrowseResult + { + StatusCode = StatusCodes.Good, + References = new[] + { + new ReferenceDescription + { + NodeId = new ExpandedNodeId(nodeId), + BrowseName = new QualifiedName(browseName, nodeId.NamespaceIndex) + } + }.ToArrayOf() + } + }.ToArrayOf(), + DiagnosticInfos = default + }; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Client/WotRegistryBulkLoadTests.cs b/tests/Opc.Ua.WotCon.Tests/Client/WotRegistryBulkLoadTests.cs new file mode 100644 index 0000000000..f984cc80c4 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Client/WotRegistryBulkLoadTests.cs @@ -0,0 +1,195 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using Opc.Ua.WotCon.Client; + +namespace Opc.Ua.WotCon.Tests.Client +{ + /// + /// Session-mock unit tests for + /// : dependency + /// ordering (Thing Models before Thing Descriptions) and mutation / + /// refresh failure propagation. + /// + [TestFixture] + [Category("WotCon")] + [Category("Client")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + public sealed class WotRegistryBulkLoadTests + { + private static ITelemetryContext CreateTelemetry() + { + return Mock.Of(); + } + + private static ByteString Content(string text) + { + return ByteString.From(Encoding.UTF8.GetBytes(text)); + } + + [Test] + public async Task LoadDocumentsOrdersThingModelsBeforeThingDescriptionsAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + ArrayOf documents = new WotRegistryDocument[] + { + new(WoTDocumentKindEnum.ThingDescription, "thingdescriptions", "td1", Content("td1")), + new(WoTDocumentKindEnum.ThingModel, "thingmodels", "tm1", Content("tm1")), + new(WoTDocumentKindEnum.ThingDescription, "thingdescriptions", "td2", Content("td2")), + new(WoTDocumentKindEnum.ThingModel, "thingmodels", "tm2", Content("tm2")) + }.ToArrayOf(); + + WotRegistryBulkLoadResult result = await client + .LoadDocumentsAsync(documents, refresh: false) + .ConfigureAwait(false); + + var order = new List(); + foreach (WotRegistryDocumentLoadOutcome outcome in result.Uploaded) + { + order.Add(outcome.Document.ResourceId); + } + + Assert.That(order, Is.EqualTo(s_expectedOrder)); + Assert.That(result.Refresh, Is.Null); + } + + [Test] + public async Task LoadDocumentsThrowsWhenDocumentKindDisagreesWithGroupKindAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + // "thingmodels" is the reserved Thing Model group; declaring a + // Thing Description document against it must fail fast. + ArrayOf documents = new WotRegistryDocument[] + { + new(WoTDocumentKindEnum.ThingDescription, "thingmodels", "oops", Content("oops")) + }.ToArrayOf(); + + Assert.That( + () => client.LoadDocumentsAsync(documents, refresh: false).AsTask(), + Throws.InstanceOf()); + } + + [Test] + public async Task LoadDocumentsThrowsWhenCachedGroupKindDisagreesAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + ArrayOf documents = new WotRegistryDocument[] + { + new(WoTDocumentKindEnum.ThingDescription, "mixed", "td", Content("td")), + new(WoTDocumentKindEnum.ThingModel, "mixed", "tm", Content("tm")) + }.ToArrayOf(); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await client.LoadDocumentsAsync(documents, refresh: false) + .ConfigureAwait(false))!; + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task LoadDocumentsPropagatesMutationFailuresImmediatelyAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + ArrayOf documents = new WotRegistryDocument[] + { + new(WoTDocumentKindEnum.ThingDescription, "thingdescriptions", "boom", Content("boom")), + new(WoTDocumentKindEnum.ThingDescription, "thingdescriptions", "never-reached", Content("x")) + }.ToArrayOf(); + + // Fail the next GetOrCreateResource call so the first + // document's mutation fails. + NodeId resourceMethodId = FindGetOrCreateResourceMethodId(mock); + mock.FailNextCallOn[resourceMethodId] = StatusCodes.BadResourceUnavailable; + + Assert.That( + () => client.LoadDocumentsAsync(documents, refresh: false).AsTask(), + Throws.InstanceOf()); + + // The second document's resource must never have been created. + WotRegistryGroupClient group = await client + .OpenGroupAsync("thingdescriptions").ConfigureAwait(false); + Assert.That( + () => group.OpenResourceAsync("never-reached").AsTask(), + Throws.InstanceOf()); + } + + [Test] + public async Task LoadDocumentsSurfacesRefreshFailuresWithoutThrowingAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + mock.InvalidResourceIds.Add("bad"); + + ArrayOf documents = new WotRegistryDocument[] + { + new(WoTDocumentKindEnum.ThingDescription, "thingdescriptions", "bad", Content("bad")) + }.ToArrayOf(); + + WotRegistryBulkLoadResult result = await client + .LoadDocumentsAsync(documents, refresh: true) + .ConfigureAwait(false); + + Assert.That(result.Uploaded, Has.Count.EqualTo(1)); + Assert.That(result.Refresh, Is.Not.Null); + Assert.That(result.Refresh!.HasFailures, Is.True); + } + + private static NodeId FindGetOrCreateResourceMethodId(WotRegistrySessionMock mock) + { + return ExpandedNodeId.ToNodeId( + XRegistry.MethodIds.GroupType_GetOrCreateResource, mock.Session.NamespaceUris); + } + + private static readonly string[] s_expectedOrder = ["tm1", "tm2", "td1", "td2"]; + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Client/WotRegistryClientTests.cs b/tests/Opc.Ua.WotCon.Tests/Client/WotRegistryClientTests.cs new file mode 100644 index 0000000000..c11726a3a3 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Client/WotRegistryClientTests.cs @@ -0,0 +1,336 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Client; + +namespace Opc.Ua.WotCon.Tests.Client +{ + /// + /// Session-mock unit tests for , + /// and + /// : browse resolution, method + /// argument/result shapes and chunked upload/commit semantics. + /// + [TestFixture] + [Category("WotCon")] + [Category("Client")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + public sealed class WotRegistryClientTests + { + private static ITelemetryContext CreateTelemetry() + { + return Mock.Of(); + } + + [Test] + public async Task ForServerAsyncResolvesTheWellKnownRegistryObjectAsync() + { + var mock = new WotRegistrySessionMock(); + + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + Assert.That(client.RegistryNodeId, Is.EqualTo(mock.RegistryNodeId)); + } + + [Test] + public void ForServerAsyncThrowsWhenRegistryIsMissing() + { + var sessionMock = new Mock(MockBehavior.Strict); + var messageContext = ServiceMessageContext.Create(CreateTelemetry()); + sessionMock.SetupGet(s => s.MessageContext).Returns(messageContext); + sessionMock.SetupGet(s => s.NamespaceUris).Returns(messageContext.NamespaceUris); + sessionMock + .Setup(s => s.TranslateBrowsePathsToNodeIdsAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .ReturnsAsync(new TranslateBrowsePathsToNodeIdsResponse + { + ResponseHeader = new ResponseHeader(), + Results = new[] + { + new BrowsePathResult { StatusCode = StatusCodes.BadNoMatch, Targets = [] } + }.ToArrayOf(), + DiagnosticInfos = default + }); + + Assert.That( + () => WotRegistryClient.ForServerAsync(sessionMock.Object, CreateTelemetry()).AsTask(), + Throws.InstanceOf() + .With.Property(nameof(ServiceResultException.StatusCode)).EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public async Task CreateThingDescriptionGroupCreatesATdGroupAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + + Assert.That(group.GroupId, Is.EqualTo(WotRegistryClient.ThingDescriptionsGroupId)); + Assert.That(group.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + } + + [Test] + public async Task CreateThingModelGroupCreatesATmGroupAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + WotRegistryGroupClient group = await client + .CreateThingModelGroupAsync() + .ConfigureAwait(false); + + Assert.That(group.GroupId, Is.EqualTo(WotRegistryClient.ThingModelsGroupId)); + Assert.That(group.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingModel)); + } + + [Test] + public async Task GetOrCreateGroupReportsCreatedOnlyOnceAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + + (WotRegistryGroupClient first, bool firstCreated) = await client + .GetOrCreateThingDescriptionGroupAsync().ConfigureAwait(false); + (WotRegistryGroupClient second, bool secondCreated) = await client + .GetOrCreateThingDescriptionGroupAsync().ConfigureAwait(false); + + Assert.That(firstCreated, Is.True); + Assert.That(secondCreated, Is.False); + Assert.That(second.GroupNodeId, Is.EqualTo(first.GroupNodeId)); + } + + [Test] + public async Task OpenGroupResolvesAnExistingGroupAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient created = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + + WotRegistryGroupClient opened = await client + .OpenGroupAsync(WotRegistryClient.ThingDescriptionsGroupId) + .ConfigureAwait(false); + + Assert.That(opened.GroupNodeId, Is.EqualTo(created.GroupNodeId)); + } + + [Test] + public void OpenGroupThrowsForUnknownGroup() + { + var mock = new WotRegistrySessionMock(); + + Assert.That( + async () => + { + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + await client.OpenGroupAsync("does-not-exist").ConfigureAwait(false); + }, + Throws.InstanceOf() + .With.Property(nameof(ServiceResultException.StatusCode)).EqualTo(StatusCodes.BadNoMatch)); + } + + [Test] + public async Task GetOrCreateResourceReportsCreatedAndVersionIdAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + + (WotRegistryResourceClient resource, string versionId, bool created) = await group + .GetOrCreateResourceAsync("sensor", "1.0.0").ConfigureAwait(false); + + Assert.That(created, Is.True); + Assert.That(versionId, Is.EqualTo("1.0.0")); + Assert.That(resource.ResourceId, Is.EqualTo("sensor")); + Assert.That(resource.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + + (_, _, bool createdAgain) = await group + .GetOrCreateResourceAsync("sensor", "1.0.0").ConfigureAwait(false); + Assert.That(createdAgain, Is.False); + } + + [Test] + public async Task OpenResourceThrowsForUnknownResourceAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + + Assert.That( + () => group.OpenResourceAsync("does-not-exist").AsTask(), + Throws.InstanceOf() + .With.Property(nameof(ServiceResultException.StatusCode)).EqualTo(StatusCodes.BadNoMatch)); + } + + [Test] + public async Task OpenResourceRejectsEmptyResourceIdAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + + Assert.That( + () => group.OpenResourceAsync(string.Empty).AsTask(), + Throws.ArgumentException.With.Property("ParamName").EqualTo("resourceId")); + } + + [Test] + public async Task ThingModelGroupCreatesThingModelResourceClientAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingModelGroupAsync().ConfigureAwait(false); + + (WotRegistryResourceClient resource, _, _) = await group + .GetOrCreateResourceAsync("model").ConfigureAwait(false); + + Assert.That(resource.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingModel)); + Assert.That(resource.Proxy, Is.InstanceOf()); + } + + [Test] + public async Task UploadNewVersionRoundTripsChunkedContentAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + (WotRegistryResourceClient resource, _, _) = await group + .GetOrCreateResourceAsync("sensor").ConfigureAwait(false); + + byte[] content = Encoding.UTF8.GetBytes(new string('x', 10_000)); + await resource.UploadNewVersionAsync(ByteString.From(content), chunkSize: 4096) + .ConfigureAwait(false); + + ByteString downloaded = await resource.DownloadAsync(chunkSize: 4096).ConfigureAwait(false); + Assert.That(downloaded.ToArray(), Is.EqualTo(content)); + } + + [Test] + public async Task ValidateSetEnabledSetDefaultVersionAndDeleteInvokeExpectedMethodsAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + (WotRegistryResourceClient resource, _, _) = await group + .GetOrCreateResourceAsync("sensor").ConfigureAwait(false); + + WoTValidationOutcomeDataType outcome = await resource.ValidateAsync().ConfigureAwait(false); + Assert.That(outcome.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Success)); + + await resource.SetEnabledAsync(false, expectedEpoch: 0).ConfigureAwait(false); + await resource.SetDefaultVersionAsync("2.0.0", expectedEpoch: 0).ConfigureAwait(false); + await resource.DeleteAsync(expectedEpoch: 0).ConfigureAwait(false); + + Assert.That( + () => group.OpenResourceAsync("sensor").AsTask(), + Throws.InstanceOf()); + } + + [Test] + public async Task RefreshAllReportsFailuresWithoutThrowingAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + await group.GetOrCreateResourceAsync("good").ConfigureAwait(false); + await group.GetOrCreateResourceAsync("bad").ConfigureAwait(false); + mock.InvalidResourceIds.Add("bad"); + + WotRegistryRefreshResult result = await client + .RefreshAllAsync(requestId: "req-1") + .ConfigureAwait(false); + + Assert.That(result.Summary.RequestId, Is.EqualTo("req-1")); + Assert.That(result.HasFailures, Is.True); + Assert.That(result.EnsureSuccess, Throws.InstanceOf()); + } + + [Test] + public async Task RefreshAllSucceedsWhenNothingFailedAsync() + { + var mock = new WotRegistrySessionMock(); + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(mock.Session, CreateTelemetry()) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync().ConfigureAwait(false); + await group.GetOrCreateResourceAsync("good").ConfigureAwait(false); + + WotRegistryRefreshResult result = await client.RefreshAllAsync().ConfigureAwait(false); + + Assert.That(result.HasFailures, Is.False); + Assert.That(result.EnsureSuccess, Throws.Nothing); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Client/WotRegistrySessionMock.cs b/tests/Opc.Ua.WotCon.Tests/Client/WotRegistrySessionMock.cs new file mode 100644 index 0000000000..89dc3b4165 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Client/WotRegistrySessionMock.cs @@ -0,0 +1,562 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Moq; +using Opc.Ua.Client; +using Opc.Ua.XRegistry; + +namespace Opc.Ua.WotCon.Tests.Client +{ + /// + /// A scriptable Moq that behaves like a + /// minimal in-memory WoT Connectivity 1.1 registry: it materializes + /// groups/resources created through the registry Methods, serves + /// TranslateBrowsePaths and HasTypeDefinition + /// Browse resolution, and commits FileType + /// Open/Write/Close uploads as new resource + /// versions. Used to exercise and its + /// wrappers end-to-end without a live server. + /// + internal sealed class WotRegistrySessionMock + { + public WotRegistrySessionMock() + { + var telemetryMock = new Mock(); + var messageContext = ServiceMessageContext.Create(telemetryMock.Object); + WotConNs = messageContext.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + XRegistryNs = messageContext.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + RegistryNodeId = new NodeId("WoTRegistry", WotConNs); + + m_thingModelGroupType = ExpandedNodeId.ToNodeId( + ObjectTypeIds.ThingModelGroupType, messageContext.NamespaceUris); + m_thingDescriptionGroupType = ExpandedNodeId.ToNodeId( + ObjectTypeIds.ThingDescriptionGroupType, messageContext.NamespaceUris); + + m_sessionMock = new Mock(MockBehavior.Strict); + m_sessionMock.SetupGet(s => s.MessageContext).Returns(messageContext); + m_sessionMock.SetupGet(s => s.NamespaceUris).Returns(messageContext.NamespaceUris); + + m_sessionMock + .Setup(s => s.TranslateBrowsePathsToNodeIdsAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Returns, CancellationToken>( + (_, paths, _) => + { + var results = new BrowsePathResult[paths.Count]; + for (int i = 0; i < paths.Count; i++) + { + results[i] = ResolvePath(paths[i]); + } + return new ValueTask( + new TranslateBrowsePathsToNodeIdsResponse + { + ResponseHeader = new ResponseHeader(), + Results = results.ToArrayOf(), + DiagnosticInfos = default + }); + }); + + m_sessionMock + .Setup(s => s.BrowseAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Returns, CancellationToken>( + (_, _, _, descriptions, _) => + { + var results = new BrowseResult[descriptions.Count]; + for (int i = 0; i < descriptions.Count; i++) + { + results[i] = ResolveBrowse(descriptions[i]); + } + return new ValueTask(new BrowseResponse + { + ResponseHeader = new ResponseHeader(), + Results = results.ToArrayOf(), + DiagnosticInfos = default + }); + }); + + m_sessionMock + .Setup(s => s.CallAsync( + It.IsAny(), + It.IsAny>(), + It.IsAny())) + .Returns, CancellationToken>( + (_, requests, _) => + { + var results = new CallMethodResult[requests.Count]; + for (int i = 0; i < requests.Count; i++) + { + CallMethodRequest req = requests[i]; + Capture.Add(req); + results[i] = Dispatch(req); + } + return new ValueTask(new CallResponse + { + ResponseHeader = new ResponseHeader(), + Results = results.ToArrayOf(), + DiagnosticInfos = default + }); + }); + + NodeId Method(ExpandedNodeId id) => ExpandedNodeId.ToNodeId(id, messageContext.NamespaceUris); + m_methods[Method(XRegistry.MethodIds.RegistryType_CreateGroup)] = OnCreateGroup; + m_methods[Method(XRegistry.MethodIds.RegistryType_GetOrCreateGroup)] = OnGetOrCreateGroup; + m_methods[Method(XRegistry.MethodIds.GroupType_CreateResource)] = OnCreateResource; + m_methods[Method(XRegistry.MethodIds.GroupType_GetOrCreateResource)] = OnGetOrCreateResource; + m_methods[Method(XRegistry.MethodIds.GroupType_Delete)] = OnDeleteGroup; + m_methods[Method(XRegistry.MethodIds.ResourceType_Delete)] = OnDeleteResource; + m_methods[Method(MethodIds.WoTDocumentType_Validate)] = OnValidate; + m_methods[Method(MethodIds.WoTDocumentType_SetEnabled)] = OnSetEnabled; + m_methods[Method(MethodIds.WoTDocumentType_SetDefaultVersion)] = OnSetDefaultVersion; + m_methods[Method(MethodIds.WoTRegistryType_Refresh)] = OnRefresh; + m_methods[new NodeId(Ua.Methods.FileType_Open, 0)] = OnOpen; + m_methods[new NodeId(Ua.Methods.FileType_Write, 0)] = OnWrite; + m_methods[new NodeId(Ua.Methods.FileType_Close, 0)] = OnClose; + m_methods[new NodeId(Ua.Methods.FileType_Read, 0)] = OnRead; + } + + public ISession Session => m_sessionMock.Object; + + public ushort WotConNs { get; } + + public ushort XRegistryNs { get; } + + public NodeId RegistryNodeId { get; } + + /// + /// Every CallMethodRequest dispatched, in call order. Used + /// to assert bulk-load dependency ordering. + /// + public List Capture { get; } = []; + + /// + /// Resource ids that Refresh reports as + /// . + /// + public HashSet InvalidResourceIds { get; } = new(StringComparer.Ordinal); + + /// + /// When set, the next matching mutation call fails with this status. + /// + public Dictionary FailNextCallOn { get; } = []; + + private BrowsePathResult ResolvePath(BrowsePath path) + { + NodeId current = path.StartingNode; + foreach (RelativePathElement element in path.RelativePath.Elements) + { + NodeId next = ResolveChild(current, element.TargetName.Name ?? string.Empty); + if (next.IsNull) + { + return new BrowsePathResult { StatusCode = StatusCodes.BadNoMatch, Targets = [] }; + } + current = next; + } + return new BrowsePathResult + { + StatusCode = StatusCodes.Good, + Targets = new[] + { + new BrowsePathTarget + { + TargetId = current, + RemainingPathIndex = uint.MaxValue + } + }.ToArrayOf() + }; + } + + private NodeId ResolveChild(NodeId parent, string name) + { + if (parent == Ua.ObjectIds.Server && name == "WoTRegistry") + { + return RegistryNodeId; + } + if (parent == RegistryNodeId && m_groups.TryGetValue(name, out GroupState? group)) + { + return group.NodeId; + } + foreach (GroupState candidate in m_groups.Values) + { + if (parent == candidate.NodeId && + candidate.Resources.TryGetValue(name, out ResourceState? resource)) + { + return resource.NodeId; + } + } + return NodeId.Null; + } + + private BrowseResult ResolveBrowse(BrowseDescription description) + { + foreach (GroupState group in m_groups.Values) + { + if (group.NodeId == description.NodeId) + { + NodeId typeId = group.Kind == WoTDocumentKindEnum.ThingModel + ? m_thingModelGroupType + : m_thingDescriptionGroupType; + return new BrowseResult + { + StatusCode = StatusCodes.Good, + References = new[] + { + new ReferenceDescription { NodeId = typeId } + }.ToArrayOf() + }; + } + } + return new BrowseResult { StatusCode = StatusCodes.Good, References = [] }; + } + + private CallMethodResult Dispatch(CallMethodRequest req) + { + if (FailNextCallOn.TryGetValue(req.MethodId, out StatusCode status)) + { + FailNextCallOn.Remove(req.MethodId); + return new CallMethodResult + { + StatusCode = status, + InputArgumentResults = [], + OutputArguments = [] + }; + } + if (!m_methods.TryGetValue(req.MethodId, out Func? handler)) + { + throw new InvalidOperationException( + $"WotRegistrySessionMock: no handler registered for method id {req.MethodId}."); + } + Variant[] outputs = handler(req); + return new CallMethodResult + { + StatusCode = StatusCodes.Good, + InputArgumentResults = [], + OutputArguments = outputs.ToArrayOf() + }; + } + + private Variant[] OnCreateGroup(CallMethodRequest req) + { + req.InputArguments[0].TryGetValue(out string groupId); + GroupState group = EnsureGroup(groupId); + return [new Variant(group.NodeId)]; + } + + private Variant[] OnGetOrCreateGroup(CallMethodRequest req) + { + req.InputArguments[0].TryGetValue(out string groupId); + bool existed = m_groups.ContainsKey(groupId); + GroupState group = EnsureGroup(groupId); + return [new Variant(group.NodeId), new Variant(!existed)]; + } + + private GroupState EnsureGroup(string groupId) + { + if (!m_groups.TryGetValue(groupId, out GroupState? group)) + { + WoTDocumentKindEnum kind = string.Equals(groupId, "thingmodels", StringComparison.Ordinal) + ? WoTDocumentKindEnum.ThingModel + : WoTDocumentKindEnum.ThingDescription; + group = new GroupState + { + NodeId = new NodeId("WoTRegistry/groups/" + groupId, WotConNs), + GroupId = groupId, + Kind = kind + }; + m_groups[groupId] = group; + } + return group; + } + + private Variant[] OnCreateResource(CallMethodRequest req) + { + GroupState group = FindGroup(req.ObjectId); + req.InputArguments[0].TryGetValue(out string resourceId); + req.InputArguments[1].TryGetValue(out string versionId); + req.InputArguments[2].TryGetValue(out bool requestFileOpen); + ResourceState resource = EnsureResource(group, resourceId, versionId); + uint fileHandle = requestFileOpen ? OpenWriteHandle(resource) : 0; + return [new Variant(resource.NodeId), new Variant(resource.VersionId), new Variant(fileHandle)]; + } + + private Variant[] OnGetOrCreateResource(CallMethodRequest req) + { + GroupState group = FindGroup(req.ObjectId); + req.InputArguments[0].TryGetValue(out string resourceId); + req.InputArguments[1].TryGetValue(out string versionId); + req.InputArguments[2].TryGetValue(out bool requestFileOpen); + bool existed = group.Resources.ContainsKey(resourceId); + ResourceState resource = EnsureResource(group, resourceId, versionId); + uint fileHandle = requestFileOpen ? OpenWriteHandle(resource) : 0; + return + [ + new Variant(resource.NodeId), + new Variant(resource.VersionId), + new Variant(fileHandle), + new Variant(!existed) + ]; + } + + private static ResourceState EnsureResource(GroupState group, string resourceId, string versionId) + { + if (!group.Resources.TryGetValue(resourceId, out ResourceState? resource)) + { + resource = new ResourceState + { + NodeId = new NodeId( + "WoTRegistry/groups/" + group.GroupId + "/resources/" + resourceId, + group.NodeId.NamespaceIndex), + ResourceId = resourceId, + VersionId = string.IsNullOrEmpty(versionId) ? "1" : versionId + }; + group.Resources[resourceId] = resource; + } + return resource; + } + + private GroupState FindGroup(NodeId groupNodeId) + { + foreach (GroupState group in m_groups.Values) + { + if (group.NodeId == groupNodeId) + { + return group; + } + } + throw new InvalidOperationException("WotRegistrySessionMock: unknown group object id."); + } + + private Variant[] OnDeleteGroup(CallMethodRequest req) + { + GroupState group = FindGroup(req.ObjectId); + m_groups.Remove(group.GroupId); + return []; + } + + private Variant[] OnDeleteResource(CallMethodRequest req) + { + (GroupState group, ResourceState resource) = FindResource(req.ObjectId); + group.Resources.Remove(resource.ResourceId); + return []; + } + + private Variant[] OnValidate(CallMethodRequest req) + { + (_, ResourceState resource) = FindResource(req.ObjectId); + var outcome = new WoTValidationOutcomeDataType + { + FormatValidated = true, + FormatOutcome = InvalidResourceIds.Contains(resource.ResourceId) + ? WoTOutcomeEnum.Failed + : WoTOutcomeEnum.Success + }; +#pragma warning disable CS0618 // Validate generated proxy expects a direct structure Variant. + return [new Variant(outcome)]; +#pragma warning restore CS0618 + } + + private Variant[] OnSetEnabled(CallMethodRequest req) + { + (_, ResourceState resource) = FindResource(req.ObjectId); + req.InputArguments[0].TryGetValue(out bool enabled); + resource.Enabled = enabled; + return []; + } + + private Variant[] OnSetDefaultVersion(CallMethodRequest req) + { + (_, ResourceState resource) = FindResource(req.ObjectId); + req.InputArguments[0].TryGetValue(out string versionId); + resource.VersionId = versionId; + return []; + } + + private (GroupState, ResourceState) FindResource(NodeId resourceNodeId) + { + foreach (GroupState group in m_groups.Values) + { + foreach (ResourceState resource in group.Resources.Values) + { + if (resource.NodeId == resourceNodeId) + { + return (group, resource); + } + } + } + throw new InvalidOperationException("WotRegistrySessionMock: unknown resource object id."); + } + + private uint OpenWriteHandle(ResourceState resource) + { + uint handle = ++m_nextHandle; + m_writeBuffers[handle] = (resource, new List()); + return handle; + } + + private Variant[] OnOpen(CallMethodRequest req) + { + (_, ResourceState resource) = FindResource(req.ObjectId); + req.InputArguments[0].TryGetValue(out byte mode); + uint handle = ++m_nextHandle; + if (mode == 6) + { + m_writeBuffers[handle] = (resource, new List()); + } + else + { + m_readBuffers[handle] = (resource, 0); + } + return [new Variant(handle)]; + } + + private Variant[] OnWrite(CallMethodRequest req) + { + req.InputArguments[0].TryGetValue(out uint handle); + req.InputArguments[1].TryGetValue(out ByteString data); + (ResourceState _, List buffer) = m_writeBuffers[handle]; + buffer.AddRange(data.Span.ToArray()); + return []; + } + + private Variant[] OnRead(CallMethodRequest req) + { + req.InputArguments[0].TryGetValue(out uint handle); + req.InputArguments[1].TryGetValue(out int length); + (ResourceState resource, int position) = m_readBuffers[handle]; + int take = Math.Min(length, resource.Content.Length - position); + take = Math.Max(take, 0); + byte[] chunk = new byte[take]; + Array.Copy(resource.Content, position, chunk, 0, take); + m_readBuffers[handle] = (resource, position + take); + return [new Variant(chunk.ToByteString())]; + } + + private Variant[] OnClose(CallMethodRequest req) + { + req.InputArguments[0].TryGetValue(out uint handle); + if (m_writeBuffers.TryGetValue(handle, out (ResourceState Resource, List Buffer) entry)) + { + entry.Resource.Content = [.. entry.Buffer]; + entry.Resource.Epoch++; + m_writeBuffers.Remove(handle); + } + else + { + m_readBuffers.Remove(handle); + } + return []; + } + + private Variant[] OnRefresh(CallMethodRequest req) + { + req.InputArguments[3].TryGetValue(out string requestId); + var results = new List(); + uint succeeded = 0; + uint failed = 0; + foreach (GroupState group in m_groups.Values) + { + foreach (ResourceState resource in group.Resources.Values) + { + bool isFailed = InvalidResourceIds.Contains(resource.ResourceId); + if (isFailed) + { + failed++; + } + else + { + succeeded++; + } + results.Add(new WoTResourceLoadResultDataType + { + GroupId = group.GroupId, + ResourceId = resource.ResourceId, + VersionId = resource.VersionId, + Kind = group.Kind, + Outcome = isFailed ? WoTOutcomeEnum.Failed : WoTOutcomeEnum.Success, + LoadState = isFailed ? WoTLoadStateEnum.Failed : WoTLoadStateEnum.Active + }); + } + } + uint generation = ++m_generation; + var summary = new WoTRefreshSummaryDataType + { + RequestId = requestId, + Generation = generation, + Outcome = failed > 0 ? WoTOutcomeEnum.Failed : WoTOutcomeEnum.Success, + Total = succeeded + failed, + Succeeded = succeeded, + Failed = failed + }; + return + [ + Variant.FromStructure(summary), + Variant.FromStructure(results.ToArrayOf()), + new Variant(generation) + ]; + } + + private sealed class GroupState + { + public NodeId NodeId; + public string GroupId = string.Empty; + public WoTDocumentKindEnum Kind; + public readonly Dictionary Resources = new(StringComparer.Ordinal); + } + + private sealed class ResourceState + { + public NodeId NodeId; + public string ResourceId = string.Empty; + public string VersionId = string.Empty; + public byte[] Content = []; + public uint Epoch; + public bool Enabled = true; + } + + private readonly Mock m_sessionMock; + private readonly Dictionary> m_methods = []; + private readonly Dictionary m_groups = new(StringComparer.Ordinal); + private readonly Dictionary Buffer)> m_writeBuffers = []; + private readonly Dictionary m_readBuffers = []; + private readonly NodeId m_thingModelGroupType; + private readonly NodeId m_thingDescriptionGroupType; + private uint m_nextHandle; + private uint m_generation; + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/CombinedModelPreservationTests.cs b/tests/Opc.Ua.WotCon.Tests/CombinedModelPreservationTests.cs new file mode 100644 index 0000000000..815221cedf --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/CombinedModelPreservationTests.cs @@ -0,0 +1,157 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Reflection; +using NUnit.Framework; +using Opc.Ua.WotCon.Client; + +namespace Opc.Ua.WotCon.Tests +{ + /// + /// Guards the alignment of the proof to the revised spec model: the + /// Opc.Ua.WotCon generated model is now produced once from the + /// combined Opc.Ua.WotCon NodeSet2 (incorporating the OPC 10100-1 + /// v1.02 surface plus the additive registry nodes in one namespace) instead + /// of the standalone 1.02 ModelDesign and a separate Opc.Ua.WotCon.V2 + /// model. These tests prove that switching the generation source preserved + /// the exact 1.02 NodeIds, the typed method state/result surface and the + /// generated client API, and that the registry types now coexist in the + /// same namespace. + /// + [TestFixture] + [Category("WotCon")] + public class CombinedModelPreservationTests + { + [Test] + public void Incorporated102NodeIdsArePreservedExactly() + { + Assert.Multiple(() => + { + // Well-known ObjectType NodeIds (OPC 10100-1 v1.02). + Assert.That(ObjectTypes.WoTAssetConnectionManagementType, Is.EqualTo(1u)); + Assert.That(ObjectTypes.IWoTAssetType, Is.EqualTo(42u)); + Assert.That(ObjectTypes.WoTAssetFileType, Is.EqualTo(110u)); + + // The well-known WoTAssetConnectionManagement Object. + Assert.That(Objects.WoTAssetConnectionManagement, Is.EqualTo(31u)); + + // The deprecated method-type declarations keep their NodeIds. + Assert.That(Methods.CreateAssetMethodType, Is.EqualTo(90u)); + }); + } + + [Test] + public void Incorporated102BrowseNamesAndMethodsArePreserved() + { + Assert.Multiple(() => + { + Assert.That(BrowseNames.WoTAssetConnectionManagement, + Is.EqualTo("WoTAssetConnectionManagement")); + Assert.That(BrowseNames.CreateAsset, Is.EqualTo("CreateAsset")); + Assert.That(BrowseNames.DeleteAsset, Is.EqualTo("DeleteAsset")); + Assert.That(BrowseNames.DiscoverAssets, Is.EqualTo("DiscoverAssets")); + Assert.That(BrowseNames.ConnectionTest, Is.EqualTo("ConnectionTest")); + Assert.That(BrowseNames.HasWoTComponent, Is.EqualTo("HasWoTComponent")); + }); + } + + [Test] + public void TypedMethodResultsRetainTheirArguments() + { + // Generating the 1.02 methods from the NodeSet2 must still emit the + // typed method state result structures with their arguments (these + // were lost until the NodeSet2 argument-value decoder was fixed). + var create = new CreateAssetMethodStateResult(); + create.AssetId = new NodeId(1); + Assert.That(create.AssetId, Is.EqualTo(new NodeId(1))); + + var conn = new ConnectionTestMethodStateResult + { + Success = true, + Status = "ok" + }; + Assert.That(conn.Success, Is.True); + Assert.That(conn.Status, Is.EqualTo("ok")); + + var discover = new DiscoverAssetsMethodStateResult(); + _ = discover.AssetEndpoints; + Assert.That( + typeof(DiscoverAssetsMethodStateResult).GetProperty( + nameof(DiscoverAssetsMethodStateResult.AssetEndpoints)), + Is.Not.Null); + } + + [Test] + public void GeneratedClientApiExposesTypedAssetMethods() + { + // WoTAssetConnectionManagementTypeClient is the generated client + // proxy the WotConnectivityClient facade delegates to. + MethodInfo? createAsset = typeof(WoTAssetConnectionManagementTypeClient) + .GetMethod("CreateAssetAsync"); + Assert.That(createAsset, Is.Not.Null, + "generated client proxy must expose CreateAssetAsync"); + + Assert.That( + typeof(WoTAssetConnectionManagementTypeClient).GetMethod("ConnectionTestAsync"), + Is.Not.Null); + + // Public client facade surface is preserved. + Assert.That(typeof(WotConnectivityClient).GetMethod("CreateAssetAsync"), + Is.Not.Null); + Assert.That(typeof(WotConnectivityClient).GetMethod("DiscoverAssetsAsync"), + Is.Not.Null); + } + + [Test] + public void AdditiveRegistryTypesCoexistInTheWotConNamespace() + { + Assert.Multiple(() => + { + // Additive registry types now live in the same generated + // Opc.Ua.WotCon namespace (previously Opc.Ua.WotCon.V2), at + // their provisional 64000+ NodeIds. + Assert.That(ObjectTypes.WoTRegistryType, Is.EqualTo(64000u)); + Assert.That(ObjectTypes.ThingDescriptionGroupType, Is.EqualTo(64001u)); + Assert.That(Objects.WoTRegistry, Is.EqualTo(64100u)); + + // Registry DataTypes and enums are generated in Opc.Ua.WotCon. + Assert.That(WoTDocumentKindEnum.ThingDescription, + Is.Not.EqualTo(WoTDocumentKindEnum.ThingModel)); + Assert.That(new WoTValidationOutcomeDataType(), Is.Not.Null); + }); + } + + [Test] + public void ModelDeclaresOneWotConNamespace() + { + Assert.That(Namespaces.WotCon, + Is.EqualTo("http://opcfoundation.org/UA/WoT-Con/")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotConBuilderTests.cs b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotConBuilderTests.cs index 2717b9bce2..3c7ac806f8 100644 --- a/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotConBuilderTests.cs +++ b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotConBuilderTests.cs @@ -102,6 +102,40 @@ public void AddWotConServerRegistersFactoryAndNodeManager() "Expected at least one OpcUaServerNodeManagerRegistration wrapping the WotCon factory."); } + [Test] + public void AddWotConServerRegistersUnderServerFeature() + { + IServiceCollection services = new ServiceCollection(); + services.AddLogging(); + + services.AddOpcUa() + .AddServer(o => + { + o.ApplicationName = "WotConHostServer"; + o.ApplicationUri = "urn:localhost:Test:WotConHostServer"; + o.ProductUri = "uri:opcfoundation.org:Test:WotConHostServer"; + o.EndpointUrls.Add("opc.tcp://localhost:0/WotConHostServer"); + o.AutoAcceptUntrustedCertificates = true; + }) + .Services.AddOpcUa() + .AddWotConServer(o => o.AssetNamespaceUri = "urn:test:wot:assets"); + + using ServiceProvider sp = services.BuildServiceProvider(); + + OpcUaServerNodeManagerRegistration[] registrations = + [.. sp.GetServices()]; + + int wotCount = registrations.Count( + r => r.SyncFactory is WotConnectivityNodeManagerFactory); + Assert.That(wotCount, Is.EqualTo(1), + "WotConnectivityNodeManagerFactory must be registered exactly once " + + "as an OpcUaServerNodeManagerRegistration."); + + WotConnectivityNodeManagerFactory factory = + sp.GetRequiredService(); + Assert.That(factory, Is.Not.Null); + } + [Test] public void AddWotConServerThrowsOnDuplicateRegistration() { @@ -309,7 +343,7 @@ public void AddWotConClientChainsFromClientBuilder() } [Test] - public async Task LazyConnectFalseDoesNotResolveManagedSessionAsync() + public Task LazyConnectFalseDoesNotResolveManagedSessionAsync() { IServiceCollection services = new ServiceCollection(); @@ -322,6 +356,23 @@ public async Task LazyConnectFalseDoesNotResolveManagedSessionAsync() InvalidOperationException ex = Assert.ThrowsAsync( async () => await factory(CancellationToken.None).ConfigureAwait(false))!; Assert.That(ex.Message, Does.Contain(nameof(WotConClientOptions.LazyConnect))); + return Task.CompletedTask; + } + + [Test] + public async Task LazyConnectRequiresRegisteredManagedSessionFactoryAsync() + { + IServiceCollection services = new ServiceCollection(); + + services.AddOpcUa().AddWotConClient(); + + await using ServiceProvider sp = services.BuildServiceProvider(); + Func> factory = + sp.GetRequiredService>>(); + + InvalidOperationException ex = Assert.ThrowsAsync( + async () => await factory(CancellationToken.None).ConfigureAwait(false))!; + Assert.That(ex.Message, Does.Contain("AddClient")); } [Test] diff --git a/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryClientBuilderExtensionsTests.cs b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryClientBuilderExtensionsTests.cs new file mode 100644 index 0000000000..0954fc8815 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryClientBuilderExtensionsTests.cs @@ -0,0 +1,163 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.WotCon.Client; +using Opc.Ua.WotCon.Client.Hosting; + +namespace Opc.Ua.WotCon.Tests.Hosting +{ + /// + /// Unit tests for the WoT Connectivity 1.1 registry client + /// dependency-injection surface: + /// IOpcUaBuilder.AddWotRegistryClient(...). + /// + [TestFixture] + [Category("WotCon")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + public sealed class OpcUaWotRegistryClientBuilderExtensionsTests + { + [Test] + public void AddWotRegistryClientThrowsForNullArgs() + { + IServiceCollection services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + Assert.That(() => ((IOpcUaBuilder)null!) + .AddWotRegistryClient(configure: null), + Throws.ArgumentNullException); + + Assert.That(() => builder.AddWotRegistryClient( + (Microsoft.Extensions.Configuration.IConfiguration)null!), + Throws.ArgumentNullException); + + Assert.That(() => builder.AddWotRegistryClient( + (Microsoft.Extensions.Configuration.IConfigurationSection)null!), + Throws.ArgumentNullException); + } + + [Test] + public async Task AddWotRegistryClientRegistersClientFactoryAsync() + { + IServiceCollection services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotRegistryClient(); + + await using ServiceProvider sp = services.BuildServiceProvider(); + + Func>? factory = + sp.GetService>>(); + Func>? wrapperFactory = + sp.GetService>>(); + Assert.That(factory, Is.Not.Null); + Assert.That(wrapperFactory, Is.Not.Null); + } + + [Test] + public void AddWotRegistryClientChainsFromClientBuilder() + { + IServiceCollection services = new ServiceCollection(); + + IOpcUaClientBuilder builder = services.AddOpcUa() + .AddClient(_ => { }) + .AddWotRegistryClient(); + + Assert.That(builder.Services, Is.SameAs(services)); + Assert.That(services.Any(d => d.ServiceType == + typeof(Func>)), Is.True); + } + + [Test] + public async Task LazyConnectFalseDoesNotResolveManagedSessionAsync() + { + IServiceCollection services = new ServiceCollection(); + + services.AddOpcUa().AddWotRegistryClient(options => options.LazyConnect = false); + + await using ServiceProvider sp = services.BuildServiceProvider(); + Func> factory = + sp.GetRequiredService>>(); + + InvalidOperationException ex = Assert.ThrowsAsync( + async () => await factory(CancellationToken.None).ConfigureAwait(false))!; + Assert.That(ex.Message, Does.Contain(nameof(WotRegistryClientOptions.LazyConnect))); + } + + [Test] + public void AddWotRegistryClientReturnsBuilder() + { + IServiceCollection services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + IOpcUaBuilder returned = builder.AddWotRegistryClient(o => o.LazyConnect = false); + + Assert.That(returned, Is.SameAs(builder)); + } + + [Test] + public async Task AddWotRegistryClientAndAddWotConClientCoexistAsync() + { + IServiceCollection services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotConClient(); + builder.AddWotRegistryClient(); + + await using ServiceProvider sp = services.BuildServiceProvider(); + + Assert.That( + sp.GetService>>(), Is.Not.Null); + Assert.That( + sp.GetService>>(), Is.Not.Null); + } + + [Test] + public void RegistryAccessorDoesNotOwnManagedSession() + { + Type accessor = typeof(OpcUaWotConClientBuilderExtensions) + .GetNestedType("WotRegistryClientAccessor", BindingFlags.NonPublic)!; + + FieldInfo[] managedSessionFields = accessor + .GetFields(BindingFlags.Instance | BindingFlags.NonPublic) + .Where(field => field.FieldType == typeof(ManagedSession)) + .ToArray(); + + Assert.That(managedSessionFields, Is.Empty); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryServerBuilderExtensionsCoverageTests.cs b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryServerBuilderExtensionsCoverageTests.cs new file mode 100644 index 0000000000..c77e5ce943 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryServerBuilderExtensionsCoverageTests.cs @@ -0,0 +1,331 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Linq; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using NUnit.Framework; +using Opc.Ua.Server.Hosting; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Hosting +{ + /// + /// Exercises every overload of + /// IOpcUaBuilder.AddWotRegistryServer(...) defined in + /// OpcUaWotRegistryServerBuilderExtensions: null-guard validation, + /// options binding, and the set of singleton services that must be + /// resolvable from the built without a + /// running OPC UA server. + /// + [TestFixture] + [Category("WotCon")] + [Category("Builder")] + [Parallelizable] + public sealed class OpcUaWotRegistryServerBuilderExtensionsCoverageTests + { + [Test] + public void AddWotRegistryServerWithNoConfigureRegistersServices() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotRegistryServer(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + Assert.That(sp.GetRequiredService(), Is.Not.Null); + Assert.That(sp.GetRequiredService(), Is.Not.Null); + } + + [Test] + public void AddWotRegistryServerWithConfigureActionAppliesOptions() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotRegistryServer(o => o.StorageFolder = "custom-folder"); + + using ServiceProvider sp = services.BuildServiceProvider(); + + WotRegistryServerOptions options = + sp.GetRequiredService>().Value; + Assert.That(options.StorageFolder, Is.EqualTo("custom-folder")); + } + + [Test] + public void AddWotRegistryServerWithNullConfigureActionDoesNotThrow() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + Assert.That( + () => builder.AddWotRegistryServer(configure: null), + Throws.Nothing); + } + + [Test] + public void AddWotRegistryServerWithNullBuilderThrowsArgumentNull() + { + Assert.That( + () => OpcUaWotRegistryServerBuilderExtensions.AddWotRegistryServer( + null!, configure: null), + Throws.ArgumentNullException); + } + + [Test] + public void AddWotRegistryServerWithConfigurationBindsOptions() + { + var configData = new Dictionary + { + [$"{OpcUaWotRegistryServerBuilderExtensions.DefaultConfigurationSection}:StorageFolder"] = + "my-registry-data" + }; + + IConfiguration configuration = new ConfigurationBuilder() + .AddInMemoryCollection(configData) + .Build(); + + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotRegistryServer(configuration); + + using ServiceProvider sp = services.BuildServiceProvider(); + + WotRegistryServerOptions options = + sp.GetRequiredService>().Value; + Assert.That(options.StorageFolder, Is.EqualTo("my-registry-data")); + } + + [Test] + public void AddWotRegistryServerWithNullConfigurationThrowsArgumentNull() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + Assert.That( + () => builder.AddWotRegistryServer((IConfiguration)null!), + Throws.ArgumentNullException); + } + + [Test] + public void AddWotRegistryServerWithConfigurationSectionBindsOptions() + { + var configData = new Dictionary + { + [$"{OpcUaWotRegistryServerBuilderExtensions.DefaultConfigurationSection}:StorageFolder"] = + "section-folder" + }; + + IConfigurationSection section = new ConfigurationBuilder() + .AddInMemoryCollection(configData) + .Build() + .GetSection(OpcUaWotRegistryServerBuilderExtensions.DefaultConfigurationSection); + + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotRegistryServer(section); + + using ServiceProvider sp = services.BuildServiceProvider(); + + WotRegistryServerOptions options = + sp.GetRequiredService>().Value; + Assert.That(options.StorageFolder, Is.EqualTo("section-folder")); + } + + [Test] + public void AddWotRegistryServerWithNullSectionThrowsArgumentNull() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + Assert.That( + () => builder.AddWotRegistryServer((IConfigurationSection)null!), + Throws.ArgumentNullException); + } + + [Test] + public void AddWotRegistryServerWithNullBuilderAndSectionThrowsArgumentNull() + { + IConfigurationSection section = new ConfigurationBuilder() + .Build() + .GetSection("OpcUa"); + + Assert.That( + () => OpcUaWotRegistryServerBuilderExtensions.AddWotRegistryServer( + null!, section), + Throws.ArgumentNullException); + } + + [Test] + public void AddWotRegistryServerReturnsTheSameBuilder() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + IOpcUaBuilder returned = builder.AddWotRegistryServer(); + + Assert.That(returned, Is.SameAs(builder)); + } + + [Test] + public void AddWotRegistryServerRegistersIWotRegistryServiceAsSingleton() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotRegistryService first = sp.GetRequiredService(); + IWotRegistryService second = sp.GetRequiredService(); + + Assert.That(first, Is.SameAs(second), + "IWotRegistryService must be registered as a singleton."); + } + + [Test] + public void AddWotRegistryServerRegistersWotMaterializationCoordinator() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + Assert.That( + services.Any(s => s.ServiceType == typeof(WotMaterializationCoordinator)), + Is.True, + "WotMaterializationCoordinator must be registered in the service collection."); + } + + [Test] + public void AddWotRegistryServerRegistersWotRegistryNodeManagerFactory() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + Assert.That( + services.Any(s => s.ServiceType == typeof(WotRegistryNodeManagerFactory)), + Is.True, + "WotRegistryNodeManagerFactory must be registered in the service collection."); + } + + [Test] + public void AddWotRegistryServerRegistersOpcUaServerNodeManagerRegistration() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + Assert.That( + services.Any(s => s.ServiceType == typeof(OpcUaServerNodeManagerRegistration)), + Is.True, + "OpcUaServerNodeManagerRegistration must be registered in the service collection."); + } + + [Test] + public void AddWotRegistryServerRegistersBinderRegistryInterfaces() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotBinderRegistry registry = sp.GetRequiredService(); + IWotBindingChannelFactory channelFactory = + sp.GetRequiredService(); + WotProtocolBinderRegistry concrete = + sp.GetRequiredService(); + + Assert.That(registry, Is.SameAs(concrete)); + Assert.That(channelFactory, Is.SameAs(concrete)); + } + + [Test] + public void AddWotRegistryServerRegistersTargetVariableResolver() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + Assert.That( + sp.GetRequiredService(), + Is.Not.Null); + } + + [Test] + public void AddWotRegistryServerCalledTwiceDoesNotDoubleRegisterSingleton() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + + builder.AddWotRegistryServer(o => o.StorageFolder = "first"); + builder.AddWotRegistryServer(o => o.StorageFolder = "second"); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotRegistryService first = sp.GetRequiredService(); + IWotRegistryService second = sp.GetRequiredService(); + + Assert.That(first, Is.SameAs(second), + "Calling AddWotRegistryServer twice must still yield a single singleton."); + } + + [Test] + public void AddWotRegistryServerUsesInMemoryStoreWhenNoFolderConfigured() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(o => o.StorageFolder = null); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotRegistryService svc = sp.GetRequiredService(); + Assert.That(svc, Is.InstanceOf()); + } + + [Test] + public void AddWotRegistryServerDefaultConfigSectionIsConstant() + { + Assert.That( + OpcUaWotRegistryServerBuilderExtensions.DefaultConfigurationSection, + Is.EqualTo("OpcUa:WotConRegistry:Server")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryServerBuilderExtensionsTests.cs b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryServerBuilderExtensionsTests.cs new file mode 100644 index 0000000000..d4e88b01e4 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Hosting/OpcUaWotRegistryServerBuilderExtensionsTests.cs @@ -0,0 +1,102 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using Microsoft.Extensions.DependencyInjection; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Tests.Hosting +{ + /// + /// Verifies that AddWotRegistryServer and + /// AddWotProtocolBinders/AddWotBinder/AddWotBindingExecutor + /// register the aggregating exactly + /// once and expose the same singleton instance as both + /// and , + /// regardless of registration order. + /// + [TestFixture] + public sealed class OpcUaWotRegistryServerBuilderExtensionsTests + { + [Test] + public void RegistryThenBindersExposesTheSameSingletonForBothInterfaces() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + builder.AddWotProtocolBinders(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotBinderRegistry registry = sp.GetRequiredService(); + IWotBindingChannelFactory channelFactory = sp.GetRequiredService(); + WotProtocolBinderRegistry concrete = sp.GetRequiredService(); + + Assert.That(registry, Is.SameAs(concrete)); + Assert.That(channelFactory, Is.SameAs(concrete)); + } + + [Test] + public void BindersThenRegistryExposesTheSameSingletonForBothInterfaces() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotProtocolBinders(); + builder.AddWotRegistryServer(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotBinderRegistry registry = sp.GetRequiredService(); + IWotBindingChannelFactory channelFactory = sp.GetRequiredService(); + WotProtocolBinderRegistry concrete = sp.GetRequiredService(); + + Assert.That(registry, Is.SameAs(concrete)); + Assert.That(channelFactory, Is.SameAs(concrete)); + } + + [Test] + public void RegistryOnlyStillExposesAWorkingRegistryAndChannelFactory() + { + var services = new ServiceCollection(); + IOpcUaBuilder builder = services.AddOpcUa(); + builder.AddWotRegistryServer(); + + using ServiceProvider sp = services.BuildServiceProvider(); + + IWotBinderRegistry registry = sp.GetRequiredService(); + IWotBindingChannelFactory channelFactory = sp.GetRequiredService(); + WotProtocolBinderRegistry concrete = sp.GetRequiredService(); + + Assert.That(registry, Is.SameAs(concrete)); + Assert.That(channelFactory, Is.SameAs(concrete)); + Assert.That(registry.Capabilities, Is.Empty, + "With no binders registered, the shared registry advertises no capabilities."); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/LifecycleWotProjectionHostBindingTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/LifecycleWotProjectionHostBindingTests.cs new file mode 100644 index 0000000000..784b4e7d8b --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/LifecycleWotProjectionHostBindingTests.cs @@ -0,0 +1,122 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; +using Moq; +using NUnit.Framework; +using Opc.Ua.Server; +using Opc.Ua.Server.Fluent; +using Opc.Ua.Server.RuntimeNodeSet; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server.Materialization; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Verifies that installs + /// so each runtime + /// NodeSet generation owns its own binding runtime, built from the + /// injected and the + /// document's prepared binding plans. + /// + [TestFixture] + public sealed class LifecycleWotProjectionHostBindingTests + { + [Test] + public async Task ConfigureAsyncIsInstalledAndForwardsBindingPlansToTheRuntimeFactory() + { + var runtimeFactory = new RecordingProjectionBindingRuntimeFactory(); + var host = new LifecycleWotProjectionHost(Mock.Of(), runtimeFactory); + + var harness = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: harness.ScalarNodeIdText)); + ArrayOf plans = new[] + { + WotProjectionBindingRuntimeTestHarness.Plan(form) + }.ToArrayOf(); + var document = new WotProjectionDocument( + "closure-a", [], plans); + + RuntimeNodeSetOptions options = InvokeBuildOptions(host, document); + + Assert.That(options.ConfigureAsync, Is.Not.Null, + "The host must install ConfigureAsync when a runtime factory is supplied."); + + IAsyncDisposable? result = await options.ConfigureAsync!( + harness.Builder, CancellationToken.None).ConfigureAwait(false); + + Assert.That(runtimeFactory.LastBuilder, Is.SameAs(harness.Builder)); + Assert.That(runtimeFactory.LastBindingPlans.Count, Is.EqualTo(1)); + Assert.That(runtimeFactory.LastBindingPlans[0], Is.SameAs(plans[0])); + Assert.That(result, Is.Null); + } + + [Test] + public void ConfigureAsyncIsNotInstalledWhenNoRuntimeFactoryIsSupplied() + { + var host = new LifecycleWotProjectionHost(Mock.Of()); + var document = new WotProjectionDocument("closure-a", []); + + RuntimeNodeSetOptions options = InvokeBuildOptions(host, document); + + Assert.That(options.ConfigureAsync, Is.Null, + "Without a runtime factory the host must preserve the pre-existing (data-only) behavior."); + } + + private static RuntimeNodeSetOptions InvokeBuildOptions( + LifecycleWotProjectionHost host, WotProjectionDocument document) + { + MethodInfo method = typeof(LifecycleWotProjectionHost).GetMethod( + "BuildOptions", BindingFlags.NonPublic | BindingFlags.Instance)!; + return (RuntimeNodeSetOptions)method.Invoke(host, [document])!; + } + + private sealed class RecordingProjectionBindingRuntimeFactory : IWotProjectionBindingRuntimeFactory + { + public INodeManagerBuilder? LastBuilder { get; private set; } + + public ArrayOf LastBindingPlans { get; private set; } + + public ValueTask CreateAsync( + INodeManagerBuilder builder, + ArrayOf bindingPlans, + CancellationToken cancellationToken = default) + { + LastBuilder = builder; + LastBindingPlans = bindingPlans; + return new ValueTask((IAsyncDisposable?)null); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotBindingChannelSlotTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotBindingChannelSlotTests.cs new file mode 100644 index 0000000000..04f326c3a7 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotBindingChannelSlotTests.cs @@ -0,0 +1,138 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server.Materialization; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises directly: single-flight + /// open caching, failed-open eviction (already covered end-to-end through + /// ), and — the focus here — + /// hardening against GetAsync racing with, or being called after, + /// DisposeAsync, so a channel this slot opens can never escape + /// disposal. + /// + [TestFixture] + public sealed class WotBindingChannelSlotTests + { + [Test] + public async Task GetAsyncAfterDisposeThrowsObjectDisposedExceptionAndNeverOpensAChannel() + { + var factory = new FakeWotBindingChannelFactory(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, new WotTargetMappingDescriptor(targetNodeId: "ns=1;s=x")); + var slot = new WotBindingChannelSlot(form, factory); + + await slot.DisposeAsync().ConfigureAwait(false); + + Assert.ThrowsAsync( + async () => await slot.GetAsync(CancellationToken.None).ConfigureAwait(false)); + Assert.That(factory.OpenCount, Is.Zero, "A disposed slot must never open a channel."); + } + + [Test] + public async Task GetAsyncAfterDisposeOfAnOpenedSlotThrowsAndNeverOpensASecondChannel() + { + var factory = new FakeWotBindingChannelFactory(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, new WotTargetMappingDescriptor(targetNodeId: "ns=1;s=x")); + var channel = new FakeWotBindingChannel(form); + factory.SetChannel(form, channel); + var slot = new WotBindingChannelSlot(form, factory); + + await slot.GetAsync(CancellationToken.None).ConfigureAwait(false); + await slot.DisposeAsync().ConfigureAwait(false); + + Assert.ThrowsAsync( + async () => await slot.GetAsync(CancellationToken.None).ConfigureAwait(false)); + Assert.That(factory.OpenCount, Is.EqualTo(1), "A disposed slot must never open a second channel."); + Assert.That(channel.DisposeCount, Is.EqualTo(1)); + } + + [Test] + public async Task DisposeAsyncRacingAnInFlightGetAsyncDisposesTheOpenedChannelExactlyOnceNoLeak() + { + var factory = new FakeWotBindingChannelFactory(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, new WotTargetMappingDescriptor(targetNodeId: "ns=1;s=x")); + var channel = new FakeWotBindingChannel(form); + var openGate = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + factory.SetOpener(form, async () => + { + await openGate.Task.ConfigureAwait(false); + return channel; + }); + var slot = new WotBindingChannelSlot(form, factory); + + // GetAsync starts the open (which will not complete until the + // gate is released) and DisposeAsync races it while the open is + // still in flight. + Task getTask = slot.GetAsync(CancellationToken.None).AsTask(); + Task disposeTask = slot.DisposeAsync().AsTask(); + + openGate.SetResult(true); + IWotBindingChannel got = await getTask.ConfigureAwait(false); + await disposeTask.ConfigureAwait(false); + + Assert.That(got, Is.SameAs(channel)); + Assert.That(factory.OpenCount, Is.EqualTo(1), "Single-flight must hold even when racing dispose."); + Assert.That(channel.DisposeCount, Is.EqualTo(1), + "The channel opened concurrently with dispose must still be disposed exactly once — no leak."); + + // Post-race: the slot is disposed, so no later GetAsync may open + // another channel. + Assert.ThrowsAsync( + async () => await slot.GetAsync(CancellationToken.None).ConfigureAwait(false)); + Assert.That(factory.OpenCount, Is.EqualTo(1)); + } + + [Test] + public async Task DisposeAsyncIsIdempotentSecondCallDoesNotRedisposeOrThrow() + { + var factory = new FakeWotBindingChannelFactory(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, new WotTargetMappingDescriptor(targetNodeId: "ns=1;s=x")); + var channel = new FakeWotBindingChannel(form); + factory.SetChannel(form, channel); + var slot = new WotBindingChannelSlot(form, factory); + await slot.GetAsync(CancellationToken.None).ConfigureAwait(false); + + await slot.DisposeAsync().ConfigureAwait(false); + await slot.DisposeAsync().ConfigureAwait(false); + + Assert.That(channel.DisposeCount, Is.EqualTo(1)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotBindingCoordinatorTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotBindingCoordinatorTests.cs new file mode 100644 index 0000000000..e64322a5d7 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotBindingCoordinatorTests.cs @@ -0,0 +1,490 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.Planners; +using Opc.Ua.WotCon.Tests.Support; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises the materialization coordinator's binding lifecycle: strict vs + /// degraded closure selection, non-executable degradation, and the + /// activate-after-commit / deactivate-before-retire ordering. + /// + [TestFixture] + public sealed class WotBindingCoordinatorTests + { + private static byte[] Td(string id, string href, string extraTerms = "") + { + string terms = string.IsNullOrEmpty(extraTerms) ? string.Empty : "," + extraTerms; + string td = "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",\"@type\":\"uav:object\"," + + "\"id\":\"" + + id + + "\",\"title\":\"t\"," + + "\"properties\":{\"value\":{\"type\":\"number\",\"forms\":[{\"href\":\"" + + href + + "\"" + + terms + + "}]}}}"; + return Encoding.UTF8.GetBytes(td); + } + + private static WotRegistryService Registry() + { + return new(); + } + + private static Task Upsert( + WotRegistryService registry, string resourceId, byte[] content) + { + return registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = content + }).AsTask(); + } + + [Test] + public async Task StrictUnsupportedFormFailsClosure() + { + WotRegistryService registry = Registry(); + var host = new FakeWotProjectionHost(); + var binders = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()) + { + StrictBindings = true + }; + await Upsert(registry, "td-a", Td("urn:td-a", "ftp://legacy/x")).ConfigureAwait(false); + + WotRefreshResult result = await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(host.AddCount, Is.Zero, "A strict closure with unsupported forms must not project."); + Assert.That(result.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public async Task DegradedUnsupportedFormMaterializesWithWarningAndBindingFailure() + { + WotRegistryService registry = Registry(); + var host = new FakeWotProjectionHost(); + var binders = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()) + { + StrictBindings = false + }; + var events = new List(); + coordinator.Event += (_, e) => events.Add(e); + await Upsert(registry, "td-a", Td("urn:td-a", "ftp://legacy/x")).ConfigureAwait(false); + + WotRefreshResult result = await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(host.AddCount, Is.EqualTo(1), "A degraded closure still materializes nodes."); + Assert.That(result.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Warning)); + Assert.That(events.Any(e => e.Kind == WotMaterializationEventKind.BindingFailure), Is.True, + "Degraded mode must emit a binding failure event."); + } + + [Test] + public async Task NonExecutableFormDegradesClosure() + { + WotRegistryService registry = Registry(); + var host = new FakeWotProjectionHost(); + var binders = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()); + await Upsert( + registry, "td-a", Td("urn:td-a", "coap://d/temp", "\"cov:method\":\"GET\"")).ConfigureAwait(false); + + WotRefreshResult result = await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(host.AddCount, Is.EqualTo(1)); + Assert.That(result.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Warning), + "A validated but non-executable binding degrades the closure."); + } + + [Test] + public async Task ExecutableFormIsNotDegraded() + { + WotRegistryService registry = Registry(); + var host = new FakeWotProjectionHost(); + var binders = new WotProtocolBinderRegistry( + [new MemoryWotBinder()], + [new MemoryWotBindingExecutor(new MemoryWotStore())]); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()); + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/value")).ConfigureAwait(false); + + WotRefreshResult result = await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(result.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Success), + "A fully executable binding is not degraded."); + } + + [Test] + public async Task RefreshPassesPreparedBindingPlansIntoTheProjectionDocument() + { + WotRegistryService registry = Registry(); + var host = new FakeWotProjectionHost(); + var binders = new WotProtocolBinderRegistry( + [new MemoryWotBinder()], + [new MemoryWotBindingExecutor(new MemoryWotStore())]); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()); + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/value")).ConfigureAwait(false); + + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + HostOperation operation = host.Operations.Single(o => o.Op == "add"); + Assert.That(operation.Document, Is.Not.Null); + Assert.That(operation.Document!.BindingPlans.Count, Is.EqualTo(1), + "The coordinator must pass exactly one prepared plan per projected member."); + Assert.That(operation.Document.BindingPlans[0].HasExecutableForms, Is.True, + "The plan passed to the host must be the executable plan the coordinator prepared."); + } + + [Test] + public async Task LifecycleActivatesAfterCommitDeactivatesBeforeRetire() + { + WotRegistryService registry = Registry(); + var timeline = new List(); + var host = new RecordingProjectionHost(timeline); + var binders = new RecordingBinderRegistry(timeline); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()); + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/value")).ConfigureAwait(false); + + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + await registry.DeleteResourceAsync(WotRegistryGroups.ThingDescriptions, "td-a").ConfigureAwait(false); + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + int add = timeline.IndexOf("add"); + int activate = timeline.IndexOf("activate"); + int deactivate = timeline.IndexOf("deactivate"); + int remove = timeline.IndexOf("remove"); + + Assert.That(add, Is.GreaterThanOrEqualTo(0)); + Assert.That(activate, Is.GreaterThan(add), "Activate must follow the projection commit."); + Assert.That(deactivate, Is.GreaterThanOrEqualTo(0)); + Assert.That(remove, Is.GreaterThan(deactivate), "Deactivate must precede retirement."); + } + + [Test] + public async Task UpdateDeactivatesExactlyOldPlansInCorrectOrder() + { + WotRegistryService registry = Registry(); + var recorder = new PlanRecorder(); + var host = new PlanRecordingHost(recorder); + var binders = new PlanRecordingBinderRegistry(recorder); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()); + + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/v1")).ConfigureAwait(false); + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + // A content change triggers a shadow reload (an update, not a first add). + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/v2")).ConfigureAwait(false); + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + WotBindingPlan planV1 = binders.ActivatedPlans[0]; + WotBindingPlan planV2 = binders.ActivatedPlans[1]; + Assert.That(planV2, Is.Not.SameAs(planV1), "The update must prepare a new plan."); + + // Exactly one deactivation, and it is the old plan (never the new one). + Assert.That(binders.DeactivatedPlans, Has.Count.EqualTo(1)); + Assert.That(binders.DeactivatedPlans[0], Is.SameAs(planV1), + "Only the previously tracked plan may be deactivated on update."); + + // Order: the shadow switch happens first, then the old plan is + // deactivated, then the new plan is activated. + int shadow = recorder.IndexOf("shadow"); + int deactivateOld = recorder.IndexOf("deactivate", planV1); + int activateNew = recorder.IndexOf("activate", planV2); + Assert.That(shadow, Is.GreaterThanOrEqualTo(0), "The update must shadow-reload the projection."); + Assert.That(deactivateOld, Is.GreaterThan(shadow), + "The old plan must be deactivated only after the shadow switch succeeds."); + Assert.That(activateNew, Is.GreaterThan(deactivateOld), + "The new plan must be activated after the old plan is deactivated."); + } + + [Test] + public async Task UpdateShadowReloadFailsOldPlansRemainActive() + { + WotRegistryService registry = Registry(); + var recorder = new PlanRecorder(); + var host = new PlanRecordingHost(recorder); + var binders = new PlanRecordingBinderRegistry(recorder); + using var coordinator = new WotMaterializationCoordinator( + registry, host, binders, documentConverter: new FakeWotDocumentConverter()); + + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/v1")).ConfigureAwait(false); + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + WotBindingPlan planV1 = binders.ActivatedPlans[0]; + + // The shadow switch fails: the old plans must remain active (no + // deactivation) and no new plan may be activated (rollback ordering). + host.FailShadowReload = true; + await Upsert(registry, "td-a", Td("urn:td-a", "mem://store/v2")).ConfigureAwait(false); + await coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(binders.DeactivatedPlans, Is.Empty, + "A failed shadow switch must not deactivate the still-active old plan."); + Assert.That(binders.ActivatedPlans, Has.Count.EqualTo(1), + "A failed shadow switch must not activate the new plan."); + Assert.That(binders.ActivatedPlans[0], Is.SameAs(planV1)); + } + + private sealed class PlanRecorder + { + public List<(string Action, WotBindingPlan? Plan)> Events { get; } = []; + + public void Record(string action, WotBindingPlan? plan = null) + { + lock (Events) + { + Events.Add((action, plan)); + } + } + + public int IndexOf(string action, WotBindingPlan? plan = null) + { + lock (Events) + { + return Events.FindIndex(e => + e.Action == action && (plan is null || ReferenceEquals(e.Plan, plan))); + } + } + } + + private sealed class PlanRecordingHost : IWotProjectionHost + { + public PlanRecordingHost(PlanRecorder recorder) + { + m_recorder = recorder; + } + + public bool FailShadowReload { get; set; } + + public ValueTask AddAsync( + WotProjectionDocument document, CancellationToken cancellationToken = default) + { + m_recorder.Record("add"); + return new ValueTask(Handle(document)); + } + + public ValueTask ShadowReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + if (FailShadowReload) + { + throw new System.IO.IOException("Injected shadow reload failure."); + } + m_recorder.Record("shadow"); + return new ValueTask(Handle(document)); + } + + public ValueTask ImmediateReloadAsync( + WotProjectionHandle current, WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + m_recorder.Record("immediate"); + return new ValueTask(Handle(document)); + } + + public ValueTask RemoveAsync(WotProjectionHandle handle, CancellationToken cancellationToken = default) + { + m_recorder.Record("remove"); + return default; + } + + private static WotProjectionHandle Handle(WotProjectionDocument document) + { + return new(document.ClosureKey, 1, new FakeWotProjectionRegistration(), [], 0); + } + + private readonly PlanRecorder m_recorder; + } + + private sealed class PlanRecordingBinderRegistry : IWotBinderRegistry + { + public PlanRecordingBinderRegistry(PlanRecorder recorder) + { + m_recorder = recorder; + } + + public List ActivatedPlans { get; } = []; + public List DeactivatedPlans { get; } = []; + + public IReadOnlyList Capabilities { get; } + = []; + + public WotBindingPlan Prepare(WotBindingPlanRequest request) + { + var entry = new WotCompiledForm( + new WotBindingIdentity("rec", "1.0", "urn:rec"), + WotAffordanceKind.Property, "value", "/properties/value/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("rec", null, -1, "rec://x"), + new WotAddressingDescriptor("value"), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ReadProperty, "readproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], isExecutable: true); + // A fresh plan instance per Prepare so old and new plans are + // distinguishable by reference identity. + return new WotBindingPlan(request.ResourceXid, + [], + [entry], + [], + []); + } + + public ValueTask ActivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + ActivatedPlans.Add(plan); + m_recorder.Record("activate", plan); + return default; + } + + public ValueTask DeactivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + DeactivatedPlans.Add(plan); + m_recorder.Record("deactivate", plan); + return default; + } + + private readonly PlanRecorder m_recorder; + } + + private sealed class RecordingProjectionHost : IWotProjectionHost + { + public RecordingProjectionHost(List timeline) + { + m_timeline = timeline; + } + + public ValueTask AddAsync( + WotProjectionDocument document, CancellationToken cancellationToken = default) + { + m_timeline.Add("add"); + return new ValueTask(Handle(document)); + } + + public ValueTask ShadowReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + m_timeline.Add("shadow"); + return new ValueTask(Handle(document)); + } + + public ValueTask ImmediateReloadAsync( + WotProjectionHandle current, WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + m_timeline.Add("immediate"); + return new ValueTask(Handle(document)); + } + + public ValueTask RemoveAsync(WotProjectionHandle handle, CancellationToken cancellationToken = default) + { + m_timeline.Add("remove"); + return default; + } + + private static WotProjectionHandle Handle(WotProjectionDocument document) + { + return new(document.ClosureKey, 1, new FakeWotProjectionRegistration(), [], 0); + } + + private readonly List m_timeline; + } + + private sealed class RecordingBinderRegistry : IWotBinderRegistry + { + public RecordingBinderRegistry(List timeline) + { + m_timeline = timeline; + } + + public IReadOnlyList Capabilities { get; } + = []; + + public WotBindingPlan Prepare(WotBindingPlanRequest request) + { + var entry = new WotCompiledForm( + new WotBindingIdentity("rec", "1.0", "urn:rec"), + WotAffordanceKind.Property, "value", "/properties/value/forms/0", + WoTBindingCapabilityEnum.ReadProperty, "readproperty", + new WotEndpointDescriptor("rec", null, -1, "rec://x"), + new WotAddressingDescriptor("value"), + new WotOperationDescriptor(WoTBindingCapabilityEnum.ReadProperty, "readproperty", "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], isExecutable: true); + return new WotBindingPlan(request.ResourceXid, + [], + [entry], + [], + []); + } + + public ValueTask ActivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + m_timeline.Add("activate"); + return default; + } + + public ValueTask DeactivateAsync(WotBindingPlan plan, CancellationToken cancellationToken = default) + { + m_timeline.Add("deactivate"); + return default; + } + + private readonly List m_timeline; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotDependencyGraphExtendedTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotDependencyGraphExtendedTests.cs new file mode 100644 index 0000000000..189e27d3ab --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotDependencyGraphExtendedTests.cs @@ -0,0 +1,436 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Supplemental tests for covering + /// Resolve, ExtractReferences edge cases, closure + /// diagnostics, and the and + /// value objects. + /// + [TestFixture] + [Category("WotCon")] + [Parallelizable(ParallelScope.All)] + public sealed class WotDependencyGraphExtendedTests + { + private static async Task SnapshotAsync( + params (WoTDocumentKindEnum Kind, string Id, string ThingId, byte[] Content)[] docs) + { + using var service = new WotRegistryService(); + foreach ((WoTDocumentKindEnum kind, string id, _, byte[] content) in docs) + { + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = kind == WoTDocumentKindEnum.ThingModel + ? WotRegistryGroups.ThingModels + : WotRegistryGroups.ThingDescriptions, + ResourceId = id, + Kind = kind, + Content = content + }); + } + return service.Current; + } + + private static async Task SnapshotAsync( + params (WoTDocumentKindEnum Kind, string Id, byte[] Content)[] docs) + { + using var service = new WotRegistryService(); + foreach ((WoTDocumentKindEnum kind, string id, byte[] content) in docs) + { + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = kind == WoTDocumentKindEnum.ThingModel + ? WotRegistryGroups.ThingModels + : WotRegistryGroups.ThingDescriptions, + ResourceId = id, + Kind = kind, + Content = content + }); + } + return service.Current; + } + + [Test] + public async Task ResolveWithNullSnapshotReturnsNull() + { + WotResource? result = WotDependencyGraph.Resolve(null!, "urn:some"); + Assert.That(result, Is.Null); + } + + [Test] + public async Task ResolveWithNullHrefReturnsNull() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm", TestMaterialization.Tm("urn:tm"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, null!); + Assert.That(result, Is.Null); + } + + [Test] + public async Task ResolveWithEmptyHrefReturnsNull() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm", TestMaterialization.Tm("urn:tm"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, string.Empty); + Assert.That(result, Is.Null); + } + + [Test] + public async Task ResolveWithWhitespaceHrefReturnsNull() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm", TestMaterialization.Tm("urn:tm"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, " "); + Assert.That(result, Is.Null); + } + + [Test] + public async Task ResolveByThingIdFindsResource() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm-res", TestMaterialization.Tm("urn:my-thing"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, "urn:my-thing"); + Assert.That(result, Is.Not.Null); + Assert.That(result!.ResourceId, Is.EqualTo("tm-res")); + } + + [Test] + public async Task ResolveByXidFindsResource() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "my-tm", + TestMaterialization.Tm("urn:other"))); + + string xid = snapshot.AllResources().First().Xid; + WotResource? result = WotDependencyGraph.Resolve(snapshot, xid); + Assert.That(result, Is.Not.Null); + Assert.That(result!.ResourceId, Is.EqualTo("my-tm")); + } + + [Test] + public async Task ResolveByResourceIdFindsResource() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingDescription, "my-td", + TestMaterialization.Td("urn:td"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, "my-td"); + Assert.That(result, Is.Not.Null); + Assert.That(result!.ResourceId, Is.EqualTo("my-td")); + } + + [Test] + public async Task ResolveWithFragmentTrimsFragment() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm-frag", + TestMaterialization.Tm("urn:frag-thing"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, "urn:frag-thing#someProperty"); + Assert.That(result, Is.Not.Null); + Assert.That(result!.ResourceId, Is.EqualTo("tm-frag")); + } + + [Test] + public async Task ResolveByRegistryUriFindsResource() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "myresource", + TestMaterialization.Tm("urn:id"))); + + string group = WotRegistryGroups.ThingModels; + string uri = $"urn:wot:{group}/myresource"; + WotResource? result = WotDependencyGraph.Resolve(snapshot, uri); + Assert.That(result, Is.Not.Null); + Assert.That(result!.ResourceId, Is.EqualTo("myresource")); + } + + [Test] + public async Task ResolvePrefersTmOverTd() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tmx", TestMaterialization.Tm("urn:shared-id")), + (WoTDocumentKindEnum.ThingDescription, "tdx", + TestMaterialization.Td("urn:shared-id"))); + + WotResource? result = WotDependencyGraph.Resolve(snapshot, "urn:shared-id"); + Assert.That(result, Is.Not.Null); + Assert.That(result!.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingModel), + "TM should be preferred over TD when both match the same href."); + } + + [Test] + public void ExtractReferencesReturnsEmptyForInvalidJson() + { + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(TestMaterialization.InvalidJson(), 64); + Assert.That(refs, Is.Empty); + } + + [Test] + public void ExtractReferencesReturnsEmptyForNonObjectJson() + { + byte[] arrayJson = Encoding.UTF8.GetBytes("[1,2,3]"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(arrayJson, 64); + Assert.That(refs, Is.Empty); + } + + [Test] + public void ExtractReferencesFindsLinksRelType() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"links\":[{\"rel\":\"type\",\"href\":\"urn:tm-base\"}]}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs.Any(r => r.Href == "urn:tm-base" && r.RefType == "type"), Is.True); + } + + [Test] + public void ExtractReferencesFindsLinksRelTmSubmodel() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"links\":[{\"rel\":\"tm:submodel\",\"href\":\"urn:sub\"}]}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs.Any(r => r.Href == "urn:sub" && r.RefType == "tm:submodel"), Is.True); + } + + [Test] + public void ExtractReferencesIgnoresLinksWithUnrecognizedRel() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"links\":[{\"rel\":\"related\",\"href\":\"urn:other\"}]}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs, Is.Empty); + } + + [Test] + public void ExtractReferencesIgnoresLinksWithoutHref() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"links\":[{\"rel\":\"tm:extends\"}]}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs, Is.Empty); + } + + [Test] + public void ExtractReferencesFindsTmRef() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"properties\":{\"p1\":{\"tm:ref\":\"urn:base#/properties/p1\"}}}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs.Any(r => r.RefType == "tm:ref"), Is.True); + } + + [Test] + public void ExtractReferencesFindsTmExtendsArray() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"tm:extends\":[\"urn:base1\",\"urn:base2\"]}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs.Count(r => r.RefType == "tm:extends"), Is.EqualTo(2)); + } + + [Test] + public void ExtractReferencesFindsTmExtendsObjectWithHref() + { + byte[] doc = Encoding.UTF8.GetBytes( + "{\"tm:extends\":[{\"href\":\"urn:obj-base\"}]}"); + IReadOnlyList<(string Href, string RefType)> refs = + WotDependencyGraph.ExtractReferences(doc, 64); + Assert.That(refs.Any(r => r.Href == "urn:obj-base"), Is.True); + } + + [Test] + public async Task BuildClosuresEmptySelectionReturnsEmpty() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingDescription, "td", + TestMaterialization.Td("urn:td"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [], 64); + Assert.That(closures, Is.Empty); + } + + [Test] + public async Task BuildClosuresDiagnosticsIncludesMissingDependencyMessage() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingDescription, "td", + TestMaterialization.Td("urn:td", extendsHrefs: "urn:nonexistent"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + WotDependencyClosure closure = closures[0]; + Assert.That(closure.HasMissingDependency, Is.True); + Assert.That(closure.Diagnostics, Has.Length.GreaterThan(0)); + Assert.That(closure.Diagnostics.Any(d => d.Contains("urn:nonexistent", StringComparison.Ordinal)), Is.True); + } + + [Test] + public async Task BuildClosuresDiagnosticsIncludesCycleMessage() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "a", + TestMaterialization.Tm("urn:a", extendsHrefs: "urn:b")), + (WoTDocumentKindEnum.ThingModel, "b", + TestMaterialization.Tm("urn:b", extendsHrefs: "urn:a"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + WotDependencyClosure closure = closures[0]; + Assert.That(closure.HasCycle, Is.True); + Assert.That(closure.Diagnostics, Has.Length.GreaterThan(0)); + Assert.That(closure.Diagnostics.Any(d => d.Contains("cycle", StringComparison.Ordinal)), Is.True); + } + + [Test] + public async Task BuildClosuresClosureKeyIsJoinedSortedXids() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm", + TestMaterialization.Tm("urn:tm")), + (WoTDocumentKindEnum.ThingDescription, "td", + TestMaterialization.Td("urn:td", extendsHrefs: "urn:tm"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + WotDependencyClosure closure = closures[0]; + string expectedKey = string.Join("|", + closure.Members.OrderBy(m => m.Xid, StringComparer.Ordinal).Select(m => m.Xid)); + Assert.That(closure.Key, Is.EqualTo(expectedKey)); + } + + [Test] + public async Task BuildClosuresDependenciesAreRecorded() + { + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "tm", + TestMaterialization.Tm("urn:tm")), + (WoTDocumentKindEnum.ThingDescription, "td", + TestMaterialization.Td("urn:td", extendsHrefs: "urn:tm"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + WotDependencyClosure closure = closures[0]; + Assert.That(closure.Dependencies, Is.Not.Empty); + WotDependency dep = closure.Dependencies[0]; + Assert.That(dep.Resolved, Is.True); + Assert.That(dep.TargetHref, Is.EqualTo("urn:tm")); + Assert.That(dep.RefType, Is.EqualTo("tm:extends")); + } + + [Test] + public async Task BuildClosuresDiamondPatternYieldsSingleClosure() + { + // td → tmA and td → tmB, tmA → tmBase, tmB → tmBase + // All four in one closure (all reachable from td). + byte[] tmBase = TestMaterialization.Tm("urn:base"); + byte[] tmA = TestMaterialization.Tm("urn:a", extendsHrefs: "urn:base"); + byte[] tmB = TestMaterialization.Tm("urn:b", extendsHrefs: "urn:base"); + byte[] td = Encoding.UTF8.GetBytes( + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"id\":\"urn:td\"," + + "\"title\":\"td\"," + + "\"links\":[{\"rel\":\"tm:extends\",\"href\":\"urn:a\"}," + + "{\"rel\":\"tm:extends\",\"href\":\"urn:b\"}]}"); + + WotRegistrySnapshot snapshot = await SnapshotAsync( + (WoTDocumentKindEnum.ThingModel, "base", tmBase), + (WoTDocumentKindEnum.ThingModel, "a", tmA), + (WoTDocumentKindEnum.ThingModel, "b", tmB), + (WoTDocumentKindEnum.ThingDescription, "td", td)); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + Assert.That(closures, Has.Length.EqualTo(1), + "Diamond dependency should group all four resources into one closure."); + Assert.That(closures[0].IsProjectable, Is.True); + Assert.That(closures[0].Members, Has.Length.EqualTo(4)); + } + + [Test] + public void WotDependencyPropertiesAreCorrect() + { + var dep = new WotDependency( + sourceXid: "/groups/g/resources/r1", + targetHref: "urn:target", + targetXid: "/groups/g/resources/r2", + refType: "tm:extends", + resolved: true); + + Assert.That(dep.SourceXid, Is.EqualTo("/groups/g/resources/r1")); + Assert.That(dep.TargetHref, Is.EqualTo("urn:target")); + Assert.That(dep.TargetXid, Is.EqualTo("/groups/g/resources/r2")); + Assert.That(dep.RefType, Is.EqualTo("tm:extends")); + Assert.That(dep.Resolved, Is.True); + } + + [Test] + public void WotDependencyUnresolvedPropertiesAreCorrect() + { + var dep = new WotDependency( + sourceXid: "/groups/g/resources/r1", + targetHref: "urn:missing", + targetXid: null, + refType: "tm:extends", + resolved: false); + + Assert.That(dep.TargetXid, Is.Null); + Assert.That(dep.Resolved, Is.False); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotDependencyGraphTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotDependencyGraphTests.cs new file mode 100644 index 0000000000..5faa5d87f0 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotDependencyGraphTests.cs @@ -0,0 +1,147 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises the TD/TM dependency graph: reference extraction, closure + /// partitioning (weakly-connected components), topological ordering, and + /// missing-dependency and cycle detection. + /// + [TestFixture] + public sealed class WotDependencyGraphTests + { + private static readonly string[] s_tmTdResourceIds = ["tm", "td"]; + + private async Task Snapshot( + params (WoTDocumentKindEnum Kind, string Id, byte[] Content)[] docs) + { + using var service = new WotRegistryService(); + foreach ((WoTDocumentKindEnum kind, string id, byte[] content) in docs) + { + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = kind == WoTDocumentKindEnum.ThingModel + ? WotRegistryGroups.ThingModels + : WotRegistryGroups.ThingDescriptions, + ResourceId = id, + Kind = kind, + Content = content + }); + } + return service.Current; + } + + [Test] + public void ExtractReferencesFindsTmExtendsLinks() + { + byte[] doc = TestMaterialization.Td("urn:td", extendsHrefs: "urn:tm-1"); + + IReadOnlyList<(string Href, string RefType)> references = + WotDependencyGraph.ExtractReferences(doc, 64); + + Assert.That(references.Any(r => r.Href == "urn:tm-1" && r.RefType == "tm:extends"), + Is.True); + } + + [Test] + public async Task BuildClosuresSharedModelYieldsSingleClosureTmFirst() + { + WotRegistrySnapshot snapshot = await Snapshot( + (WoTDocumentKindEnum.ThingModel, "tm", TestMaterialization.Tm("urn:tm")), + (WoTDocumentKindEnum.ThingDescription, "td", + TestMaterialization.Td("urn:td", extendsHrefs: "urn:tm"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + Assert.That(closures, Has.Length.EqualTo(1)); + Assert.That(closures[0].IsProjectable, Is.True); + Assert.That( + closures[0].OrderedResources.Select(r => r.ResourceId), + Is.EqualTo(s_tmTdResourceIds)); + } + + [Test] + public async Task BuildClosuresIndependentResourcesYieldSeparateClosures() + { + WotRegistrySnapshot snapshot = await Snapshot( + (WoTDocumentKindEnum.ThingDescription, "a", TestMaterialization.Td("urn:a")), + (WoTDocumentKindEnum.ThingDescription, "b", TestMaterialization.Td("urn:b"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + Assert.That(closures, Has.Length.EqualTo(2)); + Assert.That(closures.All(c => c.OrderedResources.Length == 1), Is.True); + } + + [Test] + public async Task BuildClosuresMissingDependencyIsFlagged() + { + WotRegistrySnapshot snapshot = await Snapshot( + (WoTDocumentKindEnum.ThingDescription, "td", + TestMaterialization.Td("urn:td", extendsHrefs: "urn:missing"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + Assert.That(closures, Has.Length.EqualTo(1)); + Assert.That(closures[0].HasMissingDependency, Is.True); + Assert.That(closures[0].IsProjectable, Is.False); + } + + [Test] + public async Task BuildClosuresCycleIsDetected() + { + WotRegistrySnapshot snapshot = await Snapshot( + (WoTDocumentKindEnum.ThingModel, "a", + TestMaterialization.Tm("urn:a", extendsHrefs: "urn:b")), + (WoTDocumentKindEnum.ThingModel, "b", + TestMaterialization.Tm("urn:b", extendsHrefs: "urn:a"))); + + ImmutableArray closures = + WotDependencyGraph.BuildClosures(snapshot, [.. snapshot.AllResources()], 64); + + Assert.That(closures, Has.Length.EqualTo(1)); + Assert.That(closures[0].HasCycle, Is.True); + Assert.That(closures[0].IsProjectable, Is.False); + Assert.That(closures[0].Members, Has.Length.EqualTo(2), + "A cyclic closure must still report its members for diagnostics."); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotDocumentConverterTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotDocumentConverterTests.cs new file mode 100644 index 0000000000..5acdb53b02 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotDocumentConverterTests.cs @@ -0,0 +1,185 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Immutable; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Tests for factory methods and the + /// production implementation. + /// + [TestFixture] + [Category("WotCon")] + [Parallelizable(ParallelScope.All)] + public sealed class WotDocumentConverterTests + { + [Test] + public void FailureOutputSucceededIsFalse() + { + WotConversionOutput output = WotConversionOutput.Failure("Something went wrong."); + + Assert.That(output.Succeeded, Is.False); + Assert.That(output.NodeSet, Is.Null); + Assert.That(output.Errors, Has.Length.EqualTo(1)); + Assert.That(output.Errors[0], Does.Contain("Something went wrong.")); + } + + [Test] + public void FailureOutputWithMultipleErrors() + { + WotConversionOutput output = WotConversionOutput.Failure("error1", "error2"); + + Assert.That(output.Errors, Has.Length.EqualTo(2)); + } + + [Test] + public void SuccessOutputSucceededIsTrue() + { + var nodeSet = new UANodeSet(); + WotConversionOutput output = WotConversionOutput.Success(nodeSet); + + Assert.That(output.Succeeded, Is.True); + Assert.That(output.NodeSet, Is.SameAs(nodeSet)); + Assert.That(output.Errors, Is.Empty); + } + + [Test] + public void ConstructorWithDefaultErrorsIsEmpty() + { + var output = new WotConversionOutput(null, default); + + Assert.That(output.Errors, Is.Empty); + Assert.That(output.Succeeded, Is.False); + } + + [Test] + public async Task NodeSetDocumentConverterConvertsValidThingModel() + { + var converter = new WotNodeSetDocumentConverter(); + byte[] content = TestMaterialization.Tm("urn:test-tm"); + + var version = new WotResourceVersion( + versionId: "v1", + content: content, + contentType: "application/tm+json", + format: "WoT-TM/1.0", + createdAt: default, + modifiedAt: default); + var resource = new WotResource( + groupId: WotRegistryGroups.ThingModels, + resourceId: "test-tm", + kind: WoTDocumentKindEnum.ThingModel, + versions: ImmutableArray.Create(version), + defaultVersionId: "v1"); + + using var service = new WotRegistryService(); + WotRegistrySnapshot snapshot = service.Current; + + WotConversionOutput output = await converter + .ConvertAsync(resource, content, snapshot, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(output, Is.Not.Null); + } + + [Test] + public async Task NodeSetDocumentConverterFailsOnInvalidJson() + { + var converter = new WotNodeSetDocumentConverter(); + byte[] invalidContent = TestMaterialization.InvalidJson(); + + var version = new WotResourceVersion( + versionId: "v1", + content: invalidContent, + contentType: "application/td+json", + format: "WoT-TD/1.1", + createdAt: default, + modifiedAt: default); + var resource = new WotResource( + groupId: WotRegistryGroups.ThingDescriptions, + resourceId: "bad", + kind: WoTDocumentKindEnum.ThingDescription, + versions: ImmutableArray.Create(version), + defaultVersionId: "v1"); + + using var service = new WotRegistryService(); + WotRegistrySnapshot snapshot = service.Current; + + WotConversionOutput output = await converter + .ConvertAsync(resource, invalidContent, snapshot, CancellationToken.None) + .ConfigureAwait(false); + + Assert.That(output.Succeeded, Is.False); + Assert.That(output.Errors, Is.Not.Empty); + } + + [Test] + public void NodeSetDocumentConverterCanBeInstantiatedWithoutOptions() + { + var converter = new WotNodeSetDocumentConverter(); + Assert.That(converter, Is.Not.Null); + } + + [Test] + public void NodeSetDocumentConverterCanBeInstantiatedWithOptions() + { + var options = new WotNodeSetConverterOptions(); + var converter = new WotNodeSetDocumentConverter(options); + Assert.That(converter, Is.Not.Null); + } + + [Test] + public void SuccessOutputFromConstructorWithNonDefaultErrors() + { + var nodeSet = new UANodeSet(); + var errors = ImmutableArray.Empty; + var output = new WotConversionOutput(nodeSet, errors); + + Assert.That(output.Succeeded, Is.True); + Assert.That(output.Errors, Is.Empty); + } + + [Test] + public void FailureOutputRootNodeIdIsNull() + { + WotConversionOutput output = WotConversionOutput.Failure("fail"); + + Assert.That(output.RootNodeId.IsNull, Is.True); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationCoordinatorExtendedTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationCoordinatorExtendedTests.cs new file mode 100644 index 0000000000..a9d1b77ba7 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationCoordinatorExtendedTests.cs @@ -0,0 +1,374 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Supplemental tests for covering + /// cycle detection, RemoveAllAsync, selection filters, force refresh, + /// and the LoadFailure and BindingFailure event kinds. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotMaterializationCoordinatorExtendedTests + { + private WotRegistryService m_registry = null!; + private FakeWotProjectionHost m_host = null!; + private FakeWotDocumentConverter m_converter = null!; + private WotMaterializationCoordinator m_coordinator = null!; + + [SetUp] + public void SetUp() + { + m_registry = new WotRegistryService(); + m_host = new FakeWotProjectionHost(); + m_converter = new FakeWotDocumentConverter(); + m_coordinator = new WotMaterializationCoordinator( + m_registry, m_host, documentConverter: m_converter); + } + + [TearDown] + public void TearDown() + { + m_coordinator.Dispose(); + m_registry.Dispose(); + } + + private Task RegisterTd(string resourceId, byte[] content) + { + return m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = content + }).AsTask(); + } + + private Task RegisterTm(string resourceId, byte[] content) + { + return m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingModels, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingModel, + Content = content + }).AsTask(); + } + + [Test] + public async Task CyclicTmsAreNotProjectedAndEmitLoadFailureEvent() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTm("tm-a", TestMaterialization.Tm("urn:tm-a", extendsHrefs: "urn:tm-b")); + await RegisterTm("tm-b", TestMaterialization.Tm("urn:tm-b", extendsHrefs: "urn:tm-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.Zero, + "A cyclic closure must not project."); + Assert.That(result.Results, Has.Length.EqualTo(2)); + Assert.That(result.Results.All(r => r.Outcome == WoTOutcomeEnum.Failed), Is.True); + Assert.That(result.Results.All(r => r.Phase == WoTPhaseEnum.DependencyResolution), + Is.True); + Assert.That( + events.Any(e => e.Kind == WotMaterializationEventKind.LoadFailure), + Is.True, "Each cyclic closure member must raise a LoadFailure event."); + } + + [Test] + public async Task RemoveAllAsyncRetiresPreviouslyProjectedClosures() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + Assert.That(m_host.AddCount, Is.EqualTo(1)); + + await m_coordinator.RemoveAllAsync(); + + Assert.That(m_host.RemoveCount, Is.EqualTo(1), + "RemoveAllAsync must retire the live projection."); + } + + [Test] + public async Task ForceRefreshReprocessesUnchangedContent() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + Assert.That(m_host.AddCount, Is.EqualTo(1)); + + WotRefreshResult second = await m_coordinator.RefreshAsync(new WotRefreshRequest + { + Options = new WoTRefreshOptionsDataType { Force = true } + }); + + Assert.That(m_host.ShadowCount, Is.EqualTo(1), + "A forced refresh must shadow-reload even when the content is unchanged."); + Assert.That( + second.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.Not.EqualTo(WoTOutcomeEnum.Unchanged)); + } + + [Test] + public async Task SelectionFilterLimitsResultsToSelectedResources() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await RegisterTd("td-b", TestMaterialization.Td("urn:td-b")); + + string tdAXid = m_registry.Current + .FindResource(WotRegistryGroups.ThingDescriptions, "td-a")!.Xid; + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest + { + Selection = [new WoTResourceSelectorDataType + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "td-a" + }] + }); + + Assert.That(result.Results.All(r => r.ResourceId == "td-a"), Is.True, + "Filtered refresh must only return results for selected resources."); + } + + [Test] + public async Task RefreshAllEmptyResourceRegistryReturnsEmptyResults() + { + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(result.Results, Is.Empty); + Assert.That(result.Summary.Outcome, Is.EqualTo(WoTOutcomeEnum.Unchanged)); + } + + [Test] + public async Task RefreshGenerationIncrements() + { + uint before = m_coordinator.Generation; + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_coordinator.Generation, Is.GreaterThan(before)); + } + + [Test] + public async Task RefreshCompletedEventIsRaisedAfterRefresh() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That( + events.Any(e => e.Kind == WotMaterializationEventKind.RefreshCompleted), + Is.True, "A RefreshCompleted event must be raised after every refresh."); + } + + [Test] + public async Task ValidationFailureEventIsRaisedForInvalidContent() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + m_converter.MarkInvalid("td-a"); + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That( + events.Any(e => e.Kind == WotMaterializationEventKind.ValidationFailure), + Is.True, "A ValidationFailure event must be raised for invalid content."); + } + + [Test] + public async Task LoadFailureEventIsRaisedForMissingDependency() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTd("td-a", + TestMaterialization.Td("urn:td-a", extendsHrefs: "urn:missing-tm")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That( + events.Any(e => e.Kind == WotMaterializationEventKind.LoadFailure), + Is.True, "A LoadFailure event must be raised for each resource in an unresolvable closure."); + } + + [Test] + public async Task TwoIndependentClosuresProjectAsTwoSeparateRegistrations() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await RegisterTd("td-b", TestMaterialization.Td("urn:td-b")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.EqualTo(2), + "Two independent closures must each be added as a separate projection."); + Assert.That(result.Results, Has.Length.EqualTo(2)); + } + + [Test] + public async Task ResourceEventIsRaisedAfterSuccessfulProjection() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That( + events.Any(e => e.Kind == WotMaterializationEventKind.Resource && + e.ResourceId == "td-a"), + Is.True, "A Resource event must be raised for each successfully projected resource."); + } + + [Test] + public async Task OversizedResolverResponseIsReportedAsBindingFailure() + { + var events = new List(); + var resolver = new RecordingResolver(_ => new MemoryStream(new byte[16])); + m_coordinator.Dispose(); + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_host, + converterOptions: new WotNodeSetConverterOptions { MaxResolverDocumentBytes = 8 }, + documentConverter: m_converter, + nodeSetResolver: resolver); + m_converter.RequiredNamespace = "urn:oversized"; + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.Multiple(() => + { + Assert.That(result.Results.Single().Outcome, Is.EqualTo(WoTOutcomeEnum.Warning)); + Assert.That(resolver.RequestedNamespaces, Does.Contain("urn:oversized")); + Assert.That( + events.Any(e => + e.Kind == WotMaterializationEventKind.BindingFailure && + e.Reason.Contains("exceeded", StringComparison.Ordinal)), + Is.True); + }); + } + + [Test] + public async Task RetiredProjectionNamespaceIsResolvedAgainDespiteStaleNamespaceTableEntry() + { + var namespaces = new NamespaceTable(); + namespaces.GetIndexOrAppend("urn:wot:thingdescriptions/old"); + var resolver = new RecordingResolver( + uri => new MemoryStream(TestNodeSets.XmlBytes(uri))); + m_coordinator.Dispose(); + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_host, + documentConverter: m_converter, + nodeSetResolver: resolver) + { + ServerNamespaceUris = namespaces + }; + + await RegisterTd("old", TestMaterialization.Td("urn:old")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + await m_registry.DeleteResourceAsync(WotRegistryGroups.ThingDescriptions, "old"); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + m_converter.RequiredNamespace = "urn:wot:thingdescriptions/old"; + await RegisterTd("new", TestMaterialization.Td("urn:new")); + + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(resolver.RequestedNamespaces, Does.Contain("urn:wot:thingdescriptions/old")); + } + + private sealed class RecordingResolver : IWotNodeSetResolver + { + public RecordingResolver(Func resolve) + { + m_resolve = resolve; + } + + public List RequestedNamespaces { get; } = []; + + public ValueTask TryResolveAsync( + string namespaceUri, + CancellationToken cancellationToken = default) + { + RequestedNamespaces.Add(namespaceUri); + return new ValueTask(m_resolve(namespaceUri)); + } + + private readonly Func m_resolve; + } + + [Test] + public async Task BindingCapabilitiesIsNonNullEvenWithNoBinders() + { + Assert.That(m_coordinator.BindingCapabilities, Is.Not.Null); + Assert.That(m_coordinator.BindingCapabilities, Is.Empty); + } + + [Test] + public async Task RemoveAllAsyncOnEmptyCoordinatorDoesNotThrow() + { + await m_coordinator.RemoveAllAsync(); + } + + [Test] + public async Task CyclicClosureEmitsLoadFailureForEachMember() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTm("tm-x", TestMaterialization.Tm("urn:tm-x", extendsHrefs: "urn:tm-y")); + await RegisterTm("tm-y", TestMaterialization.Tm("urn:tm-y", extendsHrefs: "urn:tm-x")); + + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + List failures = events + .Where(e => e.Kind == WotMaterializationEventKind.LoadFailure) + .ToList(); + Assert.That(failures, Has.Count.EqualTo(2), + "Each member of a cyclic closure must receive its own LoadFailure event."); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationCoordinatorTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationCoordinatorTests.cs new file mode 100644 index 0000000000..d79c146f4d --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationCoordinatorTests.cs @@ -0,0 +1,441 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises the materialization coordinator against a recording projection + /// host and a deterministic converter, covering the dependency-closure, + /// unchanged-refresh, invalid-retention, shadow-reload and retirement + /// behaviours required by the WoT Connectivity V2 runtime. + /// + [TestFixture] + public sealed class WotMaterializationCoordinatorTests + { + private static readonly string[] s_tmTdSourceNames = ["tm-a", "td-a"]; + + private WotRegistryService m_registry = null!; + private FakeWotProjectionHost m_host = null!; + private FakeWotDocumentConverter m_converter = null!; + private WotMaterializationCoordinator m_coordinator = null!; + + [SetUp] + public void SetUp() + { + m_registry = new WotRegistryService(); + m_host = new FakeWotProjectionHost(); + m_converter = new FakeWotDocumentConverter(); + m_coordinator = new WotMaterializationCoordinator( + m_registry, m_host, documentConverter: m_converter); + } + + [TearDown] + public void TearDown() + { + m_coordinator.Dispose(); + m_registry.Dispose(); + } + + private Task RegisterTd(string resourceId, byte[] content) + { + return m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = content + }).AsTask(); + } + + private Task RegisterTm(string resourceId, byte[] content) + { + return m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingModels, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingModel, + Content = content + }).AsTask(); + } + + [Test] + public async Task TmBeforeTdCreatesSingleClosureTmOrderedFirst() + { + await RegisterTm("tm-a", TestMaterialization.Tm("urn:tm-a")); + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", extendsHrefs: "urn:tm-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.EqualTo(1), + "A shared closure must project as one runtime NodeManager."); + HostOperation op = m_host.Operations.Single(o => o.Op == "add"); + Assert.That(op.SourceNames, Is.EqualTo(s_tmTdSourceNames), + "Thing Models must be ordered before the Thing Descriptions that extend them."); + // With the default (no-op) binder, affordance forms have no binder and + // materialize as degraded nodes, so the projected outcome is Warning; + // both members nonetheless reach the Active load state. + Assert.That( + result.Results.Count(r => + r.Outcome is WoTOutcomeEnum.Success or WoTOutcomeEnum.Warning), + Is.EqualTo(2)); + Assert.That( + m_registry.Current.FindResource(WotRegistryGroups.ThingModels, "tm-a")!.LoadState, + Is.EqualTo(WoTLoadStateEnum.Active)); + Assert.That( + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-a")! + .LoadState, + Is.EqualTo(WoTLoadStateEnum.Active)); + } + + [Test] + public async Task TdBeforeTmFailsThenSucceedsAfterTmRegistration() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", extendsHrefs: "urn:tm-a")); + + WotRefreshResult first = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.Zero, + "A Thing Description with a missing model dependency must not project."); + WoTResourceLoadResultDataType tdResult = + first.Results.Single(r => r.ResourceId == "td-a"); + Assert.That(tdResult.Outcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + Assert.That(tdResult.Phase, Is.EqualTo(WoTPhaseEnum.DependencyResolution)); + Assert.That( + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-a")! + .LoadState, + Is.EqualTo(WoTLoadStateEnum.Failed)); + + await RegisterTm("tm-a", TestMaterialization.Tm("urn:tm-a")); + WotRefreshResult second = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.EqualTo(1), + "Registering the missing model must let the closure project."); + Assert.That( + second.Results.Count(r => + r.Outcome is WoTOutcomeEnum.Success or WoTOutcomeEnum.Warning), + Is.EqualTo(2)); + Assert.That( + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-a")! + .LoadState, + Is.EqualTo(WoTLoadStateEnum.Active)); + } + + [Test] + public async Task ExternalWebDependencyIsNotResolvedOutsideRegistry() + { + await RegisterTd( + "td-a", + TestMaterialization.Td( + "urn:td-a", + extendsHrefs: "https://example.invalid/models/pump.tm.jsonld")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.Zero); + WoTResourceLoadResultDataType tdResult = + result.Results.Single(r => r.ResourceId == "td-a"); + Assert.That(tdResult.Outcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + Assert.That(tdResult.Phase, Is.EqualTo(WoTPhaseEnum.DependencyResolution)); + } + + [Test] + public async Task UnchangedRefreshPreservesRegistrationNoModelEvent() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + Assert.That(m_host.AddCount, Is.EqualTo(1)); + + WotRefreshResult second = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.EqualTo(1), "No new add on an unchanged refresh."); + Assert.That(m_host.ShadowCount, Is.Zero, "No shadow reload on an unchanged refresh."); + Assert.That(m_host.ImmediateCount, Is.Zero, + "No immediate reload on an unchanged refresh."); + Assert.That( + second.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Unchanged)); + } + + [Test] + public async Task InvalidVersionFailureRetainsPreviousActiveProjection() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v1")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + WotResource afterFirst = + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-a")!; + string activeBefore = afterFirst.ActiveVersionId!; + Assert.That(afterFirst.LoadState, Is.EqualTo(WoTLoadStateEnum.Active)); + + // A new version whose conversion fails. + m_converter.MarkInvalid("td-a"); + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v2")); + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.RemoveCount, Is.Zero, + "A failed refresh must retain the previous active projection."); + WotResource afterFail = + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-a")!; + Assert.That(afterFail.LoadState, Is.EqualTo(WoTLoadStateEnum.Failed)); + Assert.That(afterFail.ActiveVersionId, Is.EqualTo(activeBefore), + "The previously active version must be retained on failure."); + Assert.That( + result.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Failed)); + Assert.That( + events.Any(e => e.Kind == WotMaterializationEventKind.ValidationFailure), + Is.True, "A validation failure event must be emitted."); + } + + [Test] + public async Task VersionSwitchUsesShadowReload() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v1")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + Assert.That(m_host.AddCount, Is.EqualTo(1)); + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v2")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.EqualTo(1), "A version switch must not re-add."); + Assert.That(m_host.ShadowCount, Is.EqualTo(1), + "A version switch must shadow-reload the projection."); + } + + [Test] + public async Task VersionSwitchUsesImmediateReloadWhenConfigured() + { + m_coordinator.RetirementPolicy = WotProjectionRetirementPolicy.Immediate; + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v1")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v2")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.ShadowCount, Is.Zero); + Assert.That(m_host.ImmediateCount, Is.EqualTo(1), + "Immediate retirement must use the host's immediate reload path."); + } + + [Test] + public async Task VersionSwitchCleanupWarningTracksCommittedReplacement() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v1")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + m_host.NextReloadWarning = "Prior-generation cleanup is pending."; + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a", "v2")); + WotRefreshResult switched = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + WoTResourceLoadResultDataType result = + switched.Results.Single(r => r.ResourceId == "td-a"); + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Warning)); + Assert.That(result.Message, Does.Contain("cleanup is pending")); + + WotRefreshResult unchanged = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + Assert.That(m_host.ShadowCount, Is.EqualTo(1), + "The committed replacement handle must remain tracked after a cleanup warning."); + Assert.That( + unchanged.Results.Single(r => r.ResourceId == "td-a").Outcome, + Is.EqualTo(WoTOutcomeEnum.Unchanged)); + } + + [Test] + public async Task DeleteRetiresProjection() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + Assert.That(m_host.AddCount, Is.EqualTo(1)); + + await m_registry.DeleteResourceAsync(WotRegistryGroups.ThingDescriptions, "td-a"); + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.RemoveCount, Is.EqualTo(1), + "A deleted resource's projection must be retired."); + } + + [Test] + public async Task IndependentClosuresPartialSuccess() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + await RegisterTd("td-b", TestMaterialization.Td("urn:td-b")); + m_converter.MarkInvalid("td-b"); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.EqualTo(1), + "Only the projectable closure commits."); + Assert.That(result.Summary.Succeeded, Is.EqualTo(1u)); + Assert.That(result.Summary.Failed, Is.EqualTo(1u)); + Assert.That(result.Summary.Outcome, Is.EqualTo(WoTOutcomeEnum.Warning)); + Assert.That( + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-a")! + .LoadState, + Is.EqualTo(WoTLoadStateEnum.Active)); + Assert.That( + m_registry.Current.FindResource(WotRegistryGroups.ThingDescriptions, "td-b")! + .LoadState, + Is.EqualTo(WoTLoadStateEnum.Failed)); + } + + [Test] + public async Task RefreshExpectedGenerationMismatchIsRejected() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest + { + ExpectedGeneration = 99999 + }); + + Assert.That(result.Summary.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That(m_host.AddCount, Is.Zero); + } + + [Test] + public async Task DryRunDoesNotCommit() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest + { + Options = new WoTRefreshOptionsDataType { DryRun = true } + }); + + Assert.That(m_host.AddCount, Is.Zero, "A dry run must not project."); + Assert.That(result.NewGeneration, Is.Zero); + } + + [Test] + public async Task DetailedResultsCarryNodeCountAndDigest() + { + m_converter.SetNodeCount("td-a", 7); + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest + { + RequestId = "req-1" + }); + + WoTResourceLoadResultDataType td = result.Results.Single(r => r.ResourceId == "td-a"); + Assert.That(td.MaterializedNodeCount, Is.EqualTo(7u)); + Assert.That(td.ContentDigest.Length, Is.GreaterThan(0)); + Assert.That(result.Summary.RequestId, Is.EqualTo("req-1")); + } + + [Test] + public async Task RootNodeIdIsRecordedFromGeneratedNodeSet() + { + // The fake converter emits a NodeSet whose model namespace is + // urn:wot:{group}/{resource}; register it so the coordinator can + // resolve the recorded projection root into a server NodeId. + var namespaces = new NamespaceTable(); + string modelUri = $"urn:wot:{WotRegistryGroups.ThingDescriptions}/td-a"; + namespaces.Append(modelUri); + m_coordinator.ServerNamespaceUris = namespaces; + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + WoTResourceLoadResultDataType td = result.Results.Single(r => r.ResourceId == "td-a"); + Assert.That(td.RootNodeId.IsNull, Is.False, + "A document with a root must report a non-null RootNodeId."); + Assert.That(td.RootNodeId.NamespaceIndex, + Is.EqualTo((ushort)namespaces.GetIndex(modelUri))); + WotResource resource = m_registry.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "td-a")!; + Assert.That(resource.RootNodeId.IsNull, Is.False); + } + + [Test] + public async Task RootNodeIdIsNullWhenNamespaceCannotBeResolved() + { + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + WoTResourceLoadResultDataType td = result.Results.Single(r => r.ResourceId == "td-a"); + Assert.That(td.RootNodeId.IsNull, Is.True, + "A document with an unresolved root namespace must report NodeId.Null."); + WotResource resource = m_registry.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "td-a")!; + Assert.That(resource.RootNodeId.IsNull, Is.True); + } + + [Test] + public async Task LoadFailureEventFailedNodeIdDefaultsToNullNodeId() + { + var events = new List(); + m_coordinator.Event += (_, e) => events.Add(e); + m_converter.MarkInvalid("td-a"); + await RegisterTd("td-a", TestMaterialization.Td("urn:td-a")); + + await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + WotMaterializationEventArgs failure = events.Single( + e => e.Kind == WotMaterializationEventKind.ValidationFailure); + Assert.That(failure.FailedNodeId.IsNull, Is.True); + } + + [Test] + public void FailedNodeIdCanCarryConcreteNodeId() + { + var args = new WotMaterializationEventArgs(WotMaterializationEventKind.LoadFailure) + { + FailedNodeId = new NodeId(1234, 2) + }; + + Assert.That(args.FailedNodeId.IsNull, Is.False); + Assert.That(args.FailedNodeId, Is.EqualTo(new NodeId(1234, 2))); + } + + [Test] + public async Task PlaceholderResourceWithoutVersionIsNotProjected() + { + await m_registry.TryCreateResourceAsync( + WotRegistryGroups.ThingDescriptions, "empty", + WoTDocumentKindEnum.ThingDescription); + + WotRefreshResult result = await m_coordinator.RefreshAsync(new WotRefreshRequest()); + + Assert.That(m_host.AddCount, Is.Zero, + "A content-less placeholder resource must not project."); + Assert.That(result.Results, Is.Empty); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationExtensibilityTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationExtensibilityTests.cs new file mode 100644 index 0000000000..c4c2b56dbb --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationExtensibilityTests.cs @@ -0,0 +1,270 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Tests the two materialization extension points a protocol driver needs: contributing custom + /// DataTypes that have no NodeSet to import, and resolving companion-specification NodeSets a + /// Thing Description depends on but the server does not already know. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotMaterializationExtensibilityTests + { + [SetUp] + public void SetUp() + { + m_registry = new WotRegistryService(); + m_host = new FakeWotProjectionHost(); + m_converter = new FakeWotDocumentConverter(); + } + + [TearDown] + public void TearDown() + { + m_coordinator?.Dispose(); + m_registry.Dispose(); + } + + [Test] + public async Task AContributorAddsNodesToEveryConvertedDocumentAsync() + { + var contributor = new RecordingContributor(); + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_host, + documentConverter: m_converter, + nodeSetContributors: [contributor]); + + await RegisterAsync("a").ConfigureAwait(false); + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(contributor.Resources, Does.Contain("a"), + "A contributor must run once for the resource being materialized."); + Assert.That(contributor.SawNodesBeforeContributing, Is.True, + "A contributor must run after conversion, so the converted nodes are present."); + }); + } + + [Test] + public async Task NoContributorLeavesMaterializationUnchangedAsync() + { + m_coordinator = new WotMaterializationCoordinator( + m_registry, m_host, documentConverter: m_converter); + + await RegisterAsync("a").ConfigureAwait(false); + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(m_host.AddCount, Is.EqualTo(1), + "Registering no contributor must leave the previous behaviour untouched."); + } + + [Test] + public async Task AContributedDataTypeReachesTheProjectionAsync() + { + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_host, + documentConverter: m_converter, + nodeSetContributors: [new DataTypeContributor()]); + + await RegisterAsync("a").ConfigureAwait(false); + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + string projected = string.Join( + "\n", + m_host.Operations.Where(o => o.Document is not null).SelectMany(o => o.Document!.Sources) + .Select(s => Encoding.UTF8.GetString(s.NodeSetXml))); + + Assert.That(projected, Does.Contain(DataTypeContributor.BrowseName), + "A DataType contributed before materialization must reach the projection, which " + + "is what lets a uav:mapByFieldPath mapping resolve against a controller UDT."); + } + + [Test] + public async Task AnUnresolvedDependencyNamespaceIsReportedNotSilentlyDroppedAsync() + { + m_converter.RequiredNamespace = kDependencyNamespace; + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_host, + documentConverter: m_converter, + nodeSetResolver: new DecliningResolver()); + + await RegisterAsync("a").ConfigureAwait(false); + WotRefreshResult result = await m_coordinator + .RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That( + result.Results.Any(r => r.Outcome != WoTOutcomeEnum.Success), + Is.True, + "A namespace nothing can resolve must surface, so an operator sees what is missing."); + } + + [Test] + public async Task AResolvedDependencyIsProjectedBeforeTheDocumentThatNeedsItAsync() + { + m_converter.RequiredNamespace = kDependencyNamespace; + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_host, + documentConverter: m_converter, + nodeSetResolver: new StubResolver(kDependencyNamespace)); + + await RegisterAsync("a").ConfigureAwait(false); + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + WotProjectionDocument? document = m_host.Operations.LastOrDefault(o => o.Document is not null)?.Document; + Assert.That(document, Is.Not.Null); + Assert.That(document!.Sources[0].Name, Is.EqualTo(kDependencyNamespace), + "A resolved dependency must be materialized before the document that requires it."); + } + + [Test] + public async Task NoResolverLeavesAKnownDocumentUnaffectedAsync() + { + m_coordinator = new WotMaterializationCoordinator( + m_registry, m_host, documentConverter: m_converter); + + await RegisterAsync("a").ConfigureAwait(false); + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + Assert.That(m_host.AddCount, Is.EqualTo(1), + "A document with no unmet dependency must not need a resolver at all."); + } + + private ValueTask RegisterAsync(string resourceId) + { + return m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:" + resourceId) + }); + } + + private const string kDependencyNamespace = "urn:test:dependency"; + + private WotRegistryService m_registry = null!; + private FakeWotProjectionHost m_host = null!; + private FakeWotDocumentConverter m_converter = null!; + private WotMaterializationCoordinator? m_coordinator; + + private sealed class RecordingContributor : IWotNodeSetContributor + { + public List Resources { get; } = []; + + public bool SawNodesBeforeContributing { get; private set; } + + public ValueTask ContributeAsync( + WotResource resource, + UANodeSet nodeSet, + CancellationToken cancellationToken = default) + { + Resources.Add(resource.ResourceId); + SawNodesBeforeContributing = nodeSet.Items is { Length: > 0 }; + return default; + } + } + + private sealed class DataTypeContributor : IWotNodeSetContributor + { + public const string BrowseName = "ContributedUdt"; + + public ValueTask ContributeAsync( + WotResource resource, + UANodeSet nodeSet, + CancellationToken cancellationToken = default) + { + var dataType = new UADataType + { + NodeId = "ns=1;i=9000", + BrowseName = "1:" + BrowseName, + DisplayName = [new Opc.Ua.Export.LocalizedText { Value = BrowseName }] + }; + nodeSet.Items = [.. nodeSet.Items ?? [], dataType]; + return default; + } + } + + private sealed class DecliningResolver : IWotNodeSetResolver + { + public ValueTask TryResolveAsync( + string namespaceUri, CancellationToken cancellationToken = default) + { + // Returning null is the contract's way of declining; it is not an error. + return new ValueTask((Stream?)null); + } + } + + private sealed class StubResolver : IWotNodeSetResolver + { + public StubResolver(string namespaceUri) + { + m_namespaceUri = namespaceUri; + } + + public ValueTask TryResolveAsync( + string namespaceUri, CancellationToken cancellationToken = default) + { + if (!string.Equals(namespaceUri, m_namespaceUri, StringComparison.Ordinal)) + { + return new ValueTask((Stream?)null); + } + string xml = + "" + + "" + + "" + m_namespaceUri + "" + + "" + + ""; + return new ValueTask( + (Stream?)new MemoryStream(Encoding.UTF8.GetBytes(xml))); + } + + private readonly string m_namespaceUri; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationTestSupport.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationTestSupport.cs new file mode 100644 index 0000000000..7ed6a22f23 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotMaterializationTestSupport.cs @@ -0,0 +1,246 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Globalization; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.Export; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// A test that records the add / shadow / + /// remove operations without a running server. + /// + internal sealed class FakeWotProjectionHost : IWotProjectionHost + { + public List Operations { get; } = new(); + + public int AddCount { get; private set; } + public int ShadowCount { get; private set; } + public int ImmediateCount { get; private set; } + public int RemoveCount { get; private set; } + public string NextReloadWarning { get; set; } = string.Empty; + + public ValueTask AddAsync( + WotProjectionDocument document, CancellationToken cancellationToken = default) + { + AddCount++; + Operations.Add(new HostOperation("add", document)); + return new ValueTask(MakeHandle(document)); + } + + public ValueTask ShadowReloadAsync( + WotProjectionHandle current, WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + ShadowCount++; + Operations.Add(new HostOperation("shadow", document)); + long gen = (current?.Generation ?? 0) + 1; + string warning = NextReloadWarning; + NextReloadWarning = string.Empty; + return new ValueTask(MakeHandle(document, gen, warning)); + } + + public ValueTask ImmediateReloadAsync( + WotProjectionHandle current, WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + ImmediateCount++; + Operations.Add(new HostOperation("immediate", document)); + long gen = (current?.Generation ?? 0) + 1; + string warning = NextReloadWarning; + NextReloadWarning = string.Empty; + return new ValueTask(MakeHandle(document, gen, warning)); + } + + public ValueTask RemoveAsync( + WotProjectionHandle handle, CancellationToken cancellationToken = default) + { + RemoveCount++; + Operations.Add(new HostOperation("remove", null, handle?.ClosureKey ?? string.Empty)); + return default; + } + + private static WotProjectionHandle MakeHandle( + WotProjectionDocument document, + long gen = 1, + string warning = "") + { + return new WotProjectionHandle( + document.ClosureKey, + gen, + new FakeProjectionRegistration(), + ImmutableArray.Empty, + 0, + warning); + } + + private sealed class FakeProjectionRegistration : IWotProjectionRegistration + { + public Guid Id { get; } = Guid.NewGuid(); + } + } + + /// + /// Stands in for a host-specific projection registration in tests that do + /// not exercise a real NodeManager lifecycle. + /// + internal sealed class FakeWotProjectionRegistration : IWotProjectionRegistration + { + /// + public Guid Id { get; } = Guid.NewGuid(); + } + + internal sealed class HostOperation + { + public HostOperation(string op, WotProjectionDocument? document, string closureKey = "") + { + Op = op; + Document = document; + ClosureKey = document?.ClosureKey ?? closureKey; + } + + public string Op { get; } + public WotProjectionDocument? Document { get; } + public string ClosureKey { get; } + + public IReadOnlyList SourceNames + { + get + { + var names = new List(); + if (Document is not null) + { + foreach (WotProjectionSource source in Document.Sources) + { + names.Add(source.Name); + } + } + return names; + } + } + } + + /// + /// A deterministic that returns a canned + /// NodeSet2 per resource id, or a failure for ids marked invalid. + /// + internal sealed class FakeWotDocumentConverter : IWotDocumentConverter + { + private readonly Dictionary m_nodeCounts = new(StringComparer.Ordinal); + private readonly HashSet m_invalid = new(StringComparer.Ordinal); + + public void SetNodeCount(string resourceId, int nodeCount) + => m_nodeCounts[resourceId] = nodeCount; + + public void MarkInvalid(string resourceId) => m_invalid.Add(resourceId); + + public void ClearInvalid(string resourceId) => m_invalid.Remove(resourceId); + + /// + /// When set, every converted NodeSet declares a dependency on this namespace, so the + /// coordinator has an unmet dependency to resolve. + /// + public string? RequiredNamespace { get; set; } + + public ValueTask ConvertAsync( + WotResource resource, + ReadOnlyMemory content, + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + if (m_invalid.Contains(resource.ResourceId)) + { + return new ValueTask( + WotConversionOutput.Failure($"Injected conversion failure for '{resource.ResourceId}'.")); + } + int nodeCount = m_nodeCounts.TryGetValue(resource.ResourceId, out int c) ? c : 2; + UANodeSet nodeSet = TestNodeSets.Make( + $"urn:wot:{resource.GroupId}/{resource.ResourceId}", nodeCount, RequiredNamespace); + return new ValueTask(WotConversionOutput.Success(nodeSet)); + } + } + + internal static class TestNodeSets + { + public static byte[] XmlBytes(string modelUri, string? requiredNamespace = null) + { + return Encoding.UTF8.GetBytes(Xml(modelUri, requiredNamespace)); + } + + public static UANodeSet Make( + string modelUri, int nodeCount, string? requiredNamespace = null) + { + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(Xml(modelUri, requiredNamespace, nodeCount))); + return UANodeSet.Read(stream)!; + } + + private static string Xml( + string modelUri, + string? requiredNamespace = null, + int nodeCount = 1) + { + var builder = new StringBuilder(); + builder.Append(""); + builder.Append(""); + builder.Append("").Append(modelUri).Append(""); + builder.Append(""); + } + else + { + builder.Append(">") + .Append(""); + } + for (int i = 0; i < nodeCount; i++) + { + int id = 5000 + i; + builder.Append("Node") + .Append(i).Append(""); + } + builder.Append(""); + return builder.ToString(); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotProjectionBindingRuntimeTestSupport.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotProjectionBindingRuntimeTestSupport.cs new file mode 100644 index 0000000000..bf08a4aaf2 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotProjectionBindingRuntimeTestSupport.cs @@ -0,0 +1,554 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using Moq; +using Opc.Ua.Server; +using Opc.Ua.Server.Fluent; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// A test that opens pre-configured + /// fake channels (or a configurable opener delegate) per compiled form, and + /// records how many times each form was opened. + /// + internal sealed class FakeWotBindingChannelFactory : IWotBindingChannelFactory + { + public int OpenCount { get; private set; } + + public List OpenedForms { get; } = []; + + public void SetChannel(WotCompiledForm form, IWotBindingChannel channel) + { + m_openers[form] = () => new ValueTask(channel); + } + + public void SetOpener(WotCompiledForm form, Func> opener) + { + m_openers[form] = opener; + } + + public ValueTask OpenChannelAsync( + WotCompiledForm form, CancellationToken cancellationToken = default) + { + OpenCount++; + OpenedForms.Add(form); + if (m_openers.TryGetValue(form, out Func>? opener)) + { + return opener(); + } + throw new InvalidOperationException($"No fake channel configured for form '{form.AffordanceName}'."); + } + + private readonly Dictionary>> m_openers = []; + } + + /// + /// A test with configurable read/write/dispose behavior. + /// + internal sealed class FakeWotBindingChannel : IWotBindingChannel + { + public FakeWotBindingChannel(WotCompiledForm form) + { + Form = form; + } + + public WotCompiledForm Form { get; } + + public Func>? OnRead { get; set; } + + public Func>? OnWrite { get; set; } + + public Func? OnDispose { get; set; } + + public int ReadCount { get; private set; } + + public int WriteCount { get; private set; } + + public int DisposeCount { get; private set; } + + public ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + ReadCount++; + return OnRead?.Invoke(cancellationToken) + ?? new ValueTask(new WotReadResult(StatusCodes.Good, new DataValue(Variant.Null))); + } + + public ValueTask WriteAsync(DataValue value, CancellationToken cancellationToken = default) + { + WriteCount++; + return OnWrite?.Invoke(value, cancellationToken) + ?? new ValueTask(new WotWriteResult(StatusCodes.Good)); + } + + public ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + throw new NotSupportedException(); + } + + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + throw new NotSupportedException(); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + throw new NotSupportedException(); + } + + public async ValueTask DisposeAsync() + { + DisposeCount++; + if (OnDispose is not null) + { + await OnDispose().ConfigureAwait(false); + } + } + } + + /// + /// A hand-crafted nested structure used to exercise uav:mapByFieldPath nesting. + /// + internal sealed class TestChildStructure : IEncodeable, IStructure + { + public int X { get; set; } + + public ExpandedNodeId TypeId => TestChildType.EncodingId; + + public ExpandedNodeId BinaryEncodingId => TestChildType.EncodingId; + + public ExpandedNodeId XmlEncodingId => TestChildType.EncodingId; + + public void Encode(IEncoder encoder) + { + } + + public void Decode(IDecoder decoder) + { + } + + public bool IsEqual(IEncodeable? encodeable) + { + return encodeable is TestChildStructure other && other.X == X; + } + + public object Clone() + { + return new TestChildStructure { X = X }; + } + + public IReadOnlyList GetFields() + { + return []; + } + + public Variant this[int index] + { + get => index == 0 ? new Variant(X) : throw new ArgumentOutOfRangeException(nameof(index)); + set + { + if (index == 0 && value.TryGetValue(out int x)) + { + X = x; + } + } + } + + public Variant this[string name] + { + get => name == "X" ? new Variant(X) : throw new ArgumentOutOfRangeException(nameof(name)); + set + { + if (name == "X" && value.TryGetValue(out int x)) + { + X = x; + } + } + } + } + + /// + /// The activator for . + /// + internal sealed class TestChildType : EncodeableType + { + public const uint NumericId = 9101; + + public static ExpandedNodeId EncodingId { get; } = new ExpandedNodeId(NumericId, TestStructureNamespace.Uri); + + public override XmlQualifiedName XmlName => new("TestChildStructure", Ua.Namespaces.OpcUaXsd); + + public override IEncodeable CreateInstance() + { + return new TestChildStructure(); + } + + public override DataTypeDefinition GetDataTypeDefinition(NamespaceTable namespaceUris) + { + return new StructureDefinition + { + BaseDataType = Ua.DataTypeIds.Structure, + StructureType = StructureType.Structure, + Fields = + [ + new StructureField + { + Name = "X", + DataType = Ua.DataTypeIds.Int32, + ValueRank = ValueRanks.Scalar + } + ] + }; + } + } + + /// + /// A hand-crafted root structure with a scalar field, an array field and a + /// nested field, used to exercise one-level + /// and nested uav:mapByFieldPath composition. + /// + internal sealed class TestRootStructure : IEncodeable, IStructure + { + public int A { get; set; } + + public Variant ChildValue { get; set; } = Variant.Null; + + public Variant ArrayValue { get; set; } = Variant.Null; + + public ExpandedNodeId TypeId => TestRootType.EncodingId; + + public ExpandedNodeId BinaryEncodingId => TestRootType.EncodingId; + + public ExpandedNodeId XmlEncodingId => TestRootType.EncodingId; + + public void Encode(IEncoder encoder) + { + } + + public void Decode(IDecoder decoder) + { + } + + public bool IsEqual(IEncodeable? encodeable) + { + return ReferenceEquals(this, encodeable); + } + + public object Clone() + { + return new TestRootStructure { A = A, ChildValue = ChildValue, ArrayValue = ArrayValue }; + } + + public IReadOnlyList GetFields() + { + return []; + } + + public Variant this[int index] + { + get => index switch + { + 0 => new Variant(A), + 1 => ChildValue, + 2 => ArrayValue, + _ => throw new ArgumentOutOfRangeException(nameof(index)) + }; + set + { + switch (index) + { + case 0: + if (value.TryGetValue(out int a)) + { + A = a; + } + break; + case 1: + ChildValue = value; + break; + case 2: + ArrayValue = value; + break; + } + } + } + + public Variant this[string name] + { + get => name switch + { + "A" => new Variant(A), + "Child" => ChildValue, + "ArrayField" => ArrayValue, + _ => throw new ArgumentOutOfRangeException(nameof(name)) + }; + set + { + switch (name) + { + case "A": + if (value.TryGetValue(out int a)) + { + A = a; + } + break; + case "Child": + ChildValue = value; + break; + case "ArrayField": + ArrayValue = value; + break; + } + } + } + } + + /// + /// The activator for . + /// + internal sealed class TestRootType : EncodeableType + { + public const uint NumericId = 9100; + + public static ExpandedNodeId EncodingId { get; } = new ExpandedNodeId(NumericId, TestStructureNamespace.Uri); + + public override XmlQualifiedName XmlName => new("TestRootStructure", Ua.Namespaces.OpcUaXsd); + + public override IEncodeable CreateInstance() + { + return new TestRootStructure(); + } + + public override DataTypeDefinition GetDataTypeDefinition(NamespaceTable namespaceUris) + { + return new StructureDefinition + { + BaseDataType = Ua.DataTypeIds.Structure, + StructureType = StructureType.Structure, + Fields = + [ + new StructureField + { + Name = "A", + DataType = Ua.DataTypeIds.Int32, + ValueRank = ValueRanks.Scalar + }, + new StructureField + { + Name = "Child", + DataType = ExpandedNodeId.ToNodeId(TestChildType.EncodingId, namespaceUris), + ValueRank = ValueRanks.Scalar + }, + new StructureField + { + Name = "ArrayField", + DataType = Ua.DataTypeIds.Int32, + ValueRank = ValueRanks.OneDimension + } + ] + }; + } + } + + /// + /// The shared namespace URI the hand-crafted test structure types are registered under. + /// + internal static class TestStructureNamespace + { + public const string Uri = "http://test.org/UA/WotProjectionBindingRuntimeTests/"; + } + + /// + /// Builds a minimal graph (no running + /// server) with a scalar Int32 variable and a + /// typed variable, for exercising + /// directly. + /// + internal sealed class WotProjectionBindingRuntimeTestHarness + { + public NodeManagerBuilder Builder { get; } + + public ushort Ns { get; } + + public BaseDataVariableState ScalarVar { get; } + + public BaseDataVariableState StructVar { get; } + + public FakeWotBindingChannelFactory ChannelFactory { get; } = new(); + + /// + /// Initializes a new harness. + /// + /// + /// When true (the default), and + /// are registered into the harness's + /// up front, matching a NodeManager + /// activated after NodeManagerLifecycle.RefreshComplexTypesAsync + /// already populated it. When false, neither type is + /// registered, matching activation before that refresh runs; the test + /// can register them later against the same + /// instance (via + /// Builder.Context.EncodeableFactory) to simulate the refresh + /// completing after the runtime was wired. + /// + public WotProjectionBindingRuntimeTestHarness(bool registerStructureTypes = true) + { + var namespaceUris = new NamespaceTable(); + Ns = (ushort)namespaceUris.Append(TestStructureNamespace.Uri); + + IEncodeableFactory factory = ServiceMessageContext.CreateEmpty(null!).Factory; + if (registerStructureTypes) + { + factory.Builder + .AddEncodeableType(TestChildType.EncodingId, new TestChildType()) + .AddEncodeableType(TestRootType.EncodingId, new TestRootType()) + .Commit(); + } + + var ctx = new SystemContext(telemetry: null!) + { + NamespaceUris = namespaceUris, + EncodeableFactory = factory + }; + + var root = new BaseObjectState(parent: null) + { + NodeId = new NodeId("Root", Ns), + BrowseName = new QualifiedName("Root", Ns), + DisplayName = new LocalizedText("Root") + }; + + ScalarVar = new BaseDataVariableState(root) + { + NodeId = new NodeId("Scalar", Ns), + BrowseName = new QualifiedName("Scalar", Ns), + DisplayName = new LocalizedText("Scalar"), + DataType = Ua.DataTypeIds.Int32, + ValueRank = ValueRanks.Scalar, + AccessLevel = AccessLevels.CurrentReadOrWrite, + UserAccessLevel = AccessLevels.CurrentReadOrWrite + }; + root.AddChild(ScalarVar); + + StructVar = new BaseDataVariableState(root) + { + NodeId = new NodeId("Struct", Ns), + BrowseName = new QualifiedName("Struct", Ns), + DisplayName = new LocalizedText("Struct"), + DataType = new NodeId(TestRootType.NumericId, Ns), + ValueRank = ValueRanks.Scalar, + AccessLevel = AccessLevels.CurrentReadOrWrite, + UserAccessLevel = AccessLevels.CurrentReadOrWrite + }; + root.AddChild(StructVar); + + var byId = new Dictionary + { + [root.NodeId] = root, + [ScalarVar.NodeId] = ScalarVar, + [StructVar.NodeId] = StructVar + }; + + Builder = new NodeManagerBuilder( + ctx, + Mock.Of(), + Ns, + rootResolver: q => q == root.BrowseName ? root : null!, + nodeIdResolver: id => byId.TryGetValue(id, out NodeState? n) ? n : null!, + typeIdResolver: _ => [], + dataTypeIdResolver: dataTypeId => + { + var matches = new List(); + foreach (NodeState node in byId.Values) + { + if (node is BaseVariableState v && v.DataType == dataTypeId) + { + matches.Add(node); + } + } + return matches.ToArrayOf(); + }); + } + + public string ScalarNodeIdText => $"ns={Ns};s=Scalar"; + + public string StructNodeIdText => $"ns={Ns};s=Struct"; + + public string StructTypeNodeIdText => $"ns={Ns};i={TestRootType.NumericId}"; + + public static WotCompiledForm Form( + WoTBindingCapabilityEnum operation, + WotTargetMappingDescriptor mapping, + bool executable = true, + string affordanceName = "value") + { + string opToken = operation switch + { + WoTBindingCapabilityEnum.ReadProperty => "readproperty", + WoTBindingCapabilityEnum.WriteProperty => "writeproperty", + WoTBindingCapabilityEnum.ObserveProperty => "observeproperty", + WoTBindingCapabilityEnum.InvokeAction => "invokeaction", + _ => "unknown" + }; + return new WotCompiledForm( + new WotBindingIdentity("test", "1.0", "urn:test"), + WotAffordanceKind.Property, + affordanceName, + "/properties/" + affordanceName + "/forms/0", + operation, + opToken, + new WotEndpointDescriptor("test", null, -1, "test://x"), + new WotAddressingDescriptor(affordanceName), + new WotOperationDescriptor(operation, opToken, "GET"), + new WotPayloadDescriptor("application/json", "json"), + [], + isExecutable: executable, + targetMapping: mapping); + } + + public static WotBindingPlan Plan(params WotCompiledForm[] forms) + { + return new( + "res", + [], + [.. forms], + [], + []); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotProjectionBindingRuntimeTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotProjectionBindingRuntimeTests.cs new file mode 100644 index 0000000000..01338e72e0 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotProjectionBindingRuntimeTests.cs @@ -0,0 +1,866 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server.Materialization; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises and + /// directly against a lightweight + /// graph (no running + /// server): direct scalar read/write, ignore rules, conflict/duplicate + /// diagnostics, lazy single-open channel caching, failed-open retry, + /// disposal, structured field composition, and generation isolation. + /// + [TestFixture] + public sealed class WotProjectionBindingRuntimeTests + { + [Test] + public async Task DirectReadReturnsChannelValuePreservingStatusAndTimestamp() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readForm = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + var channel = new FakeWotBindingChannel(readForm); + var timestamp = new DateTimeUtc(2026, 1, 1, 0, 0, 0); + channel.OnRead = _ => new ValueTask(new WotReadResult( + StatusCodes.Good, + new DataValue(new Variant(42), StatusCodes.UncertainInitialValue, timestamp))); + h.ChannelFactory.SetChannel(readForm, channel); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readForm)]).ConfigureAwait(false); + + (ServiceResult result, DataValue value) = await h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(ServiceResult.IsGoodOrUncertain(result), Is.True); + Assert.That(value.WrappedValue.TryGetValue(out int read) && read == 42, Is.True); + Assert.That(value.StatusCode, Is.EqualTo(StatusCodes.UncertainInitialValue)); + Assert.That(value.SourceTimestamp, Is.EqualTo(timestamp)); + + Assert.That(runtime, Is.Not.Null); + await runtime!.DisposeAsync().ConfigureAwait(false); + Assert.That(channel.DisposeCount, Is.EqualTo(1)); + } + + [Test] + public async Task DirectWriteWritesThroughChannel() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm writeForm = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + var channel = new FakeWotBindingChannel(writeForm); + DataValue? written = null; + channel.OnWrite = (value, _) => + { + written = value; + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + }; + h.ChannelFactory.SetChannel(writeForm, channel); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(writeForm)]).ConfigureAwait(false); + + ServiceResult result = await h.ScalarVar.WriteAttributeAsync( + h.Builder.Context, Attributes.Value, default, new DataValue(new Variant(7))).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(written, Is.Not.Null); + Assert.That(written!.Value.WrappedValue.TryGetValue(out int w) && w == 7, Is.True); + } + + [Test] + public async Task FormsWithoutTargetMappingAreIgnored() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, WotTargetMappingDescriptor.Empty); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form)]).ConfigureAwait(false); + + Assert.That(h.ScalarVar.OnReadValueAsync, Is.Null); + Assert.That(h.ChannelFactory.OpenCount, Is.Zero); + } + + [Test] + public async Task NonExecutableFormsAreIgnored() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + executable: false); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form)]).ConfigureAwait(false); + + Assert.That(h.ScalarVar.OnReadValueAsync, Is.Null); + Assert.That(h.ChannelFactory.OpenCount, Is.Zero); + } + + [Test] + public async Task ObserveOnlyDoesNotWireASeparateBridge() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ObserveProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form)]).ConfigureAwait(false); + + Assert.That(h.ScalarVar.OnReadValueAsync, Is.Null); + Assert.That(h.ScalarVar.OnWriteValueAsync, Is.Null); + Assert.That(h.ChannelFactory.OpenCount, Is.Zero); + } + + [Test] + public void ConflictingDirectAndFieldMappingThrowsDuringWire() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm direct = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "direct"); + WotCompiledForm field = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText, fieldPath: "X"), + affordanceName: "field"); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + + ServiceResultException? ex = Assert.ThrowsAsync(async () => + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(direct, field)]).ConfigureAwait(false)); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public void DuplicateReadMappingThrowsDuringWire() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm read1 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "read1"); + WotCompiledForm read2 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "read2"); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + + ServiceResultException? ex = Assert.ThrowsAsync(async () => + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(read1, read2)]).ConfigureAwait(false)); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public void DuplicateWriteMappingThrowsDuringWire() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm write1 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "write1"); + WotCompiledForm write2 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "write2"); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + + ServiceResultException? ex = Assert.ThrowsAsync(async () => + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(write1, write2)]).ConfigureAwait(false)); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public void UnsupportedOperationThrowsDuringWire() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm invoke = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.InvokeAction, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + + ServiceResultException? ex = Assert.ThrowsAsync(async () => + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(invoke)]).ConfigureAwait(false)); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public async Task LazyOpenConcurrentFirstUseOpensChannelOnce() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readForm = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + var channel = new FakeWotBindingChannel(readForm); + var gate = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + h.ChannelFactory.SetOpener(readForm, async () => + { + await gate.Task.ConfigureAwait(false); + return channel; + }); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readForm)]).ConfigureAwait(false); + + Task<(ServiceResult, DataValue)> read1 = h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()).AsTask(); + Task<(ServiceResult, DataValue)> read2 = h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()).AsTask(); + + gate.SetResult(true); + await Task.WhenAll(read1, read2).ConfigureAwait(false); + + Assert.That(h.ChannelFactory.OpenCount, Is.EqualTo(1), + "Concurrent first use must open the shared channel exactly once."); + } + + [Test] + public async Task FailedOpenIsEvictedRetrySucceeds() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readForm = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + var channel = new FakeWotBindingChannel(readForm) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(1)))) + }; + int attempt = 0; + h.ChannelFactory.SetOpener(readForm, () => + { + attempt++; + if (attempt == 1) + { + return new ValueTask( + Task.FromException(new InvalidOperationException("open failed"))); + } + return new ValueTask(channel); + }); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readForm)]).ConfigureAwait(false); + + (ServiceResult firstResult, _) = await h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + Assert.That(ServiceResult.IsBad(firstResult), Is.True, "The first (faulted) open must fail the read."); + + (ServiceResult secondResult, DataValue secondValue) = await h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + Assert.That(ServiceResult.IsGood(secondResult), Is.True, "A retry after a faulted open must succeed."); + Assert.That(secondValue.WrappedValue.TryGetValue(out int v) && v == 1, Is.True); + Assert.That(attempt, Is.EqualTo(2), "The faulted open must be evicted so the retry opens again."); + } + + [Test] + public async Task DisposeDisposesOpenedChannelsAggregatesFailures() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readForm = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "read"); + WotCompiledForm writeForm = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText), + affordanceName: "write"); + var readChannel = new FakeWotBindingChannel(readForm); + var writeChannel = new FakeWotBindingChannel(writeForm) + { + OnDispose = () => throw new InvalidOperationException("dispose failed") + }; + h.ChannelFactory.SetChannel(readForm, readChannel); + h.ChannelFactory.SetChannel(writeForm, writeChannel); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readForm, writeForm)]).ConfigureAwait(false); + + // Open both channels. + await h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + await h.ScalarVar.WriteAttributeAsync( + h.Builder.Context, Attributes.Value, default, new DataValue(new Variant(1))).ConfigureAwait(false); + + AggregateException? ex = Assert.ThrowsAsync( + async () => await runtime!.DisposeAsync().ConfigureAwait(false)); + Assert.That(ex!.InnerExceptions, Has.Count.EqualTo(1)); + Assert.That(readChannel.DisposeCount, Is.EqualTo(1), + "A sibling channel's dispose failure must not prevent other channels from being disposed."); + Assert.That(writeChannel.DisposeCount, Is.EqualTo(1)); + } + + [Test] + public async Task GenerationIsolationTwoRuntimesHaveIndependentChannelsAndDisposal() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form1 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h.ScalarNodeIdText)); + var channel1 = new FakeWotBindingChannel(form1); + h.ChannelFactory.SetChannel(form1, channel1); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime1 = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form1)]).ConfigureAwait(false); + await h.ScalarVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + // A second, independent generation with its own compiled form (and + // hence its own channel) targeting the same variable. + var h2 = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form2 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetNodeId: h2.ScalarNodeIdText)); + var channel2 = new FakeWotBindingChannel(form2); + h2.ChannelFactory.SetChannel(form2, channel2); + var factory2 = new WotProjectionBindingRuntimeFactory(h2.ChannelFactory); + IAsyncDisposable? runtime2 = await factory2.CreateAsync( + h2.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form2)]).ConfigureAwait(false); + await h2.ScalarVar.ReadAttributeAsync( + h2.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + await runtime1!.DisposeAsync().ConfigureAwait(false); + + Assert.That(channel1.DisposeCount, Is.EqualTo(1)); + Assert.That(channel2.DisposeCount, Is.Zero, + "Disposing one generation's runtime must not affect a different generation's channels."); + + await runtime2!.DisposeAsync().ConfigureAwait(false); + Assert.That(channel2.DisposeCount, Is.EqualTo(1)); + } + + [Test] + public async Task StructuredOneLevelReadComposesFields() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA"); + var channelA = new FakeWotBindingChannel(readA) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(11)))) + }; + h.ChannelFactory.SetChannel(readA, channelA); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readA)]).ConfigureAwait(false); + + (ServiceResult result, DataValue value) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(value.WrappedValue.TryGetValue(out ExtensionObject ext), Is.True); + Assert.That(ext.TryGetValue(out IEncodeable? encodeable), Is.True); + var root = (TestRootStructure)encodeable!; + Assert.That(root.A, Is.EqualTo(11)); + } + + [Test] + public async Task StructuredOneLevelWriteExtractsFields() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm writeA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "writeA"); + var channelA = new FakeWotBindingChannel(writeA); + Variant written = default; + channelA.OnWrite = (value, _) => + { + written = value.WrappedValue; + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + }; + h.ChannelFactory.SetChannel(writeA, channelA); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(writeA)]).ConfigureAwait(false); + + var incoming = new TestRootStructure { A = 55 }; + ServiceResult result = await h.StructVar.WriteAttributeAsync( + h.Builder.Context, + Attributes.Value, + default, + new DataValue(new Variant(new ExtensionObject(incoming)))).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(written.IsNull, Is.False); + Assert.That(written.TryGetValue(out int a) && a == 55, Is.True); + } + + [Test] + public async Task StructuredNestedReadComposesNestedStructure() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readChildX = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child/X"), + affordanceName: "readChildX"); + var channel = new FakeWotBindingChannel(readChildX) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(99)))) + }; + h.ChannelFactory.SetChannel(readChildX, channel); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readChildX)]).ConfigureAwait(false); + + (ServiceResult result, DataValue value) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(value.WrappedValue.TryGetValue(out ExtensionObject ext), Is.True); + Assert.That(ext.TryGetValue(out IEncodeable? rootEncodeable), Is.True); + var root = (TestRootStructure)rootEncodeable!; + Assert.That(root.ChildValue.TryGetValue(out ExtensionObject childExt), Is.True); + Assert.That(childExt.TryGetValue(out IEncodeable? childEncodeable), Is.True); + var child = (TestChildStructure)childEncodeable!; + Assert.That(child.X, Is.EqualTo(99)); + } + + [Test] + public async Task StructuredNestedWriteExtractsNestedField() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm writeChildX = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child/X"), + affordanceName: "writeChildX"); + var channel = new FakeWotBindingChannel(writeChildX); + Variant written = default; + channel.OnWrite = (value, _) => + { + written = value.WrappedValue; + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + }; + h.ChannelFactory.SetChannel(writeChildX, channel); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(writeChildX)]).ConfigureAwait(false); + + var incomingChild = new TestChildStructure { X = 77 }; + var incoming = new TestRootStructure { ChildValue = new Variant(new ExtensionObject(incomingChild)) }; + ServiceResult result = await h.StructVar.WriteAttributeAsync( + h.Builder.Context, + Attributes.Value, + default, + new DataValue(new Variant(new ExtensionObject(incoming)))).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(written.IsNull, Is.False); + Assert.That(written.TryGetValue(out int x) && x == 77, Is.True); + } + + [Test] + public async Task StructuredUnknownFieldFirstReadFailsDeterministically() + { + // BuildPlan validation is deferred to first use (see class remarks + // on WotStructuredGroupState): CreateAsync itself must not throw. + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "NoSuchField")); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form)]).ConfigureAwait(false); + Assert.That(runtime, Is.Not.Null, "Wiring must succeed; field-path validation is deferred."); + + (ServiceResult result, _) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public async Task StructuredArrayValuedIntermediateFieldFirstReadFailsDeterministically() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "ArrayField/X")); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form)]).ConfigureAwait(false); + Assert.That(runtime, Is.Not.Null, "Wiring must succeed; field-path validation is deferred."); + + (ServiceResult result, _) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public async Task StructuredEmptyPathSegmentFirstReadFailsDeterministically() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm form = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child//X")); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(form)]).ConfigureAwait(false); + Assert.That(runtime, Is.Not.Null, "Wiring must succeed; field-path validation is deferred."); + + (ServiceResult result, _) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + + [Test] + public async Task StructuredUnregisteredTypeFirstReadFailsDeterministicallyThenRetrySucceedsAfterRegistration() + { + // The structure type is not yet registered when the runtime is + // wired (mirrors ConfigureAsync running before + // NodeManagerLifecycle.RefreshComplexTypesAsync). Wiring, and a + // first read attempted before registration, must both fail + // deterministically without throwing out of the request pipeline; + // once the type is registered into the same factory instance + // (simulating RefreshComplexTypesAsync) a later read must succeed. + var h = new WotProjectionBindingRuntimeTestHarness(registerStructureTypes: false); + WotCompiledForm readA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA"); + var channelA = new FakeWotBindingChannel(readA) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(11)))) + }; + h.ChannelFactory.SetChannel(readA, channelA); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + IAsyncDisposable? runtime = await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readA)]).ConfigureAwait(false); + Assert.That(runtime, Is.Not.Null, + "Wiring must succeed even though the structure type is not registered yet."); + + (ServiceResult beforeResult, _) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + Assert.That(ServiceResult.IsBad(beforeResult), Is.True, + "A read before the type is registered must fail deterministically, not throw."); + Assert.That(beforeResult.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + + // Simulate NodeManagerLifecycle.RefreshComplexTypesAsync completing: + // register the type into the very same factory instance the + // runtime captured at wiring time. + h.Builder.Context.EncodeableFactory.Builder + .AddEncodeableType(TestRootType.EncodingId, new TestRootType()) + .Commit(); + + (ServiceResult afterResult, DataValue afterValue) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + Assert.That(ServiceResult.IsGood(afterResult), Is.True, + "A read after the type is registered must retry resolution and succeed."); + Assert.That(afterValue.WrappedValue.TryGetValue(out ExtensionObject ext), Is.True); + Assert.That(ext.TryGetValue(out IEncodeable? encodeable), Is.True); + Assert.That(((TestRootStructure)encodeable!).A, Is.EqualTo(11)); + } + + [Test] + public async Task StructuredUnregisteredTypeFirstWriteFailsDeterministicallyThenRetrySucceedsAfterRegistration() + { + var h = new WotProjectionBindingRuntimeTestHarness(registerStructureTypes: false); + WotCompiledForm writeA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "writeA"); + var channelA = new FakeWotBindingChannel(writeA); + Variant written = default; + channelA.OnWrite = (value, _) => + { + written = value.WrappedValue; + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + }; + h.ChannelFactory.SetChannel(writeA, channelA); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(writeA)]).ConfigureAwait(false); + + var incomingBefore = new TestRootStructure { A = 1 }; + ServiceResult beforeResult = await h.StructVar.WriteAttributeAsync( + h.Builder.Context, + Attributes.Value, + default, + new DataValue(new Variant(new ExtensionObject(incomingBefore)))).ConfigureAwait(false); + Assert.That(ServiceResult.IsBad(beforeResult), Is.True, + "A write before the type is registered must fail deterministically, not throw."); + Assert.That(written.IsNull, Is.True); + + h.Builder.Context.EncodeableFactory.Builder + .AddEncodeableType(TestRootType.EncodingId, new TestRootType()) + .Commit(); + + var incomingAfter = new TestRootStructure { A = 55 }; + ServiceResult afterResult = await h.StructVar.WriteAttributeAsync( + h.Builder.Context, + Attributes.Value, + default, + new DataValue(new Variant(new ExtensionObject(incomingAfter)))).ConfigureAwait(false); + Assert.That(ServiceResult.IsGood(afterResult), Is.True, + "A write after the type is registered must retry resolution and succeed."); + Assert.That(written.IsNull, Is.False); + Assert.That(written.TryGetValue(out int a) && a == 55, Is.True); + } + + [Test] + public async Task StructuredPartialReadFailureReturnsBadStatus() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA"); + WotCompiledForm readChildX = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child/X"), + affordanceName: "readChildX"); + var channelA = new FakeWotBindingChannel(readA) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(1)))) + }; + var channelChildX = new FakeWotBindingChannel(readChildX) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.BadNotConnected, DataValue.Null, "not connected")) + }; + h.ChannelFactory.SetChannel(readA, channelA); + h.ChannelFactory.SetChannel(readChildX, channelChildX); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readA, readChildX)]).ConfigureAwait(false); + + (ServiceResult result, _) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(ServiceResult.IsBad(result), Is.True, + "A single failing field must fail the whole structured read."); + } + + [Test] + public async Task StructuredPartialReadFailureReturnsFailedFieldStatusAndTimestampWhenAvailable() + { + // A failed field's own status and timestamp — not a hardcoded + // Bad/Now pair — must surface on the overall structured read. + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA"); + WotCompiledForm readChildX = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child/X"), + affordanceName: "readChildX"); + var channelA = new FakeWotBindingChannel(readA) + { + OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(1)))) + }; + var channelChildX = new FakeWotBindingChannel(readChildX); + var staleTimestamp = new DateTimeUtc(2020, 1, 1, 0, 0, 0); + channelChildX.OnRead = _ => new ValueTask( + new WotReadResult( + StatusCodes.BadNotConnected, + new DataValue(Variant.Null, StatusCodes.BadNotConnected, staleTimestamp), + "not connected")); + h.ChannelFactory.SetChannel(readA, channelA); + h.ChannelFactory.SetChannel(readChildX, channelChildX); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readA, readChildX)]).ConfigureAwait(false); + + (ServiceResult result, DataValue value) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadNotConnected)); + Assert.That(value.SourceTimestamp, Is.EqualTo(staleTimestamp)); + } + + [Test] + public async Task StructuredReadPreservesNonDefaultGoodStatusAndUsesOldestSourceTimestamp() + { + // The composed value must not collapse every field's metadata to + // a hardcoded Good/Now: a non-default Good status among the + // fields must survive, and the oldest field timestamp must win. + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA"); + WotCompiledForm readChildX = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child/X"), + affordanceName: "readChildX"); + var channelA = new FakeWotBindingChannel(readA); + var newerTimestamp = new DateTimeUtc(2026, 1, 2, 0, 0, 0); + channelA.OnRead = _ => new ValueTask( + new WotReadResult(StatusCodes.Good, new DataValue(new Variant(1), StatusCodes.Good, newerTimestamp))); + var channelChildX = new FakeWotBindingChannel(readChildX); + var olderTimestamp = new DateTimeUtc(2026, 1, 1, 0, 0, 0); + channelChildX.OnRead = _ => new ValueTask( + new WotReadResult( + StatusCodes.GoodClamped, + new DataValue(new Variant(2), StatusCodes.GoodClamped, olderTimestamp))); + h.ChannelFactory.SetChannel(readA, channelA); + h.ChannelFactory.SetChannel(readChildX, channelChildX); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readA, readChildX)]).ConfigureAwait(false); + + (ServiceResult result, DataValue value) = await h.StructVar.ReadAttributeAsync( + h.Builder.Context, Attributes.Value, default, QualifiedName.Null, new DataValue()) + .ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.GoodClamped)); + Assert.That(value.SourceTimestamp, Is.EqualTo(olderTimestamp), + "The oldest non-MinValue field timestamp must be used, not the current time."); + } + + [Test] + public async Task StructuredPartialWriteFailureReturnsBadStatus() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm writeA = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "writeA"); + WotCompiledForm writeChildX = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.WriteProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "Child/X"), + affordanceName: "writeChildX"); + var channelA = new FakeWotBindingChannel(writeA) + { + OnWrite = (_, _) => new ValueTask(new WotWriteResult(StatusCodes.Good)) + }; + var channelChildX = new FakeWotBindingChannel(writeChildX) + { + OnWrite = (_, _) => + new ValueTask(new WotWriteResult(StatusCodes.BadNotConnected, "not connected")) + }; + h.ChannelFactory.SetChannel(writeA, channelA); + h.ChannelFactory.SetChannel(writeChildX, channelChildX); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(writeA, writeChildX)]).ConfigureAwait(false); + + var incomingChild = new TestChildStructure { X = 1 }; + var incoming = new TestRootStructure + { + A = 2, + ChildValue = new Variant(new ExtensionObject(incomingChild)) + }; + ServiceResult result = await h.StructVar.WriteAttributeAsync( + h.Builder.Context, + Attributes.Value, + default, + new DataValue(new Variant(new ExtensionObject(incoming)))).ConfigureAwait(false); + + Assert.That(ServiceResult.IsBad(result), Is.True, + "A single failing field write must fail the whole structured write."); + } + + [Test] + public void StructuredDuplicateFieldMappingThrowsDuringWire() + { + var h = new WotProjectionBindingRuntimeTestHarness(); + WotCompiledForm readA1 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA1"); + WotCompiledForm readA2 = WotProjectionBindingRuntimeTestHarness.Form( + WoTBindingCapabilityEnum.ReadProperty, + new WotTargetMappingDescriptor(targetTypeNodeId: h.StructTypeNodeIdText, fieldPath: "A"), + affordanceName: "readA2"); + + var factory = new WotProjectionBindingRuntimeFactory(h.ChannelFactory); + + ServiceResultException? ex = Assert.ThrowsAsync(async () => + await factory.CreateAsync( + h.Builder, [WotProjectionBindingRuntimeTestHarness.Plan(readA1, readA2)]).ConfigureAwait(false)); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotRefreshArgumentsExtendedTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotRefreshArgumentsExtendedTests.cs new file mode 100644 index 0000000000..103a302fc8 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotRefreshArgumentsExtendedTests.cs @@ -0,0 +1,211 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Supplemental tests for covering the + /// numeric type coercions (long, ushort, byte, negative + /// int) and the Enumerate / TryCoerce edge-cases (single + /// , wrapped , and null + /// extension body). + /// + [TestFixture] + [Category("WotCon")] + [Parallelizable(ParallelScope.All)] + public sealed class WotRefreshArgumentsExtendedTests + { + private static IServiceMessageContext Context => ServiceMessageContext.CreateEmpty(null!); + + private static ArrayOf Args(params Variant[] values) + { + return values; + } + + [Test] + public void AcceptsExpectedGenerationAsLong() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant((long)42)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.ExpectedGeneration, Is.EqualTo(42u)); + } + + [Test] + public void AcceptsExpectedGenerationAsZeroLong() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant((long)0)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.ExpectedGeneration, Is.Zero); + } + + [Test] + public void AcceptsExpectedGenerationAsUshort() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant((ushort)100)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.ExpectedGeneration, Is.EqualTo(100u)); + } + + [Test] + public void AcceptsExpectedGenerationAsByte() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant((byte)7)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.ExpectedGeneration, Is.EqualTo(7u)); + } + + [Test] + public void RejectsNegativeIntForExpectedGeneration() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant(-1)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void RejectsLongOutOfRangeForExpectedGeneration() + { + long overflow = (long)uint.MaxValue + 1; + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant(overflow)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void AcceptsSingleExtensionObjectAsSelection() + { + var selector = new WoTResourceSelectorDataType + { + ResourceId = "single-eo", + GroupId = WotRegistryGroups.ThingDescriptions + }; + var extension = new ExtensionObject(selector); + + ArrayOf input = Args(new Variant(extension)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Selection, Has.Length.EqualTo(1)); + Assert.That(request.Selection[0].ResourceId, Is.EqualTo("single-eo")); + } + + [Test] + public void RejectsNullExtensionObjectInSelection() + { + var nullExtension = new ExtensionObject(); + ArrayOf input = Args(new Variant(new[] { nullExtension })); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void AcceptsIEncodeableWrappedInExtensionObjectAsOptions() + { + var options = new WoTRefreshOptionsDataType + { + Force = true, + DryRun = false + }; + var extension = new ExtensionObject(options); + + ArrayOf input = Args( + Variant.Null, + new Variant(extension)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Options.Force, Is.True); + } + + [Test] + public void FullyNullArgumentsDefaultsAreNonNull() + { + ServiceResult status = WotRefreshArguments.TryDecode( + Args(Variant.Null, Variant.Null, Variant.Null, Variant.Null), + Context, + out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Options, Is.Not.Null); + Assert.That(request.Selection, Is.Empty); + Assert.That(request.RequestId, Is.EqualTo(string.Empty)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotRefreshArgumentsTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotRefreshArgumentsTests.cs new file mode 100644 index 0000000000..d2088f4c5e --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotRefreshArgumentsTests.cs @@ -0,0 +1,315 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Xml; +using NUnit.Framework; +using Opc.Ua.Encoders; +using Opc.Ua.WotCon.Server.Materialization; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Unit tests for , the decoder for the + /// generated WoTRegistryType.Refresh Method's Selection / Options / + /// ExpectedGeneration / RequestId arguments. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotRefreshArgumentsTests + { + private static IServiceMessageContext Context => ServiceMessageContext.CreateEmpty(null!); + + private static ArrayOf Args(params Variant[] values) + { + return values; + } + + [Test] + public void EmptyArgumentsDecodeToFullRefreshWithDefaults() + { + ServiceResult status = WotRefreshArguments.TryDecode( + Args(), Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Selection, Is.Empty); + Assert.That(request.ExpectedGeneration, Is.Zero); + Assert.That(request.RequestId, Is.EqualTo(string.Empty)); + Assert.That(request.Options, Is.Not.Null); + } + + [Test] + public void DecodesSelectionArrayOptionsGenerationAndRequestId() + { + var selector = new WoTResourceSelectorDataType + { + GroupId = "thingdescriptions", + ResourceId = "sensor", + Kind = WoTDocumentKindEnum.ThingDescription + }; + var options = new WoTRefreshOptionsDataType + { + Force = true, + DryRun = true, + Atomicity = WoTAtomicityEnum.PerGroup, + DeletePolicy = WoTDeletePolicyEnum.Retire, + IncludeDependents = true + }; + ArrayOf input = Args( + new Variant(new ExtensionObject[] { new(selector) }), + new Variant(new ExtensionObject(options)), + new Variant(7u), + new Variant("req-42")); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Selection, Has.Length.EqualTo(1)); + Assert.That(request.Selection[0].ResourceId, Is.EqualTo("sensor")); + Assert.That(request.Options.Force, Is.True); + Assert.That(request.Options.DryRun, Is.True); + Assert.That(request.Options.Atomicity, Is.EqualTo(WoTAtomicityEnum.PerGroup)); + Assert.That(request.Options.DeletePolicy, Is.EqualTo(WoTDeletePolicyEnum.Retire)); + Assert.That(request.Options.IncludeDependents, Is.True); + Assert.That(request.ExpectedGeneration, Is.EqualTo(7u)); + Assert.That(request.RequestId, Is.EqualTo("req-42")); + } + + [Test] + public void DecodesSelectionFromArrayOfExtensionObject() + { + var selectors = new ArrayOf(new[] + { + new ExtensionObject(new WoTResourceSelectorDataType { Xid = "/groups/g/resources/a" }), + new ExtensionObject(new WoTResourceSelectorDataType { Xid = "/groups/g/resources/b" }) + }); + ArrayOf input = Args(new Variant(selectors)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Selection, Has.Length.EqualTo(2)); + Assert.That(request.Selection[1].Xid, Is.EqualTo("/groups/g/resources/b")); + } + + [Test] + public void RejectsSelectionOfWrongElementType() + { + string[] wrongSelection = ["not-a-selector"]; + ArrayOf input = Args(new Variant(wrongSelection)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void RejectsOptionsOfWrongType() + { + ArrayOf input = Args( + Variant.Null, + new Variant("not-an-options-structure")); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void RejectsExpectedGenerationOfWrongType() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant("five")); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void AcceptsExpectedGenerationAsInt32() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + new Variant(9)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.ExpectedGeneration, Is.EqualTo(9u)); + } + + [Test] + public void RejectsRequestIdOfWrongType() + { + ArrayOf input = Args( + Variant.Null, + Variant.Null, + Variant.Null, + new Variant(123)); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void DecodesBinaryEncodedSelectionBody() + { + IServiceMessageContext context = Context; + var selector = new WoTResourceSelectorDataType { ResourceId = "encoded" }; + byte[] encoded; + using (var encoder = new BinaryEncoder(context)) + { + selector.Encode(encoder); + encoded = encoder.CloseAndReturnBuffer()!; + } + var extension = new ExtensionObject( + DataTypeIds.WoTResourceSelectorDataType, ByteString.From(encoded)); + ArrayOf input = Args(new Variant(new[] { extension })); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, context, out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Selection, Has.Length.EqualTo(1)); + Assert.That(request.Selection[0].ResourceId, Is.EqualTo("encoded")); + } + + [Test] + public void DecodesDynamicStructureOptionsBody() + { + Structure options = CreateDynamicOptions( + DataTypeIds.WoTRefreshOptionsDataType, + ObjectIds.WoTRefreshOptionsDataType_Encoding_DefaultBinary); + ArrayOf input = Args( + Variant.Null, + new Variant(new ExtensionObject( + ObjectIds.WoTRefreshOptionsDataType_Encoding_DefaultBinary, + options))); + + ServiceResult status = WotRefreshArguments.TryDecode( + input, + Context, + out WotRefreshRequest request); + + Assert.That(ServiceResult.IsGood(status), Is.True); + Assert.That(request.Options.Atomicity, Is.EqualTo(WoTAtomicityEnum.PerGroup)); + Assert.That(request.Options.Force, Is.True); + Assert.That(request.Options.DryRun, Is.True); + Assert.That(request.Options.IncludeDependents, Is.True); + Assert.That(request.Options.DeletePolicy, Is.EqualTo(WoTDeletePolicyEnum.Retire)); + Assert.That(request.Options.MaxParallelism, Is.EqualTo(4u)); + Assert.That(request.Options.Timeout, Is.EqualTo(2.5)); + } + + [Test] + public void RejectsDynamicStructureWithDifferentTypeIdentity() + { + var wrongTypeId = new ExpandedNodeId( + 9001u, + 0, + "urn:opcfoundation.org:UA:WotAggregation:WrongType", + 0); + var wrongEncodingId = new ExpandedNodeId( + 9002u, + 0, + "urn:opcfoundation.org:UA:WotAggregation:WrongType", + 0); + Structure options = CreateDynamicOptions(wrongTypeId, wrongEncodingId); + ArrayOf input = Args( + Variant.Null, + new Variant(new ExtensionObject(wrongEncodingId, options))); + + ServiceResult status = WotRefreshArguments.TryDecode(input, Context, out _); + + Assert.That(status.StatusCode.Code, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + private static Structure CreateDynamicOptions( + ExpandedNodeId typeId, + ExpandedNodeId binaryEncodingId) + { + StructureField[] fields = + [ + new StructureField { Name = "Atomicity", DataType = Ua.DataTypeIds.Int32 }, + new StructureField { Name = "Force", DataType = Ua.DataTypeIds.Boolean }, + new StructureField { Name = "DryRun", DataType = Ua.DataTypeIds.Boolean }, + new StructureField { Name = "IncludeDependents", DataType = Ua.DataTypeIds.Boolean }, + new StructureField { Name = "DeletePolicy", DataType = Ua.DataTypeIds.Int32 }, + new StructureField { Name = "MaxParallelism", DataType = Ua.DataTypeIds.UInt32 }, + new StructureField { Name = "Timeout", DataType = Ua.DataTypeIds.Double } + ]; + var definition = new StructureDefinition + { + BaseDataType = Ua.DataTypeIds.Structure, + StructureType = StructureType.Structure, + Fields = fields + }; + var fieldTypes = new Dictionary + { + ["Atomicity"] = BuiltInType.Enumeration, + ["Force"] = BuiltInType.Boolean, + ["DryRun"] = BuiltInType.Boolean, + ["IncludeDependents"] = BuiltInType.Boolean, + ["DeletePolicy"] = BuiltInType.Enumeration, + ["MaxParallelism"] = BuiltInType.UInt32, + ["Timeout"] = BuiltInType.Double + }; + return new Structure( + new XmlQualifiedName( + nameof(WoTRefreshOptionsDataType), + Namespaces.WotCon), + typeId, + binaryEncodingId, + ExpandedNodeId.Null, + definition, + fieldTypes) + { + ["Atomicity"] = Variant.From(WoTAtomicityEnum.PerGroup), + ["Force"] = Variant.From(true), + ["DryRun"] = Variant.From(true), + ["IncludeDependents"] = Variant.From(true), + ["DeletePolicy"] = Variant.From(WoTDeletePolicyEnum.Retire), + ["MaxParallelism"] = Variant.From(4u), + ["Timeout"] = Variant.From(2.5) + }; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotStructuredGroupStateTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotStructuredGroupStateTests.cs new file mode 100644 index 0000000000..19b82a3d03 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotStructuredGroupStateTests.cs @@ -0,0 +1,166 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Materialization; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises directly: a failed + /// resolution is never cached and retries against the (possibly + /// by-then-populated) factory, and concurrent first use resolves exactly + /// once under the lock. + /// + [TestFixture] + public sealed class WotStructuredGroupStateTests + { + [Test] + public void EnsureResolvedTypeUnavailableFailsWithoutCachingThenSucceedsAfterRegistration() + { + var namespaceUris = new NamespaceTable(); + ushort ns = (ushort)namespaceUris.Append(TestStructureNamespace.Uri); + IEncodeableFactory factory = ServiceMessageContext.CreateEmpty(null!).Factory; + var dataTypeId = new NodeId(TestRootType.NumericId, ns); + var targetNodeId = new NodeId("Struct", ns); + + var state = new WotStructuredGroupState( + factory, + namespaceUris, + dataTypeId, + targetNodeId, + readSlots: [], + writeSlots: []); + + WotStructuredGroupResolution first = state.EnsureResolved(); + Assert.That(first.Success, Is.False); + Assert.That(first.Error.StatusCode, Is.EqualTo(StatusCodes.BadConfigurationError)); + Assert.That(first.RootType, Is.Null); + + // Simulate NodeManagerLifecycle.RefreshComplexTypesAsync completing + // against the very same factory instance. + factory.Builder.AddEncodeableType(TestRootType.EncodingId, new TestRootType()).Commit(); + + WotStructuredGroupResolution second = state.EnsureResolved(); + Assert.That( + second.Success, Is.True, "The failed attempt must not have been cached; a retry must resolve now."); + Assert.That(second.RootType, Is.Not.Null); + } + + [Test] + public void EnsureResolvedConcurrentFirstCallsResolveExactlyOnceAndAllSucceed() + { + var namespaceUris = new NamespaceTable(); + ushort ns = (ushort)namespaceUris.Append(TestStructureNamespace.Uri); + IEncodeableFactory inner = ServiceMessageContext.CreateEmpty(null!).Factory; + inner.Builder.AddEncodeableType(TestRootType.EncodingId, new TestRootType()).Commit(); + var counting = new CountingEncodeableFactory(inner); + var dataTypeId = new NodeId(TestRootType.NumericId, ns); + var targetNodeId = new NodeId("Struct", ns); + + var state = new WotStructuredGroupState( + counting, + namespaceUris, + dataTypeId, + targetNodeId, + readSlots: [], + writeSlots: []); + + const int callerCount = 8; + var barrier = new Barrier(callerCount); + var tasks = new Task[callerCount]; + for (int i = 0; i < callerCount; i++) + { + tasks[i] = Task.Run(() => + { + barrier.SignalAndWait(); + return state.EnsureResolved(); + }); + } + Task.WaitAll(tasks); + + foreach (Task task in tasks) + { + Assert.That(task.Result.Success, Is.True); + } + Assert.That(counting.TryGetEncodeableTypeCallCount, Is.EqualTo(1), + "Concurrent first use must resolve exactly once under the lock, not once per caller."); + } + + /// + /// A minimal decorator that forwards + /// every lookup to an inner factory while counting + /// calls, so a test can assert how + /// many times resolution actually ran. + /// + private sealed class CountingEncodeableFactory : IEncodeableFactory + { + public CountingEncodeableFactory(IEncodeableFactory inner) + { + m_inner = inner; + } + + public IEnumerable KnownTypeIds => m_inner.KnownTypeIds; + + public IEncodeableFactoryBuilder Builder => m_inner.Builder; + + public int TryGetEncodeableTypeCallCount => m_count; + + public bool TryGetEncodeableType( + ExpandedNodeId typeId, + [NotNullWhen(true)] out IEncodeableType? encodeableType) + { + Interlocked.Increment(ref m_count); + return m_inner.TryGetEncodeableType(typeId, out encodeableType); + } + + public bool TryGetEnumeratedType( + ExpandedNodeId typeId, + [NotNullWhen(true)] out IEnumeratedType? enumeratedType) + { + return m_inner.TryGetEnumeratedType(typeId, out enumeratedType); + } + + public bool TryGetType( + XmlQualifiedName xmlName, + [NotNullWhen(true)] out IType? type) + { + return m_inner.TryGetType(xmlName, out type); + } + + private readonly IEncodeableFactory m_inner; + private int m_count; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Materialization/WotTargetVariableResolverTests.cs b/tests/Opc.Ua.WotCon.Tests/Materialization/WotTargetVariableResolverTests.cs new file mode 100644 index 0000000000..17ddb2a3e3 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Materialization/WotTargetVariableResolverTests.cs @@ -0,0 +1,301 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Collections.Generic; +using Moq; +using NUnit.Framework; +using Opc.Ua.Server; +using Opc.Ua.Server.Fluent; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Server.Materialization; + +namespace Opc.Ua.WotCon.Tests.Materialization +{ + /// + /// Exercises against a lightweight + /// graph (no running server): exact NodeId + /// resolution, type-only unique/ambiguous resolution, exact+type validation, + /// and the deterministic failure statuses for missing, malformed, ambiguous, + /// wrong-node-class and type-mismatch mappings. + /// + [TestFixture] + public sealed class WotTargetVariableResolverTests + { + private const string NsUri = "http://test.org/UA/Wot/"; + + [Test] + public void MapToNodeIdResolvesExactVariable() + { + (NodeManagerBuilder builder, ushort ns, BaseDataVariableState var1, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + BaseVariableState resolved = resolver.Resolve( + builder, new WotTargetMappingDescriptor(targetNodeId: $"ns={ns};s=Var1")); + + Assert.That(resolved, Is.SameAs(var1)); + } + + [Test] + public void MapToNodeIdPortableNsuFormResolvesAgainstNamespaceUris() + { + (NodeManagerBuilder builder, _, BaseDataVariableState var1, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + BaseVariableState resolved = resolver.Resolve( + builder, new WotTargetMappingDescriptor(targetNodeId: $"nsu={NsUri};s=Var1")); + + Assert.That(resolved, Is.SameAs(var1)); + } + + [Test] + public void MapToNodeIdMissingNodeThrowsBadNodeIdUnknown() + { + (NodeManagerBuilder builder, ushort ns, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, new WotTargetMappingDescriptor(targetNodeId: $"ns={ns};s=NoSuchVar"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public void MapToNodeIdMalformedTextThrowsBadNodeIdInvalid() + { + (NodeManagerBuilder builder, _, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, new WotTargetMappingDescriptor(targetNodeId: "not a node id"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + } + + [Test] + public void MapToNodeIdMalformedTextMessageNamesTheOffendingTerm() + { + // The parser's own ServiceResultException (BadNodeIdInvalid) must + // be wrapped, not rethrown verbatim, so the message names which + // target-mapping term ('uav:mapToNodeId') carried the bad text. + (NodeManagerBuilder builder, _, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, new WotTargetMappingDescriptor(targetNodeId: "not a node id"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + Assert.That(ex.Message, Does.Contain("uav:mapToNodeId")); + } + + [Test] + public void MapToTypeUnresolvableNamespaceUriWrapsServiceResultExceptionAsBadNodeIdInvalid() + { + // 'nsu=' referencing a namespace absent from the builder's table + // makes the parser itself throw a ServiceResultException; that + // must still be wrapped as BadNodeIdInvalid naming 'uav:mapToType', + // not rethrown with the parser's own (unrelated) message. + (NodeManagerBuilder builder, _, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve( + builder, + new WotTargetMappingDescriptor(targetTypeNodeId: "nsu=http://no.such.namespace/;i=1"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + Assert.That(ex.Message, Does.Contain("uav:mapToType")); + } + + [Test] + public void MapToNodeIdWrongNodeClassThrowsBadTypeMismatch() + { + (NodeManagerBuilder builder, ushort ns, _, _, BaseObjectState obj) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, new WotTargetMappingDescriptor( + targetNodeId: $"ns={ns};s={obj.NodeId.IdentifierAsString}"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTypeMismatch)); + } + + [Test] + public void MapToTypeUniqueResolvesVariable() + { + (NodeManagerBuilder builder, ushort ns, BaseDataVariableState var1, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + BaseVariableState resolved = resolver.Resolve( + builder, new WotTargetMappingDescriptor(targetTypeNodeId: $"ns={ns};i=1")); + + Assert.That(resolved, Is.SameAs(var1)); + } + + [Test] + public void MapToTypeAmbiguousThrowsBadBrowseNameDuplicated() + { + (NodeManagerBuilder builder, ushort ns, _, _, _) = CreateGraph(secondVariableSameType: true); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, new WotTargetMappingDescriptor(targetTypeNodeId: $"ns={ns};i=1"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadBrowseNameDuplicated)); + } + + [Test] + public void MapToTypeNoMatchThrowsBadNodeIdUnknown() + { + (NodeManagerBuilder builder, ushort ns, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, new WotTargetMappingDescriptor(targetTypeNodeId: $"ns={ns};i=999"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + [Test] + public void BothMatchingDataTypeResolvesAndValidates() + { + (NodeManagerBuilder builder, ushort ns, BaseDataVariableState var1, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + BaseVariableState resolved = resolver.Resolve( + builder, + new WotTargetMappingDescriptor(targetNodeId: $"ns={ns};s=Var1", targetTypeNodeId: $"ns={ns};i=1")); + + Assert.That(resolved, Is.SameAs(var1)); + } + + [Test] + public void BothMismatchingDataTypeThrowsBadTypeMismatch() + { + (NodeManagerBuilder builder, ushort ns, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve( + builder, + new WotTargetMappingDescriptor(targetNodeId: $"ns={ns};s=Var1", targetTypeNodeId: $"ns={ns};i=2"))); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTypeMismatch)); + } + + [Test] + public void NeitherTermPresentThrowsBadNodeIdInvalid() + { + (NodeManagerBuilder builder, _, _, _, _) = CreateGraph(); + var resolver = new WotTargetVariableResolver(); + + ServiceResultException ex = Assert.Throws(() => + resolver.Resolve(builder, WotTargetMappingDescriptor.Empty)); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdInvalid)); + } + + private static (NodeManagerBuilder Builder, ushort Ns, BaseDataVariableState Var1, + BaseDataVariableState? Var2, BaseObjectState Obj) CreateGraph(bool secondVariableSameType = false) + { + var namespaceUris = new NamespaceTable(); + ushort ns = (ushort)namespaceUris.Append(NsUri); + + var ctx = new SystemContext(telemetry: null!) + { + NamespaceUris = namespaceUris + }; + + var dataType1 = new NodeId(1, ns); + var dataType2 = new NodeId(2, ns); + + var root = new BaseObjectState(parent: null) + { + NodeId = new NodeId("Root", ns), + BrowseName = new QualifiedName("Root", ns), + DisplayName = new LocalizedText("Root") + }; + + var var1 = new BaseDataVariableState(root) + { + NodeId = new NodeId("Var1", ns), + BrowseName = new QualifiedName("Var1", ns), + DisplayName = new LocalizedText("Var1"), + DataType = dataType1, + ValueRank = ValueRanks.Scalar + }; + root.AddChild(var1); + + BaseDataVariableState? var2 = null; + if (secondVariableSameType) + { + var2 = new BaseDataVariableState(root) + { + NodeId = new NodeId("Var2", ns), + BrowseName = new QualifiedName("Var2", ns), + DisplayName = new LocalizedText("Var2"), + DataType = dataType1, + ValueRank = ValueRanks.Scalar + }; + root.AddChild(var2); + } + + var byId = new Dictionary + { + [root.NodeId] = root, + [var1.NodeId] = var1 + }; + if (var2 is not null) + { + byId[var2.NodeId] = var2; + } + + var builder = new NodeManagerBuilder( + ctx, + nodeManager: Mock.Of(), + defaultNamespaceIndex: ns, + rootResolver: q => q == root.BrowseName ? root : null!, + nodeIdResolver: id => byId.TryGetValue(id, out NodeState? n) ? n : null!, + typeIdResolver: _ => [], + dataTypeIdResolver: dataTypeId => + { + var matches = new List(); + foreach (NodeState node in byId.Values) + { + if (node is BaseVariableState v && v.DataType == dataTypeId) + { + matches.Add(node); + } + } + return matches.ToArrayOf(); + }); + + return (builder, ns, var1, var2, root); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Opc.Ua.WotCon.Tests.csproj b/tests/Opc.Ua.WotCon.Tests/Opc.Ua.WotCon.Tests.csproj index ca9d37fdc7..7f0f8115de 100644 --- a/tests/Opc.Ua.WotCon.Tests/Opc.Ua.WotCon.Tests.csproj +++ b/tests/Opc.Ua.WotCon.Tests/Opc.Ua.WotCon.Tests.csproj @@ -5,7 +5,6 @@ Opc.Ua.WotCon.Tests enable false - $(NoWarn);CS1591;CA2007;CA2000;CA1014 @@ -34,7 +33,13 @@ + + + + + + diff --git a/tests/Opc.Ua.WotCon.Tests/Properties/AssemblyInfo.cs b/tests/Opc.Ua.WotCon.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..2b9848014c --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,32 @@ +/* ======================================================================== + * Copyright (c) 2005-2025 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/ + * ======================================================================*/ + +using System; + +[assembly: CLSCompliant(false)] diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/FileWotRegistryStoreExtendedTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/FileWotRegistryStoreExtendedTests.cs new file mode 100644 index 0000000000..45c76ec6b9 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/FileWotRegistryStoreExtendedTests.cs @@ -0,0 +1,343 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Supplemental tests for covering + /// error paths: corrupt manifest, missing blob, empty snapshot round-trip, + /// and label persistence. + /// + [TestFixture] + [Category("WotCon")] + [Parallelizable(ParallelScope.All)] + public sealed class FileWotRegistryStoreExtendedTests + { + private static string MakeRoot() + { + string root = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "wot-store-ext-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(root); + return root; + } + + private static void SafeDelete(string root) + { + try + { + if (Directory.Exists(root)) + { + Directory.Delete(root, recursive: true); + } + } + catch (IOException) + { + } + } + + [Test] + public async Task LoadReturnsEmptyWhenManifestFileDoesNotExist() + { + string root = MakeRoot(); + try + { + var store = new FileWotRegistryStore(root); + WotRegistrySnapshot snapshot = await store.LoadAsync(); + + Assert.That(snapshot.AllResources(), Is.Empty); + Assert.That(snapshot.Groups, Is.Empty); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public void LoadRejectsInvalidManifestWithoutChangingIt() + { + string root = MakeRoot(); + try + { + string manifestPath = Path.Combine(root, "manifest.json"); + const string invalidManifest = "{ not valid json }"; + File.WriteAllText(manifestPath, invalidManifest); + var store = new FileWotRegistryStore(root); + + InvalidDataException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + + Assert.That(error.Message, Does.Contain("corrupt")); + Assert.That(File.ReadAllText(manifestPath), Is.EqualTo(invalidManifest)); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task CommitAndLoadEmptySnapshotRoundTrips() + { + string root = MakeRoot(); + try + { + var store = new FileWotRegistryStore(root); + WotRegistrySnapshot initial = await store.LoadAsync(); + await store.CommitAsync( + new WotRegistrySnapshot( + initial.Generation + 1, + initial.Groups, + initial.Labels)); + WotRegistrySnapshot loaded = await store.LoadAsync(); + + Assert.That(loaded.Groups, Is.Empty); + Assert.That(loaded.Generation, Is.EqualTo(1)); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task LabelsArePersisted() + { + string root = MakeRoot(); + try + { + var store = new FileWotRegistryStore(root); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.AddRegistryLabelAsync("env", "production", expectedEpoch: 0); + } + + var reloadStore = new FileWotRegistryStore(root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + Assert.That(reloaded.Current.Labels.ContainsKey("env"), Is.True); + Assert.That(reloaded.Current.Labels["env"], Is.EqualTo("production")); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task CommitTwiceReplacesManifestAtomically() + { + string root = MakeRoot(); + try + { + var store = new FileWotRegistryStore(root); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "td-v1", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:td", "v1") + }); + + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "td-v1", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:td", "v2") + }); + + var reloadStore = new FileWotRegistryStore(root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + WotResource? td = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "td-v1"); + Assert.That(td, Is.Not.Null); + Assert.That(td!.Versions, Has.Length.EqualTo(2)); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task DeletedResourceIsNotReloadedAfterCommit() + { + string root = MakeRoot(); + try + { + var store = new FileWotRegistryStore(root); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "to-delete", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:del") + }); + await service.DeleteResourceAsync( + WotRegistryGroups.ThingDescriptions, "to-delete"); + } + + var reloadStore = new FileWotRegistryStore(root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + WotResource? td = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "to-delete"); + Assert.That(td, Is.Null, + "A deleted resource must not be present after reload."); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task ResourceLabelsArePersisted() + { + string root = MakeRoot(); + try + { + var store = new FileWotRegistryStore(root); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "labeled", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:labeled") + }); + await service.AddResourceLabelAsync( + WotRegistryGroups.ThingDescriptions, "labeled", "color", "red"); + } + + var reloadStore = new FileWotRegistryStore(root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + WotResource? resource = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "labeled"); + Assert.That(resource, Is.Not.Null); + Assert.That(resource!.Labels.ContainsKey("color"), Is.True); + Assert.That(resource.Labels["color"], Is.EqualTo("red")); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task BlobsDirectoryIsCreatedOnFirstCommit() + { + string root = MakeRoot(); + string blobsDir = Path.Combine(root, "blobs"); + try + { + var store = new FileWotRegistryStore(root); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "first", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:first") + }); + + Assert.That(Directory.Exists(blobsDir), Is.True, + "Blobs directory must be created on first commit with content."); + Assert.That(Directory.GetFiles(blobsDir, "*.bin"), Has.Length.EqualTo(1), + "One blob file per unique content digest."); + } + finally + { + SafeDelete(root); + } + } + + [Test] + public async Task RepeatedSameContentSharesOneBlobFile() + { + string root = MakeRoot(); + string blobsDir = Path.Combine(root, "blobs"); + try + { + var store = new FileWotRegistryStore(root); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + byte[] content = TestMaterialization.Td("urn:shared"); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = content + }); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingModels, + ResourceId = "b", + Kind = WoTDocumentKindEnum.ThingModel, + Content = content + }); + + Assert.That(Directory.GetFiles(blobsDir, "*.bin"), Has.Length.EqualTo(1), + "Identical content must be deduplicated to a single blob file."); + } + finally + { + SafeDelete(root); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/FileWotRegistryStoreTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/FileWotRegistryStoreTests.cs new file mode 100644 index 0000000000..83a39fd801 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/FileWotRegistryStoreTests.cs @@ -0,0 +1,1772 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry.Server; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Exercises strict fail-closed loading, serialized durable commits, stale + /// generation rejection, and round-trip persistence. + /// + [TestFixture] + public sealed class FileWotRegistryStoreTests + { + private string m_root = null!; + + [SetUp] + public void SetUp() + { + m_root = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "wot-store-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(m_root); + } + + [TearDown] + public void TearDown() + { + try + { + if (Directory.Exists(m_root)) + { + Directory.Delete(m_root, recursive: true); + } + } + catch (IOException) + { + } + } + + [Test] + public async Task PersistAndReloadRoundTripsResource() + { + var store = new FileWotRegistryStore(m_root); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingModels, + ResourceId = "m", + Kind = WoTDocumentKindEnum.ThingModel, + Content = TestMaterialization.Tm("urn:m") + }); + } + + var reloadStore = new FileWotRegistryStore(m_root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + WotResource? td = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a"); + Assert.That(td, Is.Not.Null); + Assert.That(td!.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + Assert.That(td.Versions, Has.Length.EqualTo(1)); + Assert.That( + Encoding.UTF8.GetString(td.Versions[0].Content.ToArray()), + Does.Contain("urn:a")); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingModels, "m"), Is.Not.Null); + } + + [Test] + public async Task AnInjectedResourceStoreHoldsTheDocumentBytesInsteadOfTheRegistryFolder() + { + string storeRoot = Path.Combine(m_root, "external"); + using var resourceStore = new WotBlobResourceStore(storeRoot); + + var store = new FileWotRegistryStore(m_root, resourceStore); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + } + + string registryBlobs = Path.Combine(m_root, "blobs"); + string[] inRegistry = Directory.Exists(registryBlobs) + ? Directory.GetFiles(registryBlobs, "*.bin") + : []; + string[] inStore = Directory.GetFiles(storeRoot, "*.bin"); + + var reloadStore = new FileWotRegistryStore(m_root, resourceStore); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + WotResource? td = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a"); + + Assert.Multiple(() => + { + Assert.That(inStore, Is.Not.Empty, + "The injected store must hold the document bytes, which is what lets a " + + "distributed deployment put them somewhere every node can reach."); + Assert.That(inRegistry, Is.Empty, + "The registry folder must no longer hold blobs once a store is injected."); + Assert.That(td, Is.Not.Null); + Assert.That( + Encoding.UTF8.GetString(td!.Versions[0].Content.ToArray()), + Does.Contain("urn:a"), + "A reload must read the document back out of the injected store."); + }); + } + + [Test] + public async Task InjectedStoreDoesNotRewriteExistingMatchingBlobDuringMetadataCommit() + { + var resourceStore = new CorruptingResourceStore(); + var store = new FileWotRegistryStore(m_root, resourceStore); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + Assert.That(resourceStore.WriteCount, Is.EqualTo(1)); + + resourceStore.FailOnWrite = true; + await service.AddRegistryLabelAsync("environment", "test"); + } + + var reloadStore = new FileWotRegistryStore(m_root, resourceStore); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + Assert.That(resourceStore.WriteCount, Is.EqualTo(1)); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + } + + [Test] + public void AnInjectedResourceStoreIsRequiredWhenTheOverloadIsUsed() + { + Assert.That( + () => new FileWotRegistryStore(m_root, resourceStore: null!), + Throws.ArgumentNullException); + } + + [Test] + public async Task InvalidDocumentSurvivesReloadWithFailureState() + { + var store = new FileWotRegistryStore(m_root); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "bad", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.InvalidJson() + }); + } + + var reloadStore = new FileWotRegistryStore(m_root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + WotResource bad = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "bad")!; + Assert.That(bad.LoadState, Is.EqualTo(WoTLoadStateEnum.Failed)); + Assert.That(bad.Validation, Is.Not.Null); + Assert.That(bad.Validation!.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public async Task UpsertOverwritesResourceAtomically() + { + var store = new FileWotRegistryStore(m_root); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a", "v1") + }); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a", "v2") + }); + + var reloadStore = new FileWotRegistryStore(m_root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a")!.Versions, + Has.Length.EqualTo(2)); + } + + [Test] + public async Task PristineAbsentPrimaryManifestLoadsEmptyRegistry() + { + WotRegistrySnapshot loaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + + Assert.That(loaded, Is.SameAs(WotRegistrySnapshot.Empty)); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.That(Directory.Exists(BlobsPath), Is.False); + } + + [Test] + public async Task AbsentPrimaryWithPriorStateFailsClosedWithoutDataLoss() + { + WotRegistryMutationResult persisted = + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] backup = File.ReadAllBytes(BackupPath); + byte[] blob = File.ReadAllBytes(BlobPath(persisted)); + File.Delete(ManifestPath); + var store = new FileWotRegistryStore(m_root); + + InvalidDataException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + + Assert.That(error.Message, Does.Contain("recovery artifacts")); + Assert.That(error.Message, Does.Contain("cannot be treated as empty")); + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(backup)); + Assert.That(File.ReadAllBytes(BlobPath(persisted)), Is.EqualTo(blob)); + Assert.That(File.Exists(ManifestPath), Is.False); + } + + [TestCase("manifest.json.tmp-test", false)] + [TestCase("manifest.json.replace-backup-test", false)] + [TestCase("manifest.json.rollback-test", false)] + [TestCase("blobs", true)] + public void AbsentPrimaryWithPendingArtifactFailsClosed( + string artifactName, + bool directory) + { + string artifactPath = Path.Combine(m_root, artifactName); + if (directory) + { + Directory.CreateDirectory(artifactPath); + } + else + { + File.WriteAllText(artifactPath, "operator recovery evidence"); + } + + InvalidDataException error = Assert.ThrowsAsync( + async () => await new FileWotRegistryStore(m_root).LoadAsync()); + + Assert.That(error.Message, Does.Contain(artifactName)); + Assert.That( + directory ? Directory.Exists(artifactPath) : File.Exists(artifactPath), + Is.True); + } + + [Test] + public async Task CorruptPrimaryFailsClosedAndCannotCommitEmptyView() + { + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + File.WriteAllText(ManifestPath, "{ corrupt"); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + InvalidDataException loadError = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + InvalidOperationException commitError = + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + + Assert.That(loadError.Message, Does.Contain("primary manifest")); + Assert.That(loadError.Message, Does.Contain("corrupt")); + Assert.That(commitError.Message, Does.Contain("LoadAsync")); + AssertDataFilesEqual(expected); + } + + [Test] + public async Task UnsupportedSchemaFailsClosedWithoutUsingValidBackup() + { + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + File.WriteAllBytes( + ManifestPath, + WithSchemaVersion(File.ReadAllBytes(ManifestPath), schemaVersion: 1)); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + NotSupportedException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + + Assert.That(error.Message, Does.Contain("schema 1")); + AssertDataFilesEqual(expected); + } + + [Test] + public async Task SuccessfulCommitLeavesOperatorBackupUntouched() + { + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] backup = File.ReadAllBytes(BackupPath); + + await PersistResourceAsync("b", "urn:b"); + + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(backup)); + Assert.That(ReplaceBackupPaths, Is.Empty); + WotRegistrySnapshot reloaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Not.Null); + } + + [Test] + public async Task DeleteRetainsBlobReferencedByOperatorBackup() + { + WotRegistryMutationResult persisted = + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] backup = File.ReadAllBytes(BackupPath); + byte[] blob = File.ReadAllBytes(BlobPath(persisted)); + using var service = new WotRegistryService( + new FileWotRegistryStore(m_root)); + await service.InitializeAsync(); + + await service.DeleteResourceAsync( + WotRegistryGroups.ThingDescriptions, "a"); + + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(backup)); + Assert.That(File.ReadAllBytes(BlobPath(persisted)), Is.EqualTo(blob)); + WotRegistrySnapshot reloaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Null); + } + + [Test] + public async Task TransientPrimaryReadFailureDoesNotUseOrOverwriteBackup() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Assert.Ignore("FileShare.None is enforced by Windows for this test."); + } + + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + using (new FileStream( + ManifestPath, + FileMode.Open, + FileAccess.ReadWrite, + FileShare.None)) + { + IOException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.That(error.Message, Does.Contain("primary manifest")); + Assert.That(error.Message, Does.Contain("left unchanged")); + } + + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + AssertDataFilesEqual(expected); + } + + [Test] + public async Task MissingReferencedBlobFailsClosedWithoutChangingOtherBlobs() + { + WotRegistryMutationResult first = + await PersistResourceAsync("a", "urn:a"); + WotRegistryMutationResult second = + await PersistResourceAsync("b", "urn:b"); + CreateBackup(); + File.Delete(BlobPath(second)); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + InvalidDataException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + + Assert.That(error.Message, Does.Contain("missing")); + Assert.That(File.Exists(BlobPath(first)), Is.True); + AssertDataFilesEqual(expected); + } + + [Test] + public async Task LockedReferencedBlobFailsClosedWithoutChangingFiles() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Assert.Ignore("FileShare.None is enforced by Windows for this test."); + } + + WotRegistryMutationResult persisted = + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + using (new FileStream( + BlobPath(persisted), + FileMode.Open, + FileAccess.ReadWrite, + FileShare.None)) + { + IOException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.That(error.Message, Does.Contain("blob")); + Assert.That(error.Message, Does.Contain("left unchanged")); + } + + AssertDataFilesEqual(expected); + } + + [Test] + public async Task TamperedReferencedBlobFailsClosedWithoutChangingOtherBlobs() + { + WotRegistryMutationResult first = + await PersistResourceAsync("a", "urn:a"); + WotRegistryMutationResult second = + await PersistResourceAsync("b", "urn:b"); + CreateBackup(); + File.WriteAllText(BlobPath(second), "tampered"); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + InvalidDataException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + + Assert.That(error.Message, Does.Contain("SHA-256")); + Assert.That(File.Exists(BlobPath(first)), Is.True); + AssertDataFilesEqual(expected); + } + + [Test] + public Task DuplicateGroupIdsFailClosedWithoutChangingFiles() + { + return AssertDuplicateManifestRejected( + manifest => + { + FileWotRegistryStore.GroupDto group = manifest.Groups![0]; + manifest.Groups = [group, group]; + }, + "group id"); + } + + [Test] + public Task DuplicateResourceIdsFailClosedWithoutChangingFiles() + { + return AssertDuplicateManifestRejected( + manifest => + { + FileWotRegistryStore.GroupDto group = manifest.Groups![0]; + FileWotRegistryStore.ResourceDto resource = group.Resources![0]; + group.Resources = [resource, resource]; + }, + "resource id"); + } + + [Test] + public Task DuplicateVersionIdsFailClosedWithoutChangingFiles() + { + return AssertDuplicateManifestRejected( + manifest => + { + FileWotRegistryStore.ResourceDto resource = + manifest.Groups![0].Resources![0]; + FileWotRegistryStore.VersionDto version = resource.Versions![0]; + resource.Versions = [version, version]; + }, + "version id"); + } + + [Test] + public Task CrossGroupResourceSpoofThatDuplicatesNodeIdFailsClosed() + { + return AssertInvalidManifestRejected( + manifest => + { + FileWotRegistryStore.GroupDto first = manifest.Groups![0]; + FileWotRegistryStore.GroupDto spoofed = CloneGroup(first); + spoofed.GroupId = "spoofed-container"; + manifest.Groups = [first, spoofed]; + }, + "does not belong", + "spoofed-container"); + } + + [Test] + public Task GroupAndResourcePathIdentityCollisionFailsSegmentSafety() + { + return AssertInvalidManifestRejected( + manifest => + { + FileWotRegistryStore.GroupDto first = manifest.Groups![0]; + FileWotRegistryStore.GroupDto second = CloneGroup(first); + first.GroupId = "a"; + first.Resources![0].GroupId = "a"; + first.Resources[0].ResourceId = "b"; + second.GroupId = "a/resources/b"; + second.Resources = null; + manifest.Groups = [first, second]; + }, + "not segment-safe"); + } + + [Test] + public Task CrossGroupResourcePathIdentityCollisionFailsSegmentSafety() + { + return AssertInvalidManifestRejected( + manifest => + { + FileWotRegistryStore.GroupDto first = manifest.Groups![0]; + FileWotRegistryStore.GroupDto second = CloneGroup(first); + first.GroupId = "a"; + first.Resources![0].GroupId = "a"; + first.Resources[0].ResourceId = "b/resources/c"; + second.GroupId = "a/resources/b"; + second.Resources![0].GroupId = "a/resources/b"; + second.Resources[0].ResourceId = "c"; + manifest.Groups = [first, second]; + }, + "not segment-safe"); + } + + [Test] + public Task PublicSnapshotGroupOwnershipMismatchFailsBeforeDiskMutation() + { + return AssertMalformedSnapshotCommitRejected( + snapshot => + { + WotResourceGroup group = + snapshot.FindGroup(WotRegistryGroups.ThingDescriptions)!; + WotResource resource = group.Resources.Values.Single(); + WotResource spoofed = CloneResource( + resource, + groupId: "spoofed-container"); + WotResourceGroup malformed = group.WithResources( + group.Resources.SetItem(resource.ResourceId, spoofed), + group.Epoch); + return snapshot.WithGroup(malformed, snapshot.Generation); + }, + "does not belong", + WotRegistryGroups.ThingDescriptions); + } + + [Test] + public Task PublicSnapshotDuplicateVersionIdsFailBeforeDiskMutation() + { + return AssertMalformedSnapshotCommitRejected( + snapshot => + { + WotResourceGroup group = + snapshot.FindGroup(WotRegistryGroups.ThingDescriptions)!; + WotResource resource = group.Resources.Values.Single(); + WotResourceVersion version = resource.Versions[0]; + WotResource malformed = CloneResource( + resource, + versions: ImmutableArray.Create(version, version)); + return snapshot.WithGroup( + group.WithResources( + group.Resources.SetItem(resource.ResourceId, malformed), + group.Epoch), + snapshot.Generation); + }, + "duplicate", + "version id"); + } + + [Test] + public Task PublicSnapshotDigestMismatchFailsBeforeDiskMutation() + { + return AssertMalformedSnapshotCommitRejected( + snapshot => + { + WotResourceGroup group = + snapshot.FindGroup(WotRegistryGroups.ThingDescriptions)!; + WotResource resource = group.Resources.Values.Single(); + WotResourceVersion version = resource.Versions[0]; + var tampered = new WotResourceVersion( + version.VersionId, + version.Content, + version.ContentType, + version.Format, + version.CreatedAt, + version.ModifiedAt, + new byte[32]); + WotResource malformed = CloneResource( + resource, + versions: ImmutableArray.Create(tampered)); + return snapshot.WithGroup( + group.WithResources( + group.Resources.SetItem(resource.ResourceId, malformed), + group.Epoch), + snapshot.Generation); + }, + "content hashes"); + } + + [Test] + public Task PublicSnapshotUnsafeGroupIdentityFailsBeforeDiskMutation() + { + return AssertMalformedSnapshotCommitRejected( + snapshot => + { + WotResourceGroup group = + snapshot.FindGroup(WotRegistryGroups.ThingDescriptions)!; + WotResource resource = group.Resources.Values.Single(); + const string collidingGroupId = "a/resources/b"; + WotResource moved = CloneResource( + resource, + groupId: collidingGroupId); + var malformedGroup = new WotResourceGroup( + collidingGroupId, + group.Kind, + ImmutableDictionary.Empty.Add( + moved.ResourceId, + moved), + epoch: group.Epoch); + return new WotRegistrySnapshot( + snapshot.Generation, + ImmutableDictionary.Empty.Add( + collidingGroupId, + malformedGroup), + snapshot.Labels); + }, + "group id", + "not segment-safe"); + } + + [Test] + public Task PublicSnapshotUnsafeResourceIdFailsBeforeDiskMutation() + { + return AssertMalformedSnapshotCommitRejected( + snapshot => + { + WotResourceGroup group = + snapshot.FindGroup(WotRegistryGroups.ThingDescriptions)!; + WotResource resource = group.Resources.Values.Single(); + WotResource malformed = CloneResource( + resource, + resourceId: "b/resources/c"); + return snapshot.WithGroup( + group.WithResources( + ImmutableDictionary.Empty.Add( + malformed.ResourceId, + malformed), + group.Epoch), + snapshot.Generation); + }, + "resource id", + "not segment-safe"); + } + + [Test] + public Task PublicSnapshotUnsafeVersionIdFailsBeforeDiskMutation() + { + return AssertMalformedSnapshotCommitRejected( + snapshot => + { + WotResourceGroup group = + snapshot.FindGroup(WotRegistryGroups.ThingDescriptions)!; + WotResource resource = group.Resources.Values.Single(); + WotResourceVersion version = resource.Versions[0]; + var unsafeVersion = new WotResourceVersion( + "version/path", + version.Content, + version.ContentType, + version.Format, + version.CreatedAt, + version.ModifiedAt, + version.Digest); + WotResource malformed = CloneResource( + resource, + versions: ImmutableArray.Create(unsafeVersion)); + return snapshot.WithGroup( + group.WithResources( + group.Resources.SetItem(resource.ResourceId, malformed), + group.Epoch), + snapshot.Generation); + }, + "version id", + "not segment-safe"); + } + + [Test] + public async Task ConcurrentStoresSerializeAndRejectStaleCommitWithoutBlobDeletion() + { + WotRegistryMutationResult baseline = + await PersistResourceAsync("base", "urn:base"); + using var firstEnteredSync = new ManualResetEventSlim(); + using var releaseFirst = new ManualResetEventSlim(); + var firstStore = new FileWotRegistryStore( + m_root, + phase => + { + if (phase == FileWotRegistryStore.DirectorySyncPhase.BlobsBeforeManifest) + { + firstEnteredSync.Set(); + if (!releaseFirst.Wait(TimeSpan.FromSeconds(10))) + { + throw new TimeoutException("Timed out waiting to release commit."); + } + } + }); + var secondStore = new FileWotRegistryStore(m_root); + using var firstService = new WotRegistryService(firstStore); + using var secondService = new WotRegistryService(secondStore); + await firstService.InitializeAsync(); + await secondService.InitializeAsync(); + + Task firstCommit = Task.Run( + async () => await firstService.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + Assert.That(firstEnteredSync.Wait(TimeSpan.FromSeconds(10)), Is.True); + Task staleCommit = Task.Run( + async () => await secondService.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + await Task.Delay(150); + Assert.That(staleCommit.IsCompleted, Is.False); + + releaseFirst.Set(); + WotRegistryMutationResult committed = await firstCommit; + InvalidOperationException staleError = + Assert.ThrowsAsync( + async () => await staleCommit); + + Assert.That(staleError.Message, Does.Contain("changed after this store loaded")); + Assert.That(File.Exists(BlobPath(baseline)), Is.True); + Assert.That(File.Exists(BlobPath(committed)), Is.True); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(2)); + WotRegistrySnapshot reloaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null); + } + + [Test] + public async Task StaleAbsentStoreRejectsRecoveryArtifactAbaWithoutMutation() + { + var staleStore = new FileWotRegistryStore(m_root); + using var staleService = new WotRegistryService(staleStore); + await staleService.InitializeAsync(); + + string? replaceBackupPath = null; + var writerStore = new FileWotRegistryStore( + m_root, + directorySyncFailureInjector: null, + (source, destination, backup) => + { + replaceBackupPath = backup; + File.Move(destination, backup); + throw new IOException( + "Injected replacement failure after moving destination to backup."); + }); + using var writerService = new WotRegistryService(writerStore); + await writerService.InitializeAsync(); + await writerService.UpsertResourceAsync(TdRequest("a", "urn:a")); + byte[] committedPrimary = File.ReadAllBytes(ManifestPath); + + Assert.ThrowsAsync( + async () => await writerService.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.That(replaceBackupPath, Is.Not.Null); + Assert.That( + File.ReadAllBytes(replaceBackupPath!), + Is.EqualTo(committedPrimary)); + Assert.That(ManifestContainsResource(replaceBackupPath!, "a"), Is.True); + Assert.That(TemporaryManifestPaths, Has.Length.EqualTo(1)); + Dictionary indeterminateFiles = CaptureDataFiles(); + + WotRegistryCommitIndeterminateException staleError = + Assert.ThrowsAsync( + async () => await staleService.UpsertResourceAsync( + TdRequest("c", "urn:c"))); + + Assert.That( + staleError.PersistenceFailure.Message, + Does.Contain("commit was not attempted")); + Assert.That( + staleError.ValidationFailure.Message, + Does.Contain("recovery artifacts")); + Assert.That(staleService.Current, Is.SameAs(WotRegistrySnapshot.Empty)); + AssertDataFilesEqual(indeterminateFiles); + + InvalidOperationException blocked = + Assert.ThrowsAsync( + async () => await staleService.UpsertResourceAsync( + TdRequest("d", "urn:d"))); + Assert.That(blocked.Message, Does.Contain("InitializeAsync")); + Assert.ThrowsAsync( + async () => await staleStore.LoadAsync()); + AssertDataFilesEqual(indeterminateFiles); + } + + [Test] + public async Task SameStoreRejectsSecondSnapshotWithAlreadyCommittedGeneration() + { + await PersistResourceAsync("a", "urn:a"); + var store = new FileWotRegistryStore(m_root); + WotRegistrySnapshot loaded = await store.LoadAsync(); + long nextGeneration = loaded.Generation + 1; + var first = new WotRegistrySnapshot( + nextGeneration, loaded.Groups, loaded.Labels); + var stale = new WotRegistrySnapshot( + nextGeneration, WotRegistrySnapshot.Empty.Groups, loaded.Labels); + + await store.CommitAsync(first); + byte[] committedManifest = File.ReadAllBytes(ManifestPath); + InvalidOperationException error = + Assert.ThrowsAsync( + async () => await store.CommitAsync(stale)); + Assert.That(error.Message, Does.Contain("strictly greater")); + Assert.That(File.ReadAllBytes(ManifestPath), Is.EqualTo(committedManifest)); + WotRegistrySnapshot reloaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + } + + [Test] + public async Task SameGenerationManifestRewriteRejectsStaleCommit() + { + WotRegistryMutationResult baseline = + await PersistResourceAsync("a", "urn:a"); + var store = new FileWotRegistryStore(m_root); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + File.AppendAllText(ManifestPath, Environment.NewLine); + byte[] rewrittenManifest = File.ReadAllBytes(ManifestPath); + + InvalidOperationException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.Message, Does.Contain("manifest SHA-256")); + Assert.That(File.ReadAllBytes(ManifestPath), Is.EqualTo(rewrittenManifest)); + Assert.That(File.Exists(BlobPath(baseline)), Is.True); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(1)); + } + + [Test] + public async Task ExclusiveOpenStorageLockRetriesContentionUntilCancellation() + { + string lockPath = Path.Combine(m_root, ".wot-registry.lock"); + using var externalLock = new FileStream( + lockPath, + FileMode.OpenOrCreate, + FileAccess.ReadWrite, + FileShare.None); + using var cancellation = new CancellationTokenSource( + TimeSpan.FromMilliseconds(250)); + + Assert.CatchAsync( + async () => await new FileWotRegistryStore(m_root) + .LoadAsync(cancellation.Token)); + } + + [Test] + public async Task MultiLevelDirectoryCreationSyncsEveryModifiedParentInOrder() + { + string nestedRoot = Path.Combine(m_root, "one", "two", "registry"); + var phases = new List(); + var store = new FileWotRegistryStore(nestedRoot, phases.Add); + using var service = new WotRegistryService(store); + + await service.InitializeAsync(); + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + + Assert.That( + phases, + Is.EqualTo(new[] + { + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent, + FileWotRegistryStore.DirectorySyncPhase.BlobsBeforeManifest, + FileWotRegistryStore.DirectorySyncPhase.RootBeforeManifest, + FileWotRegistryStore.DirectorySyncPhase.RootAfterManifestStaging, + FileWotRegistryStore.DirectorySyncPhase.RootAfterManifest + })); + } + + [Test] + public async Task MultiLevelPartialRootSyncFailureResyncsEveryComponentOnRetry() + { + string first = Path.Combine(m_root, "one"); + string second = Path.Combine(first, "two"); + string nestedRoot = Path.Combine(second, "registry"); + bool injectFailure = true; + int syncAttempts = 0; + var store = new FileWotRegistryStore( + nestedRoot, + phase => + { + if (phase == + FileWotRegistryStore.DirectorySyncPhase.RootComponentParent) + { + syncAttempts++; + if (injectFailure && syncAttempts == 3) + { + throw new IOException( + "Injected root parent directory sync failure."); + } + } + }); + + Assert.ThrowsAsync( + async () => await store.LoadAsync()); + Assert.That(Directory.Exists(first), Is.True); + Assert.That(Directory.Exists(second), Is.True); + Assert.That(Directory.Exists(nestedRoot), Is.False); + Assert.That( + File.Exists(Path.Combine(nestedRoot, ".wot-registry.lock")), + Is.False); + + injectFailure = false; + WotRegistrySnapshot loaded = await store.LoadAsync(); + + Assert.That(loaded, Is.SameAs(WotRegistrySnapshot.Empty)); + Assert.That(syncAttempts, Is.EqualTo(7)); + Assert.That( + File.Exists(Path.Combine(nestedRoot, ".wot-registry.lock")), + Is.True); + } + + [Test] + public async Task PristineCancellationBeforeManifestRollsBackAndRetrySucceeds() + { + bool injectFailure = true; + using var cancellation = new CancellationTokenSource(); + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (injectFailure && + phase == FileWotRegistryStore.DirectorySyncPhase.BlobsBeforeManifest) + { + injectFailure = false; + cancellation.Cancel(); + cancellation.Token.ThrowIfCancellationRequested(); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + OperationCanceledException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"), + cancellation.Token)); + + Assert.That(error.CancellationToken, Is.EqualTo(cancellation.Token)); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.That(Directory.Exists(BlobsPath), Is.False); + Assert.That(TemporaryManifestPaths, Is.Empty); + Assert.That(RollbackMarkerPaths, Is.Empty); + + WotRegistryMutationResult retry = await service.UpsertResourceAsync( + TdRequest("a", "urn:a")); + + Assert.That(retry.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(File.Exists(ManifestPath), Is.True); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(1)); + } + + [Test] + public async Task PristineManifestStagingFailureRollsBackAndRetrySucceeds() + { + bool injectFailure = true; + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (injectFailure && + phase == + FileWotRegistryStore.DirectorySyncPhase.RootAfterManifestStaging) + { + injectFailure = false; + throw new IOException( + "Injected manifest staging directory sync failure."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + IOException error = Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + + Assert.That(error.Message, Does.Contain("manifest staging")); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.That(Directory.Exists(BlobsPath), Is.False); + Assert.That(TemporaryManifestPaths, Is.Empty); + Assert.That(RollbackMarkerPaths, Is.Empty); + + WotRegistryMutationResult retry = await service.UpsertResourceAsync( + TdRequest("a", "urn:a")); + + Assert.That(retry.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(File.Exists(ManifestPath), Is.True); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(1)); + } + + [Test] + public async Task AmbiguousPristineArtifactsRemainFailClosed() + { + string unknownArtifact = Path.Combine(BlobsPath, "unknown.bin"); + bool injectFailure = true; + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (injectFailure && + phase == FileWotRegistryStore.DirectorySyncPhase.RootBeforeManifest) + { + injectFailure = false; + File.WriteAllText(unknownArtifact, "ambiguous external artifact"); + throw new IOException( + "Injected pre-switch failure with an ambiguous artifact."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + WotRegistryCommitIndeterminateException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + Dictionary retained = CaptureDataFiles(); + + Assert.That(error.PersistenceFailure.Message, Does.Contain("ambiguous artifact")); + Assert.That(error.ValidationFailure.Message, Does.Contain("rollback")); + Assert.That(error.ValidationFailure.Message, Does.Contain("Unknown")); + Assert.That(File.Exists(unknownArtifact), Is.True); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.That(Directory.GetFiles(BlobsPath), Has.Length.EqualTo(2)); + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + Assert.ThrowsAsync( + async () => await new FileWotRegistryStore(m_root).LoadAsync()); + AssertDataFilesEqual(retained); + } + + [Test] + public async Task FailedPristineRollbackRetainsMarkerAndFailsClosed() + { + bool injectCommitFailure = true; + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (injectCommitFailure && + phase == FileWotRegistryStore.DirectorySyncPhase.RootBeforeManifest) + { + injectCommitFailure = false; + throw new IOException("Injected pre-switch failure."); + } + if (phase == + FileWotRegistryStore.DirectorySyncPhase.BlobsAfterPristineRollback) + { + throw new IOException("Injected rollback directory sync failure."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + WotRegistryCommitIndeterminateException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + Dictionary retained = CaptureDataFiles(); + + Assert.That(error.PersistenceFailure.Message, Does.Contain("pre-switch")); + Assert.That(error.ValidationFailure.Message, Does.Contain("rollback")); + Assert.That(RollbackMarkerPaths, Has.Length.EqualTo(1)); + Assert.That(Directory.Exists(BlobsPath), Is.True); + Assert.That(Directory.GetFileSystemEntries(BlobsPath), Is.Empty); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.ThrowsAsync( + async () => await new FileWotRegistryStore(m_root).LoadAsync()); + AssertDataFilesEqual(retained); + } + + [Test] + public Task BlobDirectorySyncFailureLeavesPrimaryGenerationReadable() + { + return AssertPreManifestDirectorySyncFailure( + FileWotRegistryStore.DirectorySyncPhase.BlobsBeforeManifest); + } + + [Test] + public Task RootBeforeManifestSyncFailureLeavesPrimaryGenerationReadable() + { + return AssertPreManifestDirectorySyncFailure( + FileWotRegistryStore.DirectorySyncPhase.RootBeforeManifest); + } + + private async Task AssertPreManifestDirectorySyncFailure( + FileWotRegistryStore.DirectorySyncPhase phaseToFail) + { + WotRegistryMutationResult baseline = + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] primary = File.ReadAllBytes(ManifestPath); + byte[] backup = File.ReadAllBytes(BackupPath); + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (phase == phaseToFail) + { + throw new IOException( + $"Injected {phaseToFail} directory sync failure."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + long previousGeneration = service.Current.Generation; + + IOException error = Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.Message, Does.Contain("Injected")); + Assert.That( + error, + Is.Not.InstanceOf()); + Assert.That(service.Current.Generation, Is.EqualTo(previousGeneration)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null); + Assert.That(File.ReadAllBytes(ManifestPath), Is.EqualTo(primary)); + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(backup)); + Assert.That(File.Exists(BlobPath(baseline)), Is.True); + WotRegistrySnapshot reloaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null); + } + + [Test] + public async Task ReplaceFailureBeforeMovesIsNotCommittedAndPreservesStagedManifest() + { + WotRegistryMutationResult baseline = + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] primary = File.ReadAllBytes(ManifestPath); + byte[] operatorBackup = File.ReadAllBytes(BackupPath); + bool injectFailure = true; + string? replaceBackupPath = null; + var store = new FileWotRegistryStore( + m_root, + directorySyncFailureInjector: null, + (source, destination, backup) => + { + replaceBackupPath = backup; + if (injectFailure) + { + injectFailure = false; + throw new IOException("Injected replacement failure before any move."); + } + File.Replace(source, destination, backup); + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + WotRegistrySnapshot before = service.Current; + + WotRegistryCommitNotCommittedException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.PersistenceFailure.Message, Does.Contain("before any move")); + Assert.That(service.Current, Is.SameAs(before)); + Assert.That(File.ReadAllBytes(ManifestPath), Is.EqualTo(primary)); + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(operatorBackup)); + Assert.That(error.RecoveryArtifactPath, Is.Not.Null); + Assert.That(File.Exists(error.RecoveryArtifactPath), Is.True); + Assert.That(ManifestContainsResource(error.RecoveryArtifactPath!, "b"), Is.True); + Assert.That(replaceBackupPath, Is.Not.Null); + Assert.That(File.Exists(replaceBackupPath), Is.False); + Assert.That(ReplaceBackupPaths, Is.Empty); + Assert.That(File.Exists(BlobPath(baseline)), Is.True); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(2)); + + WotRegistryMutationResult retry = await service.UpsertResourceAsync( + TdRequest("b", "urn:b")); + + Assert.That(retry.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(File.Exists(error.RecoveryArtifactPath), Is.True); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Not.Null); + } + + [Test] + public async Task ReplaceReportsFailureAfterSuccessfulMoveAsCommittedUncertain() + { + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] primary = File.ReadAllBytes(ManifestPath); + byte[] operatorBackup = File.ReadAllBytes(BackupPath); + bool injectFailure = true; + string? replaceBackupPath = null; + var store = new FileWotRegistryStore( + m_root, + directorySyncFailureInjector: null, + (source, destination, backup) => + { + replaceBackupPath = backup; + File.Replace(source, destination, backup); + if (injectFailure) + { + injectFailure = false; + throw new IOException( + "Injected replacement failure after destination move."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + WotRegistryCommitDurabilityUncertainException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.PersistenceFailure.Message, Does.Contain("destination move")); + Assert.That(service.Current, Is.SameAs(error.CommittedSnapshot)); + Assert.That(ManifestContainsResource(ManifestPath, "b"), Is.True); + Assert.That(replaceBackupPath, Is.Not.Null); + Assert.That(File.ReadAllBytes(replaceBackupPath!), Is.EqualTo(primary)); + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(operatorBackup)); + Assert.That(TemporaryManifestPaths, Is.Empty); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(2)); + + WotRegistryMutationResult next = await service.UpsertResourceAsync( + TdRequest("c", "urn:c")); + Assert.That(next.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + } + + [Test] + public async Task DestinationMovedToBackupFailureIsIndeterminateWithoutDataLoss() + { + WotRegistryMutationResult baseline = + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] primary = File.ReadAllBytes(ManifestPath); + byte[] operatorBackup = File.ReadAllBytes(BackupPath); + bool injectFailure = true; + string? replaceBackupPath = null; + var store = new FileWotRegistryStore( + m_root, + directorySyncFailureInjector: null, + (source, destination, backup) => + { + replaceBackupPath = backup; + if (injectFailure) + { + injectFailure = false; + File.Move(destination, backup); + throw new IOException( + "Injected replacement failure after moving destination to backup."); + } + File.Replace(source, destination, backup); + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + WotRegistrySnapshot before = service.Current; + + WotRegistryCommitIndeterminateException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.PersistenceFailure.Message, Does.Contain("moving destination")); + Assert.That(error.ValidationFailure.Message, Does.Contain("primary manifest")); + Assert.That(error.ValidationFailure.Message, Does.Contain("staged manifest")); + Assert.That(error.ValidationFailure.Message, Does.Contain("replace backup manifest")); + Assert.That(service.Current, Is.SameAs(before)); + Assert.That(File.Exists(ManifestPath), Is.False); + Assert.That(replaceBackupPath, Is.Not.Null); + Assert.That(File.ReadAllBytes(replaceBackupPath!), Is.EqualTo(primary)); + Assert.That(File.ReadAllBytes(BackupPath), Is.EqualTo(operatorBackup)); + Assert.That(TemporaryManifestPaths, Has.Length.EqualTo(1)); + Assert.That(ManifestContainsResource(TemporaryManifestPaths[0], "b"), Is.True); + Assert.That(File.Exists(BlobPath(baseline)), Is.True); + Assert.That(Directory.GetFiles(BlobsPath, "*.bin"), Has.Length.EqualTo(2)); + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("c", "urn:c"))); + + using (var restarted = new WotRegistryService( + new FileWotRegistryStore(m_root))) + { + InvalidDataException restartError = + Assert.ThrowsAsync( + async () => await restarted.InitializeAsync()); + Assert.That(restartError.Message, Does.Contain("recovery artifacts")); + InvalidOperationException restartBlocked = + Assert.ThrowsAsync( + async () => await restarted.UpsertResourceAsync( + TdRequest("c", "urn:c"))); + Assert.That(restartBlocked.Message, Does.Contain("InitializeAsync")); + } + + File.Move(replaceBackupPath!, ManifestPath); + await service.InitializeAsync(); + WotRegistryMutationResult recovered = await service.UpsertResourceAsync( + TdRequest("c", "urn:c")); + Assert.That(recovered.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null); + } + + [Test] + public async Task FinalRootSyncFailurePublishesValidatedCommittedSnapshot() + { + await PersistResourceAsync("a", "urn:a"); + bool injectFailure = true; + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (injectFailure && + phase == FileWotRegistryStore.DirectorySyncPhase.RootAfterManifest) + { + injectFailure = false; + throw new IOException("Injected root directory sync failure."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + WotRegistryCommitDurabilityUncertainException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.PersistenceFailure.Message, Does.Contain("Injected")); + Assert.That(service.Current, Is.SameAs(error.CommittedSnapshot)); + Assert.That(service.Current.Generation, Is.EqualTo(error.CommittedGeneration)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Not.Null); + + WotRegistryMutationResult next = await service.UpsertResourceAsync( + TdRequest("c", "urn:c")); + Assert.That(next.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + WotRegistrySnapshot reloaded = + await new FileWotRegistryStore(m_root).LoadAsync(); + Assert.That(reloaded.Generation, Is.EqualTo(service.Current.Generation)); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Not.Null); + Assert.That( + reloaded.FindResource(WotRegistryGroups.ThingDescriptions, "c"), + Is.Not.Null); + } + + [Test] + public async Task UnvalidatedPostSwitchFailureBlocksMutationUntilReload() + { + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + byte[] recoveryManifest = File.ReadAllBytes(BackupPath); + bool injectFailure = true; + var store = new FileWotRegistryStore( + m_root, + phase => + { + if (injectFailure && + phase == FileWotRegistryStore.DirectorySyncPhase.RootAfterManifest) + { + File.WriteAllText(ManifestPath, "{ corrupt"); + throw new IOException("Injected root directory sync failure."); + } + }); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + WotRegistrySnapshot before = service.Current; + + WotRegistryCommitIndeterminateException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + Assert.That(error.IntendedGeneration, Is.EqualTo(before.Generation + 1)); + Assert.That(service.Current, Is.SameAs(before)); + InvalidOperationException blocked = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("c", "urn:c"))); + Assert.That(blocked.Message, Does.Contain("InitializeAsync")); + + injectFailure = false; + File.WriteAllBytes(ManifestPath, recoveryManifest); + await service.InitializeAsync(); + WotRegistryMutationResult recovered = await service.UpsertResourceAsync( + TdRequest("c", "urn:c")); + + Assert.That(recovered.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "c"), + Is.Not.Null); + } + + private async Task PersistResourceAsync( + string resourceId, + string thingId) + { + using var service = new WotRegistryService( + new FileWotRegistryStore(m_root)); + await service.InitializeAsync(); + return await service.UpsertResourceAsync( + TdRequest(resourceId, thingId)); + } + + private async Task AssertDuplicateManifestRejected( + Action duplicate, + string logicalId) + { + await AssertInvalidManifestRejected( + duplicate, + "duplicate", + logicalId); + } + + private async Task AssertInvalidManifestRejected( + Action invalidate, + params string[] diagnostics) + { + await PersistResourceAsync("a", "urn:a"); + CreateBackup(); + FileWotRegistryStore.ManifestDto manifest = JsonSerializer.Deserialize( + File.ReadAllBytes(ManifestPath), + WotRegistryStoreJson.Default.ManifestDto) ?? + throw new InvalidDataException("The test manifest was null."); + invalidate(manifest); + File.WriteAllBytes( + ManifestPath, + JsonSerializer.SerializeToUtf8Bytes( + manifest, WotRegistryStoreJson.Default.ManifestDto)); + Dictionary expected = CaptureDataFiles(); + var store = new FileWotRegistryStore(m_root); + + InvalidDataException error = Assert.ThrowsAsync( + async () => await store.LoadAsync()); + foreach (string diagnostic in diagnostics) + { + Assert.That(error.Message, Does.Contain(diagnostic)); + } + Assert.ThrowsAsync( + async () => await store.CommitAsync(WotRegistrySnapshot.Empty)); + AssertDataFilesEqual(expected); + } + + private async Task AssertMalformedSnapshotCommitRejected( + Func invalidate, + params string[] diagnostics) + { + WotRegistrySnapshot valid = await CreateInMemorySnapshotAsync(); + WotRegistrySnapshot malformed = invalidate(valid); + Assert.That(Directory.GetFileSystemEntries(m_root), Is.Empty); + var store = new FileWotRegistryStore(m_root); + + InvalidDataException error = Assert.ThrowsAsync( + async () => await store.CommitAsync(malformed)); + + foreach (string diagnostic in diagnostics) + { + Assert.That(error.Message, Does.Contain(diagnostic)); + } + Assert.That( + Directory.GetFileSystemEntries(m_root), + Is.Empty, + "Malformed snapshots must fail before creating lock, blobs, or manifests."); + } + + private static async Task CreateInMemorySnapshotAsync() + { + using var service = new WotRegistryService(new InMemoryWotRegistryStore()); + await service.InitializeAsync(); + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + return service.Current; + } + + private static WotResource CloneResource( + WotResource resource, + string? groupId = null, + string? resourceId = null, + ImmutableArray? versions = null) + { + return new WotResource( + groupId ?? resource.GroupId, + resourceId ?? resource.ResourceId, + resource.Kind, + versions ?? resource.Versions, + resource.DefaultVersionId, + resource.DesiredVersionId, + resource.ActiveVersionId, + resource.Enabled, + resource.LoadState, + resource.Validation, + resource.Diagnostics, + resource.Epoch, + resource.RefreshGeneration, + resource.LastRefreshTime, + resource.MaterializedNodeCount, + resource.RootNodeId, + resource.Name, + resource.Description, + resource.ThingId, + resource.Title, + resource.Labels); + } + + private static FileWotRegistryStore.GroupDto CloneGroup( + FileWotRegistryStore.GroupDto group) + { + return JsonSerializer.Deserialize( + JsonSerializer.SerializeToUtf8Bytes( + group, + WotRegistryStoreJson.Default.GroupDto), + WotRegistryStoreJson.Default.GroupDto) ?? + throw new InvalidDataException("The cloned test group was null."); + } + + private void CreateBackup() + { + File.Copy(ManifestPath, BackupPath, overwrite: true); + } + + private Dictionary CaptureDataFiles() + { + return Directory.GetFiles(m_root, "*", SearchOption.AllDirectories) + .Where(path => !string.Equals( + Path.GetFileName(path), + ".wot-registry.lock", + StringComparison.Ordinal)) + .ToDictionary( + RelativePath, + File.ReadAllBytes, + StringComparer.Ordinal); + } + + private void AssertDataFilesEqual(Dictionary expected) + { + Dictionary actual = CaptureDataFiles(); + Assert.That(actual.Keys, Is.EquivalentTo(expected.Keys)); + foreach (KeyValuePair item in expected) + { + Assert.That( + actual[item.Key], + Is.EqualTo(item.Value), + $"File changed: {item.Key}"); + } + } + + private string RelativePath(string path) + { + return path.Substring(m_root.Length).TrimStart( + Path.DirectorySeparatorChar, + Path.AltDirectorySeparatorChar); + } + + private string BlobPath(WotRegistryMutationResult result) + { + return Path.Combine( + BlobsPath, + result.Resource!.DefaultVersion!.DigestHex + ".bin"); + } + + private static bool ManifestContainsResource(string path, string resourceId) + { + FileWotRegistryStore.ManifestDto manifest = JsonSerializer.Deserialize( + File.ReadAllBytes(path), + WotRegistryStoreJson.Default.ManifestDto) ?? + throw new InvalidDataException("The test manifest was null."); + return manifest.Groups? + .SelectMany(group => group.Resources ?? []) + .Any(resource => string.Equals( + resource.ResourceId, + resourceId, + StringComparison.Ordinal)) == true; + } + + private string ManifestPath => Path.Combine(m_root, "manifest.json"); + + private string BackupPath => Path.Combine(m_root, "manifest.json.bak"); + + private string[] ReplaceBackupPaths => + Directory.GetFiles(m_root, "manifest.json.replace-backup-*"); + + private string[] TemporaryManifestPaths => + Directory.GetFiles(m_root, "manifest.json.tmp-*"); + + private string[] RollbackMarkerPaths => + Directory.GetFiles(m_root, "manifest.json.rollback-*"); + + private string BlobsPath => Path.Combine(m_root, "blobs"); + + private static byte[] WithSchemaVersion(byte[] manifest, int schemaVersion) + { + string json = Encoding.UTF8.GetString(manifest); + const string current = "\"SchemaVersion\": 2"; + Assert.That(json, Does.Contain(current)); + int index = json.IndexOf(current, StringComparison.Ordinal); + return Encoding.UTF8.GetBytes( + json.Remove(index, current.Length) + .Insert(index, $"\"SchemaVersion\": {schemaVersion}")); + } + + private static WotUpsertResourceRequest TdRequest( + string resourceId, + string thingId) + { + return new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td(thingId) + }; + } + + private sealed class CorruptingResourceStore : IXRegistryResourceStore + { + public int WriteCount { get; private set; } + + public bool FailOnWrite { get; set; } + + public ValueTask ReadAsync( + string resourceKey, + long offset, + int count, + CancellationToken ct = default) + { + if (!m_blobs.TryGetValue(resourceKey, out byte[]? content)) + { + return new ValueTask(default(ByteString)); + } + if (offset >= content.Length) + { + return new ValueTask(ByteString.From([])); + } + int take = (int)Math.Min(count, content.Length - offset); + return new ValueTask( + ByteString.From(content.AsSpan((int)offset, take).ToArray())); + } + + public ValueTask WriteAsync( + string resourceKey, + long offset, + ByteString data, + CancellationToken ct = default) + { + WriteCount++; + if (FailOnWrite) + { + m_blobs[resourceKey] = [0]; + throw new IOException("Injected partial write."); + } + m_blobs[resourceKey] = data.Span.ToArray(); + return default; + } + + public ValueTask GetLengthAsync( + string resourceKey, + CancellationToken ct = default) + { + return new ValueTask( + m_blobs.TryGetValue(resourceKey, out byte[]? content) ? content.Length : -1); + } + + public ValueTask DeleteAsync( + string resourceKey, + CancellationToken ct = default) + { + return new ValueTask(m_blobs.Remove(resourceKey)); + } + + private readonly Dictionary m_blobs = new(StringComparer.Ordinal); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotBlobResourceStoreTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotBlobResourceStoreTests.cs new file mode 100644 index 0000000000..b883c60b88 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotBlobResourceStoreTests.cs @@ -0,0 +1,229 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.IO; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.XRegistry.Server; +using Opc.Ua.XRegistry.Tests; + +namespace Opc.Ua.XRegistry +{ + /// + /// Runs the shared contract against the WoT registry's + /// content-addressed blob store, so it stays substitutable for any other implementation. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotBlobResourceStoreContractTests : XRegistryResourceStoreContractTests + { + /// + protected override IXRegistryResourceStore CreateStore() + { + m_fileSystem ??= new VirtualFileSystem(); + return new WotBlobResourceStore("blobs", m_fileSystem); + } + + [TearDown] + public void TearDown() + { + m_fileSystem?.Dispose(); + m_fileSystem = null; + } + + private VirtualFileSystem? m_fileSystem; + } + + /// + /// Behaviour specific to the WoT blob store: the on-disk layout must stay byte-compatible with + /// what FileWotRegistryStore has always written, so an existing registry folder keeps + /// working when the byte layer moves behind the injectable xRegistry interface. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotBlobResourceStoreLayoutTests + { + [Test] + public async Task ADigestKeyIsStoredAsTheHistoricalBlobFileNameAsync() + { + using var fileSystem = new VirtualFileSystem(); + using var store = new WotBlobResourceStore("blobs", fileSystem); + const string digest = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"; + + await store.WriteAsync(digest, 0, ByteString.From([1, 2, 3])).ConfigureAwait(false); + + Assert.That(fileSystem.Exists(Path.Combine("blobs", digest + ".bin")), Is.True, + "The historical blobs/{digest}.bin layout must be preserved so that moving the " + + "byte layer behind IXRegistryResourceStore needs no on-disk migration."); + } + + [Test] + public async Task AKeyThatIsNotFileNameSafeIsEncodedAndStillRoundTripsAsync() + { + using var fileSystem = new VirtualFileSystem(); + using var store = new WotBlobResourceStore("blobs", fileSystem); + + await store.WriteAsync("a/b", 0, ByteString.From([7])).ConfigureAwait(false); + ByteString read = await store.ReadAsync("a/b", 0, 16).ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(read.Span.ToArray(), Is.EqualTo(new byte[] { 7 })); + Assert.That(fileSystem.Exists(Path.Combine("blobs", "a", "b.bin")), Is.False, + "A key containing a separator must not escape into a sub-directory."); + }); + } + + [Test] + public async Task AnEncodedKeyCannotCollideWithAVerbatimKeyAsync() + { + using var fileSystem = new VirtualFileSystem(); + using var store = new WotBlobResourceStore("blobs", fileSystem); + + // "a/b" encodes to the hex of its UTF-8 bytes; the verbatim key below is that same + // hex text, so without the encoded-form prefix the two would share a file. + await store.WriteAsync("a/b", 0, ByteString.From([1])).ConfigureAwait(false); + await store.WriteAsync("612f62", 0, ByteString.From([2])).ConfigureAwait(false); + + ByteString encoded = await store.ReadAsync("a/b", 0, 16).ConfigureAwait(false); + ByteString verbatim = await store.ReadAsync("612f62", 0, 16).ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(encoded.Span.ToArray(), Is.EqualTo(new byte[] { 1 })); + Assert.That(verbatim.Span.ToArray(), Is.EqualTo(new byte[] { 2 })); + }); + } + + [Test] + public void WriteWithoutAtomicReplaceCapabilityFailsClearly() + { + using var fileSystem = new VirtualFileSystem(); + using var store = new WotBlobResourceStore("blobs", new NonAtomicFileSystem(fileSystem)); + + IOException ex = Assert.ThrowsAsync( + async () => await store.WriteAsync("blob", 0, ByteString.From([1, 2, 3])) + .ConfigureAwait(false))!; + + Assert.Multiple(() => + { + Assert.That( + ex.Message, + Does.Contain("requires a file system that supports atomic file replacement")); + Assert.That(fileSystem.Exists(Path.Combine("blobs", "blob.bin")), Is.False); + }); + } + + [Test] + public async Task WriteUsesAtomicReplaceCapabilityAsync() + { + using var fileSystem = new VirtualFileSystem(); + var atomic = new CountingAtomicFileSystem(fileSystem); + using var store = new WotBlobResourceStore("blobs", atomic); + + await store.WriteAsync("blob", 0, ByteString.From([4, 5, 6])).ConfigureAwait(false); + ByteString read = await store.ReadAsync("blob", 0, 16).ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(atomic.ReplaceCount, Is.EqualTo(1)); + Assert.That(read.Span.ToArray(), Is.EqualTo(new byte[] { 4, 5, 6 })); + Assert.That(LocalFileSystem.Instance, Is.AssignableTo()); + Assert.That(fileSystem, Is.AssignableTo()); + }); + } + + private sealed class NonAtomicFileSystem : IFileSystem + { + public NonAtomicFileSystem(IFileSystem inner) + { + m_inner = inner; + } + + public bool Exists(string path, bool isDirectory = false) + => m_inner.Exists(path, isDirectory); + + public void Delete(string path, bool isDirectory = false) + => m_inner.Delete(path, isDirectory); + + public Stream OpenRead(string path) + => m_inner.OpenRead(path); + + public Stream OpenWrite(string path) + => m_inner.OpenWrite(path); + + public System.DateTime GetLastWriteTime(string path) + => m_inner.GetLastWriteTime(path); + + public long GetLength(string path) + => m_inner.GetLength(path); + + private readonly IFileSystem m_inner; + } + + private sealed class CountingAtomicFileSystem : IFileSystem, IAtomicFileReplace + { + public CountingAtomicFileSystem(IFileSystem inner) + { + m_inner = inner; + m_atomic = (IAtomicFileReplace)inner; + } + + public int ReplaceCount { get; private set; } + + public bool Exists(string path, bool isDirectory = false) + => m_inner.Exists(path, isDirectory); + + public void Delete(string path, bool isDirectory = false) + => m_inner.Delete(path, isDirectory); + + public Stream OpenRead(string path) + => m_inner.OpenRead(path); + + public Stream OpenWrite(string path) + => m_inner.OpenWrite(path); + + public System.DateTime GetLastWriteTime(string path) + => m_inner.GetLastWriteTime(path); + + public long GetLength(string path) + => m_inner.GetLength(path); + + public void Replace(string sourcePath, string destinationPath) + { + ReplaceCount++; + m_atomic.Replace(sourcePath, destinationPath); + } + + private readonly IFileSystem m_inner; + private readonly IAtomicFileReplace m_atomic; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryLabelsServiceTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryLabelsServiceTests.cs new file mode 100644 index 0000000000..6e18819b27 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryLabelsServiceTests.cs @@ -0,0 +1,321 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.IO; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Exercises the xRegistry label (attribute) service API on the registry, + /// group and resource entities: add/update/remove, epoch optimistic + /// concurrency, key validation (reserved names, invalid/control/BIDI/path + /// characters, length), the per-entity label count bound, deterministic + /// ordinal ordering, and file-store persistence across a reload. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotRegistryLabelsServiceTests + { + private static readonly string[] s_alphaZebraLabels = ["alpha", "zebra"]; + private static readonly string[] s_zebraLabel = ["zebra"]; + + [Test] + public async Task AddResourceLabelAddsThenUpdatesValue() + { + using var service = new WotRegistryService(); + await service.TryCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + + WotRegistryMutationResult added = await service.AddResourceLabelAsync( + "sensors", "a", "site", "seattle"); + Assert.That(added.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + WotResource? resource = service.Current.FindResource("sensors", "a"); + Assert.That(resource!.Labels["site"], Is.EqualTo("seattle")); + + WotRegistryMutationResult updated = await service.AddResourceLabelAsync( + "sensors", "a", "site", "portland"); + Assert.That(updated.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + resource = service.Current.FindResource("sensors", "a"); + Assert.That(resource!.Labels, Has.Count.EqualTo(1), + "Re-adding the same key must update in place, not duplicate."); + Assert.That(resource.Labels["site"], Is.EqualTo("portland")); + } + + [Test] + public async Task RemoveResourceLabelRemovesKey() + { + using var service = new WotRegistryService(); + await service.TryCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + await service.AddResourceLabelAsync("sensors", "a", "site", "seattle"); + + WotRegistryMutationResult removed = await service.RemoveResourceLabelAsync( + "sensors", "a", "site"); + + Assert.That(removed.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + WotResource? resource = service.Current.FindResource("sensors", "a"); + Assert.That(resource!.Labels.ContainsKey("site"), Is.False); + } + + [Test] + public async Task RemoveResourceLabelUnknownKeyFails() + { + using var service = new WotRegistryService(); + await service.TryCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + + WotRegistryMutationResult removed = await service.RemoveResourceLabelAsync( + "sensors", "a", "missing"); + + Assert.That(removed.Outcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public async Task AddResourceLabelEpochMismatchRejected() + { + using var service = new WotRegistryService(); + (WotResource resource, _) = await service.GetOrCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + + WotRegistryMutationResult result = await service.AddResourceLabelAsync( + "sensors", "a", "site", "seattle", expectedEpoch: resource.Epoch + 999); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That( + service.Current.FindResource("sensors", "a")!.Labels.ContainsKey("site"), + Is.False); + } + + [Test] + public async Task AddResourceLabelCorrectEpochSucceeds() + { + using var service = new WotRegistryService(); + (WotResource resource, _) = await service.GetOrCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + + WotRegistryMutationResult result = await service.AddResourceLabelAsync( + "sensors", "a", "site", "seattle", expectedEpoch: resource.Epoch); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + } + + [Test] + public void AddResourceLabelMissingKeyThrows() + { + using var service = new WotRegistryService(); + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.AddResourceLabelAsync("sensors", "a", string.Empty, "x")); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [TestCase("Add\u0007Attribute")] // control character + [TestCase("a/b")] // path separator + [TestCase("a\u202Eb")] // BIDI override + [TestCase("AddAttribute")] // reserved container member + [TestCase("RemoveAttribute")] // reserved container member + public void AddResourceLabelInvalidOrReservedKeyThrows(string key) + { + using var service = new WotRegistryService(); + Assert.ThrowsAsync( + async () => await service.AddResourceLabelAsync("sensors", "a", key, "x")); + } + + [Test] + public void AddResourceLabelKeyTooLongThrows() + { + using var service = new WotRegistryService(); + string longKey = new('k', service.Bounds.MaxLabelKeyLength + 1); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.AddResourceLabelAsync("sensors", "a", longKey, "x")); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void AddResourceLabelValueTooLongThrows() + { + using var service = new WotRegistryService(); + string longValue = new('v', service.Bounds.MaxLabelValueLength + 1); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.AddResourceLabelAsync("sensors", "a", "k", longValue)); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task AddResourceLabelExceedsMaxLabelsPerEntityThrows() + { + var bounds = new WotRegistryPersistenceBounds { MaxLabelsPerEntity = 2 }; + using var service = new WotRegistryService(bounds: bounds); + await service.TryCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + await service.AddResourceLabelAsync("sensors", "a", "k1", "v1"); + await service.AddResourceLabelAsync("sensors", "a", "k2", "v2"); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.AddResourceLabelAsync("sensors", "a", "k3", "v3")); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + + // Updating an existing key must still be allowed at the limit. + WotRegistryMutationResult update = await service.AddResourceLabelAsync( + "sensors", "a", "k1", "v1-updated"); + Assert.That(update.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + } + + [Test] + public async Task GroupLabelsAddUpdateRemoveEpochAndOrdering() + { + using var service = new WotRegistryService(); + WotResourceGroup group = await service.GetOrCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + + await service.AddGroupLabelAsync("sensors", "zebra", "1"); + await service.AddGroupLabelAsync("sensors", "alpha", "2"); + WotResourceGroup? updatedGroup = service.Current.FindGroup("sensors"); + Assert.That(updatedGroup!.Labels.Keys, Is.EqualTo(s_alphaZebraLabels), + "Labels must enumerate in deterministic ordinal key order."); + + WotRegistryMutationResult mismatched = await service.RemoveGroupLabelAsync( + "sensors", "alpha", expectedEpoch: group.Epoch + 1); + Assert.That(mismatched.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + + WotRegistryMutationResult removed = await service.RemoveGroupLabelAsync( + "sensors", "alpha"); + Assert.That(removed.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That( + service.Current.FindGroup("sensors")!.Labels.Keys, + Is.EqualTo(s_zebraLabel)); + } + + [Test] + public void AddGroupLabelUnknownGroupFails() + { + using var service = new WotRegistryService(); + WotRegistryMutationResult result = service.AddGroupLabelAsync( + "missing", "k", "v").AsTask().GetAwaiter().GetResult(); + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public async Task RegistryLabelsAddUpdateRemoveUsesSnapshotGenerationAsEpoch() + { + using var service = new WotRegistryService(); + long generationBefore = service.Current.Generation; + + WotRegistryMutationResult added = await service.AddRegistryLabelAsync( + "environment", "production", expectedEpoch: generationBefore); + Assert.That(added.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.Labels["environment"], Is.EqualTo("production")); + + WotRegistryMutationResult mismatched = await service.AddRegistryLabelAsync( + "environment", "staging", expectedEpoch: generationBefore); + Assert.That(mismatched.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected), + "The registry epoch is the snapshot generation, which already advanced."); + + WotRegistryMutationResult removed = await service.RemoveRegistryLabelAsync("environment"); + Assert.That(removed.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.Labels.ContainsKey("environment"), Is.False); + } + + [Test] + public async Task LabelMutationsAreProjectionOnlyAndDoNotChangeResourceContent() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + WotRegistryChangedEventArgs? captured = null; + service.Changed += (_, e) => captured = e; + + await service.AddResourceLabelAsync( + WotRegistryGroups.ThingDescriptions, "a", "site", "seattle"); + + Assert.That(captured, Is.Not.Null); + Assert.That(captured!.ProjectionOnly, Is.True, + "Label-only mutations must not re-trigger materialization."); + } + + [Test] + public async Task FileStorePersistsLabelsAcrossReload() + { + string root = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "wot-labels-store-" + System.Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(root); + try + { + var store = new FileWotRegistryStore(root); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + await service.AddResourceLabelAsync( + WotRegistryGroups.ThingDescriptions, "a", "site", "seattle"); + await service.AddGroupLabelAsync( + WotRegistryGroups.ThingDescriptions, "owner", "team-iot"); + await service.AddRegistryLabelAsync("environment", "production"); + } + + var reloadStore = new FileWotRegistryStore(root); + using var reloaded = new WotRegistryService(reloadStore); + await reloaded.InitializeAsync(); + + Assert.That(reloaded.Current.Labels["environment"], Is.EqualTo("production")); + Assert.That( + reloaded.Current.FindGroup(WotRegistryGroups.ThingDescriptions)! + .Labels["owner"], + Is.EqualTo("team-iot")); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a")! + .Labels["site"], + Is.EqualTo("seattle")); + } + finally + { + if (Directory.Exists(root)) + { + Directory.Delete(root, recursive: true); + } + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryModelTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryModelTests.cs new file mode 100644 index 0000000000..c68344fb5f --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryModelTests.cs @@ -0,0 +1,219 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Immutable; +using System.Text; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Exercises the , , + /// and value objects from WotRegistryModel.cs. + /// + [TestFixture] + [Category("WotCon")] + [Parallelizable(ParallelScope.All)] + public sealed class WotRegistryModelTests + { + [Test] + public void ComputeReturnsSha256DigestOfContent() + { + byte[] content = Encoding.UTF8.GetBytes("hello"); + byte[] digest = WotContentDigest.Compute(content); + + Assert.That(digest, Has.Length.EqualTo(32), + "SHA-256 always produces 32 bytes."); + Assert.That(digest, Is.Not.All.EqualTo((byte)0)); + } + + [Test] + public void ComputeProducesDifferentDigestsForDifferentContent() + { + byte[] digest1 = WotContentDigest.Compute(Encoding.UTF8.GetBytes("aaa")); + byte[] digest2 = WotContentDigest.Compute(Encoding.UTF8.GetBytes("bbb")); + + Assert.That(digest1, Is.Not.EqualTo(digest2)); + } + + [Test] + public void ComputeProducesSameDigestForSameContent() + { + byte[] content = Encoding.UTF8.GetBytes("deterministic"); + byte[] d1 = WotContentDigest.Compute(content); + byte[] d2 = WotContentDigest.Compute(content); + + Assert.That(d1, Is.EqualTo(d2)); + } + + [Test] + public void ToHexWithNullReturnsEmptyString() + { + string result = WotContentDigest.ToHex(null); + Assert.That(result, Is.EqualTo(string.Empty)); + } + + [Test] + public void ToHexWithEmptyArrayReturnsEmptyString() + { + string result = WotContentDigest.ToHex(Array.Empty()); + Assert.That(result, Is.EqualTo(string.Empty)); + } + + [Test] + public void ToHexProducesLowercaseHexString() + { + byte[] digest = new byte[] { 0xAB, 0xCD, 0xEF, 0x01 }; + string hex = WotContentDigest.ToHex(digest); + + Assert.That(hex, Is.EqualTo("abcdef01")); + } + + [Test] + public void ToHexRoundTripsAllNibbleValues() + { + var bytes = new byte[16]; + for (int i = 0; i < 16; i++) + { + bytes[i] = (byte)((i << 4) | i); + } + string hex = WotContentDigest.ToHex(bytes); + + Assert.That(hex, Has.Length.EqualTo(32)); + Assert.That(hex, Does.Match("^[0-9a-f]+$")); + } + + [Test] + public void EqualReturnsTrueForSameReference() + { + byte[] digest = new byte[] { 1, 2, 3 }; + Assert.That(WotContentDigest.Equal(digest, digest), Is.True); + } + + [Test] + public void EqualReturnsFalseWhenLeftIsNull() + { + Assert.That(WotContentDigest.Equal(null, new byte[] { 1 }), Is.False); + } + + [Test] + public void EqualReturnsFalseWhenRightIsNull() + { + Assert.That(WotContentDigest.Equal(new byte[] { 1 }, null), Is.False); + } + + [Test] + public void EqualReturnsTrueForEqualContent() + { + byte[] left = new byte[] { 10, 20, 30 }; + byte[] right = new byte[] { 10, 20, 30 }; + + Assert.That(WotContentDigest.Equal(left, right), Is.True); + } + + [Test] + public void EqualReturnsFalseForDifferentContent() + { + byte[] left = new byte[] { 10, 20, 30 }; + byte[] right = new byte[] { 10, 20, 31 }; + + Assert.That(WotContentDigest.Equal(left, right), Is.False); + } + + [Test] + public void WotResourceVersionConstructorSetsAllProperties() + { + byte[] content = Encoding.UTF8.GetBytes("{\"title\":\"test\"}"); + var now = DateTime.UtcNow; + var version = new WotResourceVersion( + versionId: "v1", + content: content, + contentType: "application/td+json", + format: "WoT-TD/1.1", + createdAt: now, + modifiedAt: now); + + Assert.That(version.VersionId, Is.EqualTo("v1")); + Assert.That(version.Content.ToArray(), Is.EqualTo(content)); + Assert.That(version.ContentType, Is.EqualTo("application/td+json")); + Assert.That(version.Format, Is.EqualTo("WoT-TD/1.1")); + Assert.That(version.CreatedAt, Is.EqualTo(now)); + Assert.That(version.ModifiedAt, Is.EqualTo(now)); + Assert.That(version.Digest, Is.Not.Null); + Assert.That(version.Digest, Has.Length.EqualTo(32)); + } + + [Test] + public void WotResourceVersionWithExplicitDigestUsesSuppliedDigest() + { + byte[] content = Encoding.UTF8.GetBytes("doc"); + byte[] digest = new byte[32]; + digest[0] = 42; + var version = new WotResourceVersion( + versionId: "v1", content: content, contentType: "ct", + format: "f", createdAt: default, modifiedAt: default, digest: digest); + + Assert.That(version.Digest[0], Is.EqualTo(42)); + } + + [Test] + public void WotResourceVersionDigestHexIsHexString() + { + byte[] content = Encoding.UTF8.GetBytes("doc"); + var version = new WotResourceVersion( + versionId: "v1", content: content, contentType: "ct", + format: "f", createdAt: default, modifiedAt: default); + + Assert.That(version.DigestHex, Has.Length.EqualTo(64)); + Assert.That(version.DigestHex, Does.Match("^[0-9a-f]+$")); + } + + [Test] + public void WotLabelsEmptyIsAnEmptyImmutableSortedDictionary() + { + Assert.That(WotLabels.Empty, Is.Empty); + Assert.That(WotLabels.Empty, Is.Not.Null); + } + + [Test] + public void WotLabelsEmptyHasOrdinalOrdering() + { + var labels = WotLabels.Empty + .Add("beta", "2") + .Add("alpha", "1"); + + string[] keys = [.. labels.Keys]; + Assert.That(keys[0], Is.EqualTo("alpha"), + "Labels must enumerate in ordinal key order."); + Assert.That(keys[1], Is.EqualTo("beta")); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceCrudTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceCrudTests.cs new file mode 100644 index 0000000000..c56bd01481 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceCrudTests.cs @@ -0,0 +1,172 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Exercises the xRegistry CRUD additions used by the OPC UA management + /// Methods: group create/delete, resource placeholder create-or-get and + /// document validation. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotRegistryServiceCrudTests + { + [Test] + public async Task TryCreateGroupCreatesThenFailsOnDuplicate() + { + using var service = new WotRegistryService(); + + WotResourceGroup? first = await service.TryCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + WotResourceGroup? second = await service.TryCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + + Assert.That(first, Is.Not.Null); + Assert.That(first!.GroupId, Is.EqualTo("sensors")); + Assert.That(second, Is.Null, "A second CreateGroup with the same id must fail."); + } + + [Test] + public async Task DeleteGroupRemovesGroupAndResources() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = "sensors", + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + + WotRegistryMutationResult result = await service.DeleteGroupAsync("sensors"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.FindGroup("sensors"), Is.Null); + Assert.That(service.Current.FindResource("sensors", "a"), Is.Null); + } + + [Test] + public async Task DeleteGroupWithWrongEpochRejected() + { + using var service = new WotRegistryService(); + WotResourceGroup group = await service.GetOrCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + + WotRegistryMutationResult result = await service.DeleteGroupAsync( + "sensors", expectedEpoch: group.Epoch + 999); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That(service.Current.FindGroup("sensors"), Is.Not.Null); + } + + [Test] + public async Task GetOrCreateResourceCreatesPlaceholderThenReturnsExisting() + { + using var service = new WotRegistryService(); + + (WotResource created, bool createdFlag) = await service.GetOrCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + (WotResource fetched, bool fetchedFlag) = await service.GetOrCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + + Assert.That(createdFlag, Is.True); + Assert.That(fetchedFlag, Is.False); + Assert.That(created.Versions, Is.Empty, "A placeholder resource carries no versions."); + Assert.That(created.DefaultVersion, Is.Null); + Assert.That(fetched.ResourceId, Is.EqualTo("a")); + } + + [Test] + public async Task TryCreateResourceFailsWhenResourceExists() + { + using var service = new WotRegistryService(); + await service.TryCreateResourceAsync("sensors", "a", WoTDocumentKindEnum.ThingDescription); + + WotResource? duplicate = await service.TryCreateResourceAsync( + "sensors", "a", WoTDocumentKindEnum.ThingDescription); + + Assert.That(duplicate, Is.Null); + } + + [Test] + public async Task ValidateValidDocumentReportsSuccess() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = "sensors", + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + + WoTValidationOutcomeDataType outcome = await service.ValidateResourceAsync("sensors", "a"); + + Assert.That(outcome.FormatValidated, Is.True); + Assert.That(outcome.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Success)); + WotResource? resource = service.Current.FindResource("sensors", "a"); + Assert.That(resource!.Validation, Is.Not.Null); + Assert.That(resource.Validation!.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Success)); + } + + [Test] + public async Task ValidateInvalidDocumentReportsFailure() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = "sensors", + ResourceId = "bad", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.InvalidJson() + }); + + WoTValidationOutcomeDataType outcome = await service.ValidateResourceAsync("sensors", "bad"); + + Assert.That(outcome.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public void ValidateNoDefaultVersionThrows() + { + using var service = new WotRegistryService(); + _ = service.TryCreateResourceAsync( + "sensors", "empty", WoTDocumentKindEnum.ThingDescription).AsTask().GetAwaiter().GetResult(); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.ValidateResourceAsync("sensors", "empty")); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceExtendedTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceExtendedTests.cs new file mode 100644 index 0000000000..60c8551cba --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceExtendedTests.cs @@ -0,0 +1,382 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Additional coverage for : the + /// GetOrCreateGroupAsync overload, registry-level label operations, + /// the NormalizeSegment/Slugify helpers (exercised through the + /// public surface), and the MutateGroupAsync internal path via the + /// group-label API. + /// + [TestFixture] + [Category("WotCon")] + public sealed class WotRegistryServiceExtendedTests + { + [Test] + public async Task GetOrCreateGroupAsyncCreatesNewGroup() + { + using var service = new WotRegistryService(); + + WotResourceGroup group = await service.GetOrCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + + Assert.That(group, Is.Not.Null); + Assert.That(group.GroupId, Is.EqualTo("sensors")); + Assert.That(group.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + Assert.That(service.Current.FindGroup("sensors"), Is.Not.Null); + } + + [Test] + public async Task GetOrCreateGroupAsyncReturnsExistingGroup() + { + using var service = new WotRegistryService(); + WotResourceGroup first = await service.GetOrCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + long generation = service.Current.Generation; + + WotResourceGroup second = await service.GetOrCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription); + + Assert.That(second.GroupId, Is.EqualTo(first.GroupId)); + Assert.That(service.Current.Generation, Is.EqualTo(generation), + "Finding an existing group must not advance the registry generation."); + } + + [Test] + public async Task GetOrCreateGroupAsyncWithNameSetsDisplayName() + { + using var service = new WotRegistryService(); + + WotResourceGroup group = await service.GetOrCreateGroupAsync( + "sensors", WoTDocumentKindEnum.ThingDescription, name: "Sensor Devices"); + + Assert.That(group.Name, Is.EqualTo("Sensor Devices")); + } + + [Test] + public async Task GetOrCreateGroupAsyncExceedingMaxGroupsThrows() + { + var bounds = new WotRegistryPersistenceBounds { MaxGroups = 1 }; + using var service = new WotRegistryService(bounds: bounds); + await service.GetOrCreateGroupAsync("first", WoTDocumentKindEnum.ThingDescription); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.GetOrCreateGroupAsync( + "second", WoTDocumentKindEnum.ThingDescription)); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + Assert.That(service.Current.FindGroup("second"), Is.Null); + } + + [Test] + public async Task GetOrCreateGroupAsyncRaisesChangedForNewGroup() + { + using var service = new WotRegistryService(); + WotRegistryChangedEventArgs? captured = null; + service.Changed += (_, e) => captured = e; + + await service.GetOrCreateGroupAsync("sensors", WoTDocumentKindEnum.ThingDescription); + + Assert.That(captured, Is.Not.Null); + Assert.That(captured!.ProjectionOnly, Is.False); + } + + [Test] + public void GetOrCreateGroupAsyncWithEmptyGroupIdThrows() + { + using var service = new WotRegistryService(); + + Assert.ThrowsAsync( + async () => await service.GetOrCreateGroupAsync( + string.Empty, WoTDocumentKindEnum.ThingDescription)); + } + + [Test] + public void GetOrCreateGroupAsyncWithWhitespaceOnlyGroupIdThrows() + { + using var service = new WotRegistryService(); + + Assert.ThrowsAsync( + async () => await service.GetOrCreateGroupAsync( + " ", WoTDocumentKindEnum.ThingDescription)); + } + + [Test] + public async Task GetOrCreateGroupAsyncSlugifiesUppercase() + { + using var service = new WotRegistryService(); + + WotResourceGroup group = await service.GetOrCreateGroupAsync( + "MySensors", WoTDocumentKindEnum.ThingDescription); + + Assert.That(group.GroupId, Is.EqualTo("mysensors").Or.EqualTo("my-sensors"), + "Uppercase must be lowercased by the Slugify helper."); + } + + [Test] + public async Task GetOrCreateGroupAsyncSlugifiesSpaces() + { + using var service = new WotRegistryService(); + + WotResourceGroup group = await service.GetOrCreateGroupAsync( + "my sensors", WoTDocumentKindEnum.ThingDescription); + + Assert.That(group.GroupId, Does.Not.Contain(" "), + "Spaces must be replaced by the Slugify helper."); + } + + [Test] + public async Task AddRegistryLabelAsyncAddsLabel() + { + using var service = new WotRegistryService(); + + WotRegistryMutationResult result = await service.AddRegistryLabelAsync( + "environment", "production"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.Labels["environment"], Is.EqualTo("production")); + } + + [Test] + public async Task AddRegistryLabelAsyncUpdatesExistingLabel() + { + using var service = new WotRegistryService(); + await service.AddRegistryLabelAsync("environment", "staging"); + + WotRegistryMutationResult result = await service.AddRegistryLabelAsync( + "environment", "production"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.Labels["environment"], Is.EqualTo("production")); + Assert.That(service.Current.Labels, Has.Count.EqualTo(1), + "Updating the same key must not duplicate."); + } + + [Test] + public async Task AddRegistryLabelAsyncWithEpochMismatchReturnsRejected() + { + using var service = new WotRegistryService(); + long generation = service.Current.Generation; + + WotRegistryMutationResult result = await service.AddRegistryLabelAsync( + "environment", "production", expectedEpoch: generation + 999); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That(service.Current.Labels.ContainsKey("environment"), Is.False); + } + + [Test] + public async Task AddRegistryLabelAsyncWithCorrectEpochSucceeds() + { + using var service = new WotRegistryService(); + long generation = service.Current.Generation; + + WotRegistryMutationResult result = await service.AddRegistryLabelAsync( + "environment", "production", expectedEpoch: generation); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + } + + [Test] + public async Task AddRegistryLabelAsyncExceedsMaxLabelsThrows() + { + var bounds = new WotRegistryPersistenceBounds { MaxLabelsPerEntity = 1 }; + using var service = new WotRegistryService(bounds: bounds); + await service.AddRegistryLabelAsync("k1", "v1"); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.AddRegistryLabelAsync("k2", "v2")); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + } + + [Test] + public async Task AddRegistryLabelAsyncRaisesProjectionOnlyChanged() + { + using var service = new WotRegistryService(); + WotRegistryChangedEventArgs? captured = null; + service.Changed += (_, e) => captured = e; + + await service.AddRegistryLabelAsync("environment", "production"); + + Assert.That(captured, Is.Not.Null); + Assert.That(captured!.ProjectionOnly, Is.True, + "Registry label mutations are projection-only."); + } + + [Test] + public async Task RemoveRegistryLabelAsyncRemovesExistingLabel() + { + using var service = new WotRegistryService(); + await service.AddRegistryLabelAsync("environment", "production"); + + WotRegistryMutationResult result = await service.RemoveRegistryLabelAsync("environment"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.Labels.ContainsKey("environment"), Is.False); + } + + [Test] + public async Task RemoveRegistryLabelAsyncForMissingKeyReturnsFailed() + { + using var service = new WotRegistryService(); + + WotRegistryMutationResult result = await service.RemoveRegistryLabelAsync("missing"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public void RemoveRegistryLabelAsyncWithEmptyKeyThrows() + { + using var service = new WotRegistryService(); + + ServiceResultException ex = Assert.ThrowsAsync( + async () => await service.RemoveRegistryLabelAsync(string.Empty)); + + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task RemoveRegistryLabelAsyncWithEpochMismatchReturnsRejected() + { + using var service = new WotRegistryService(); + await service.AddRegistryLabelAsync("environment", "production"); + + WotRegistryMutationResult result = await service.RemoveRegistryLabelAsync( + "environment", expectedEpoch: service.Current.Generation + 999); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That(service.Current.Labels.ContainsKey("environment"), Is.True, + "Label must remain when epoch check fails."); + } + + [Test] + public async Task RemoveRegistryLabelAsyncRaisesProjectionOnlyChanged() + { + using var service = new WotRegistryService(); + await service.AddRegistryLabelAsync("environment", "production"); + WotRegistryChangedEventArgs? captured = null; + service.Changed += (_, e) => captured = e; + + await service.RemoveRegistryLabelAsync("environment"); + + Assert.That(captured, Is.Not.Null); + Assert.That(captured!.ProjectionOnly, Is.True); + } + + [Test] + public async Task MutateGroupAsyncViaGroupLabelUpdatesGroup() + { + using var service = new WotRegistryService(); + await service.GetOrCreateGroupAsync("sensors", WoTDocumentKindEnum.ThingDescription); + + WotRegistryMutationResult result = await service.AddGroupLabelAsync( + "sensors", "owner", "team-iot"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That( + service.Current.FindGroup("sensors")!.Labels["owner"], + Is.EqualTo("team-iot")); + } + + [Test] + public async Task MutateGroupAsyncViaGroupLabelWhenGroupMissingReturnsFailed() + { + using var service = new WotRegistryService(); + + WotRegistryMutationResult result = await service.AddGroupLabelAsync( + "nonexistent", "k", "v"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + } + + [Test] + public async Task MutateGroupAsyncViaGroupLabelWithEpochMismatchReturnsRejected() + { + using var service = new WotRegistryService(); + await service.GetOrCreateGroupAsync("sensors", WoTDocumentKindEnum.ThingDescription); + WotResourceGroup? group = service.Current.FindGroup("sensors"); + + WotRegistryMutationResult result = await service.AddGroupLabelAsync( + "sensors", "owner", "team-iot", expectedEpoch: group!.Epoch + 999); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + } + + [Test] + public async Task NormalizeSegmentViaUpsertSlugsUpperCase() + { + using var service = new WotRegistryService(); + var request = new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "MyDevice", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:device") + }; + + WotRegistryMutationResult result = await service.UpsertResourceAsync(request); + + Assert.That(result.Outcome, Is.Not.EqualTo(WoTOutcomeEnum.Rejected)); + } + + [Test] + public async Task MaxResourcesPerGroupBoundRejectedByUpsert() + { + var bounds = new WotRegistryPersistenceBounds { MaxResourcesPerGroup = 1 }; + using var service = new WotRegistryService(bounds: bounds); + await service.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "a", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:a") + }); + + WotRegistryMutationResult result = await service.UpsertResourceAsync( + new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "b", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:b") + }); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected), + "Adding a second resource beyond MaxResourcesPerGroup must be rejected."); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceTests.cs new file mode 100644 index 0000000000..24ae8d7dbe --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryServiceTests.cs @@ -0,0 +1,304 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Exercises the stable registry service: CRUD, versioning, default and + /// enabled state, invalid-document retention, unchanged idempotency, epoch + /// concurrency and persistence bounds. + /// + [TestFixture] + public sealed class WotRegistryServiceTests + { + private static WotUpsertResourceRequest TdRequest( + string resourceId, byte[] content, bool setDefault = true) + { + return new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = content, + SetAsDefault = setDefault + }; + } + + [Test] + public async Task UpsertCreatesResourceAndBumpsGeneration() + { + using var service = new WotRegistryService(); + byte[] doc = TestMaterialization.Td("urn:a"); + + WotRegistryMutationResult result = await service.UpsertResourceAsync( + TdRequest("a", doc)); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(result.Generation, Is.GreaterThan(0)); + WotResource? resource = service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a"); + Assert.That(resource, Is.Not.Null); + Assert.That(resource!.Versions, Has.Length.EqualTo(1)); + Assert.That(resource.DefaultVersionId, Is.EqualTo(resource.Versions[0].VersionId)); + Assert.That(resource.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + } + + [Test] + public async Task UpsertSameContentReturnsUnchanged() + { + using var service = new WotRegistryService(); + byte[] doc = TestMaterialization.Td("urn:a"); + await service.UpsertResourceAsync(TdRequest("a", doc)); + long generation = service.Current.Generation; + + WotRegistryMutationResult second = await service.UpsertResourceAsync( + TdRequest("a", doc)); + + Assert.That(second.Outcome, Is.EqualTo(WoTOutcomeEnum.Unchanged)); + Assert.That(service.Current.Generation, Is.EqualTo(generation), + "An unchanged upload must not advance the registry generation."); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a")!.Versions, + Has.Length.EqualTo(1)); + } + + [Test] + public async Task UpsertNewContentAddsVersion() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a", "v1"))); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a", "v2"))); + + WotResource resource = service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a")!; + Assert.That(resource.Versions, Has.Length.EqualTo(2)); + Assert.That(resource.DefaultVersionId, Is.EqualTo(resource.Versions[1].VersionId)); + } + + [Test] + public async Task InvalidDocumentIsStoredWithFailureState() + { + using var service = new WotRegistryService(); + + WotRegistryMutationResult result = await service.UpsertResourceAsync( + TdRequest("bad", TestMaterialization.InvalidJson())); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Warning)); + WotResource resource = service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "bad")!; + Assert.That(resource.LoadState, Is.EqualTo(WoTLoadStateEnum.Failed)); + Assert.That(resource.Validation, Is.Not.Null); + Assert.That(resource.Validation!.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + Assert.That(resource.Versions, Has.Length.EqualTo(1), + "The invalid document must still be stored."); + } + + [Test] + public async Task UpsertTooLargeIsRejectedAndNotStored() + { + var bounds = new WotRegistryPersistenceBounds { MaxDocumentBytes = 32 }; + using var service = new WotRegistryService(bounds: bounds); + byte[] big = new byte[64]; + + WotRegistryMutationResult result = await service.UpsertResourceAsync( + TdRequest("big", big)); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That(service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "big"), Is.Null); + } + + [Test] + public async Task MaxGroupsImplicitCreateViaGetOrCreateResourceIsRejected() + { + var bounds = new WotRegistryPersistenceBounds { MaxGroups = 1 }; + using var service = new WotRegistryService(bounds: bounds); + // Fill the single group slot via the well-known Thing Description group. + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + Assert.That(service.Current.Groups, Has.Count.EqualTo(1)); + + // Implicitly creating a placeholder in a new group would exceed + // MaxGroups and must be rejected identically to the explicit + // group-create APIs (BadTooManyOperations). + ServiceResultException ex = Assert.ThrowsAsync(async () => + await service.GetOrCreateResourceAsync("sensors", "r", WoTDocumentKindEnum.ThingDescription)); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + Assert.That(service.Current.FindGroup("sensors"), Is.Null, + "The over-limit implicit group must not be created."); + } + + [Test] + public async Task MaxGroupsImplicitCreateViaTryCreateResourceIsRejected() + { + var bounds = new WotRegistryPersistenceBounds { MaxGroups = 1 }; + using var service = new WotRegistryService(bounds: bounds); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + + ServiceResultException ex = Assert.ThrowsAsync(async () => + await service.TryCreateResourceAsync("sensors", "r", WoTDocumentKindEnum.ThingDescription)); + Assert.That(ex.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + Assert.That(service.Current.FindGroup("sensors"), Is.Null); + } + + [Test] + public async Task MaxGroupsImplicitCreateViaUpsertIsRejected() + { + var bounds = new WotRegistryPersistenceBounds { MaxGroups = 1 }; + using var service = new WotRegistryService(bounds: bounds); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + + // An upsert whose target group does not yet exist would implicitly + // create a second group; the bound must reject it. + WotRegistryMutationResult result = await service.UpsertResourceAsync( + new WotUpsertResourceRequest + { + GroupId = "sensors", + ResourceId = "r", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td("urn:r") + }); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + Assert.That(service.Current.FindGroup("sensors"), Is.Null); + } + + [Test] + public async Task MaxGroupsAllowsAnotherResourceInExistingGroup() + { + var bounds = new WotRegistryPersistenceBounds { MaxGroups = 1 }; + using var service = new WotRegistryService(bounds: bounds); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + + // Creating another resource in the SAME existing group creates no new + // group, so it must not be blocked by MaxGroups. + (WotResource _, bool created) = await service.GetOrCreateResourceAsync( + WotRegistryGroups.ThingDescriptions, "b", WoTDocumentKindEnum.ThingDescription); + + Assert.That(created, Is.True); + Assert.That(service.Current.Groups, Has.Count.EqualTo(1)); + } + + [Test] + public async Task VersionRetentionTrimsOldestBeyondBound() + { + var bounds = new WotRegistryPersistenceBounds { MaxVersionsPerResource = 3 }; + using var service = new WotRegistryService(bounds: bounds); + for (int i = 0; i < 5; i++) + { + await service.UpsertResourceAsync( + TdRequest("a", TestMaterialization.Td("urn:a", "v" + i))); + } + + WotResource resource = service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a")!; + Assert.That(resource.Versions, Has.Length.EqualTo(3), + "Version retention must trim the oldest versions."); + } + + [Test] + public async Task SetDefaultVersionSwitchesActiveDefault() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a", "v1"))); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a", "v2"))); + WotResource resource = service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a")!; + string firstVersion = resource.Versions[0].VersionId; + + WotRegistryMutationResult result = await service.SetDefaultVersionAsync( + WotRegistryGroups.ThingDescriptions, "a", firstVersion, resource.Epoch); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a")! + .DefaultVersionId, + Is.EqualTo(firstVersion)); + } + + [Test] + public async Task SetDefaultVersionWrongEpochIsRejected() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + WotResource resource = service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a")!; + + WotRegistryMutationResult result = await service.SetDefaultVersionAsync( + WotRegistryGroups.ThingDescriptions, "a", + resource.Versions[0].VersionId, expectedEpoch: resource.Epoch + 999); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Rejected)); + } + + [Test] + public async Task SetEnabledTogglesEnabledState() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + + await service.SetEnabledAsync(WotRegistryGroups.ThingDescriptions, "a", enabled: false); + + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a")!.Enabled, + Is.False); + } + + [Test] + public async Task DeleteRemovesResource() + { + using var service = new WotRegistryService(); + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + + WotRegistryMutationResult result = await service.DeleteResourceAsync( + WotRegistryGroups.ThingDescriptions, "a"); + + Assert.That(result.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(service.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a"), Is.Null); + } + + [Test] + public async Task ChangedRaisedForContentMutation() + { + using var service = new WotRegistryService(); + WotRegistryChangedEventArgs? captured = null; + service.Changed += (_, e) => captured = e; + + await service.UpsertResourceAsync(TdRequest("a", TestMaterialization.Td("urn:a"))); + + Assert.That(captured, Is.Not.Null); + Assert.That(captured!.ProjectionOnly, Is.False); + Assert.That(captured.ChangedResourceXids, Has.Count.EqualTo(1)); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryTransactionTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryTransactionTests.cs new file mode 100644 index 0000000000..bdbbdb5291 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotRegistryTransactionTests.cs @@ -0,0 +1,470 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Fault-injection tests for the registry's transactional store commit + /// contract. Ordinary pre-commit failures and confirmed not-committed outcomes + /// leave the previous snapshot published. A validated committed-but-uncertain + /// outcome is published and rethrown, while an indeterminate outcome blocks + /// mutation until reload. + /// + [TestFixture] + public sealed class WotRegistryTransactionTests + { + private string m_root = null!; + + [SetUp] + public void SetUp() + { + m_root = Path.Combine( + TestContext.CurrentContext.TestDirectory, + "wot-tx-" + Guid.NewGuid().ToString("N")); + Directory.CreateDirectory(m_root); + } + + [TearDown] + public void TearDown() + { + try + { + if (Directory.Exists(m_root)) + { + Directory.Delete(m_root, recursive: true); + } + } + catch (IOException) + { + } + } + + private static WotUpsertResourceRequest TdRequest(string resourceId, string id) + { + return new() + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = TestMaterialization.Td(id) + }; + } + + [Test] + public async Task CommitFailureLeavesCurrentUnchangedAndRaisesNoEvent() + { + var store = new FaultInjectingWotRegistryStore(new InMemoryWotRegistryStore()); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + // Seed a first, successful mutation so there is a prior generation. + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + long generationBefore = service.Current.Generation; + + int changedCount = 0; + service.Changed += (_, _) => changedCount++; + + // Arm the injected failure: the next commit throws before it persists. + store.FailNextCommit = true; + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync(TdRequest("b", "urn:b"))); + + // Current must still be the previous generation: no partial publish. + Assert.That(service.Current.Generation, Is.EqualTo(generationBefore), + "A failed commit must not advance the published generation."); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null, "A failed commit must not publish the new resource."); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null, "The prior generation must remain intact after a failed commit."); + Assert.That(changedCount, Is.Zero, + "A failed commit must not raise a Changed event."); + } + + [Test] + public async Task CommitFailureThenRetryPersistsAndRaisesExactlyOneEvent() + { + var store = new FaultInjectingWotRegistryStore(new InMemoryWotRegistryStore()); + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + int changedCount = 0; + service.Changed += (_, _) => changedCount++; + + store.FailNextCommit = true; + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync(TdRequest("a", "urn:a"))); + Assert.That(changedCount, Is.Zero); + + // Retry after the fault clears: the same mutation now commits and the + // resource becomes visible with a single change notification. + store.FailNextCommit = false; + WotRegistryMutationResult retry = await service.UpsertResourceAsync( + TdRequest("a", "urn:a")); + + Assert.That(retry.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + Assert.That(changedCount, Is.EqualTo(1), + "Exactly one Changed event must be raised, only on the successful commit."); + Assert.That(store.CommitAttempts, Is.EqualTo(2), + "The retry must re-attempt persistence."); + } + + [Test] + public async Task CommitFailureRestartSeesNoPartialData() + { + // First service instance persists 'a', then fails to commit 'b'. + var store = new FaultInjectingWotRegistryStore(new FileWotRegistryStore(m_root)); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + + store.FailNextCommit = true; + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync(TdRequest("b", "urn:b"))); + } + + // Restart over the same folder with a fresh store/service: only the + // durably committed 'a' is restored; 'b' was never persisted. + using var reloaded = new WotRegistryService(new FileWotRegistryStore(m_root)); + await reloaded.InitializeAsync(); + + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null, "The committed resource must survive a restart."); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null, "A resource whose commit failed must never appear after a restart."); + } + + [Test] + public async Task FileStoreLoadReadsOnlyCommittedGenerationIgnoringStagedFiles() + { + using (var service = new WotRegistryService(new FileWotRegistryStore(m_root))) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + } + + // Simulate a crash after staging but before the atomic manifest switch: + // an orphan version blob and a temp manifest exist, but manifest.json + // still points at the committed generation. + string blobsDir = Path.Combine(m_root, "blobs"); + Directory.CreateDirectory(blobsDir); + File.WriteAllBytes( + Path.Combine(blobsDir, new string('e', 40) + ".bin"), + TestMaterialization.Td("urn:staged")); + File.WriteAllText( + Path.Combine(m_root, "manifest.json.tmp-" + Guid.NewGuid().ToString("N")), + "{ staged, not committed"); + + using var reloaded = new WotRegistryService(new FileWotRegistryStore(m_root)); + await reloaded.InitializeAsync(); + + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null, "Load must restore the committed generation."); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "staged"), + Is.Null, "Load must ignore staged, not-yet-committed data."); + } + + [Test] + public async Task ProjectionResultsAreDurablyCommittedAndSurviveRestart() + { + string activeVersionId; + using (var service = new WotRegistryService(new FileWotRegistryStore(m_root))) + { + await service.InitializeAsync(); + WotRegistryMutationResult upsert = await service.UpsertResourceAsync( + TdRequest("a", "urn:a")); + activeVersionId = upsert.Resource!.DefaultVersionId!; + + await service.ApplyProjectionResultsAsync( + [ + new WotResourceProjection( + WotRegistryGroups.ThingDescriptions, + "a", + WoTLoadStateEnum.Active, + activeVersionId, + refreshGeneration: 7, + materializedNodeCount: 5, + rootNodeId: new NodeId(5000, 1), + validation: null, + diagnostics: [], + lastRefreshTime: DateTime.UtcNow) + ]); + } + + using var reloaded = new WotRegistryService(new FileWotRegistryStore(m_root)); + await reloaded.InitializeAsync(); + + WotResource restored = reloaded.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "a")!; + Assert.That(restored.LoadState, Is.EqualTo(WoTLoadStateEnum.Active), + "Projection load state must be durably committed."); + Assert.That(restored.ActiveVersionId, Is.EqualTo(activeVersionId)); + Assert.That(restored.RefreshGeneration, Is.EqualTo(7u)); + Assert.That(restored.MaterializedNodeCount, Is.EqualTo(5)); + Assert.That(restored.RootNodeId, Is.EqualTo(new NodeId(5000, 1))); + } + + [Test] + public async Task InMemoryStoreCommitFailureLoadReturnsPreviousGeneration() + { + var store = new FaultInjectingWotRegistryStore(new InMemoryWotRegistryStore()); + using (var service = new WotRegistryService(store)) + { + await service.InitializeAsync(); + await service.UpsertResourceAsync(TdRequest("a", "urn:a")); + + store.FailNextCommit = true; + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync(TdRequest("b", "urn:b"))); + } + + // A brand new service over the same in-memory store instance loads the + // last committed generation only (the failed 'b' commit is absent). + using var reloaded = new WotRegistryService(store); + await reloaded.InitializeAsync(); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + Assert.That( + reloaded.Current.FindResource(WotRegistryGroups.ThingDescriptions, "b"), + Is.Null); + } + + [Test] + public async Task ExternalStoreNotCommittedOutcomeLeavesServiceRetryable() + { + var store = new OutcomeInjectingWotRegistryStore + { + NextOutcome = CommitOutcome.NotCommitted + }; + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + int changedCount = 0; + service.Changed += (_, _) => changedCount++; + + WotRegistryCommitNotCommittedException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + + Assert.That(error.IntendedGeneration, Is.EqualTo(1)); + Assert.That(service.Current, Is.SameAs(WotRegistrySnapshot.Empty)); + Assert.That(changedCount, Is.Zero); + + WotRegistryMutationResult retry = await service.UpsertResourceAsync( + TdRequest("a", "urn:a")); + Assert.That(retry.Outcome, Is.EqualTo(WoTOutcomeEnum.Success)); + Assert.That(changedCount, Is.EqualTo(1)); + } + + [Test] + public void PostSwitchOutcomeConstructorsArePublicForExternalStores() + { + Assert.That( + typeof(WotRegistryCommitNotCommittedException).GetConstructor( + [ + typeof(WotRegistrySnapshot), + typeof(Exception), + typeof(string) + ]), + Is.Not.Null); + Assert.That( + typeof(WotRegistryCommitDurabilityUncertainException).GetConstructor( + [ + typeof(WotRegistrySnapshot), + typeof(Exception) + ]), + Is.Not.Null); + Assert.That( + typeof(WotRegistryCommitIndeterminateException).GetConstructor( + [ + typeof(WotRegistrySnapshot), + typeof(Exception), + typeof(Exception) + ]), + Is.Not.Null); + } + + [Test] + public async Task ExternalStoreCommittedUncertainOutcomeIsPublishedAndRethrown() + { + var store = new OutcomeInjectingWotRegistryStore + { + NextOutcome = CommitOutcome.CommittedUncertain + }; + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + int changedCount = 0; + service.Changed += (_, _) => changedCount++; + + WotRegistryCommitDurabilityUncertainException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + + Assert.That(service.Current, Is.SameAs(error.CommittedSnapshot)); + Assert.That(service.Current, Is.SameAs(store.Persisted)); + Assert.That(changedCount, Is.EqualTo(1)); + } + + [Test] + public async Task ExternalStoreIndeterminateOutcomeBlocksUntilReload() + { + var store = new OutcomeInjectingWotRegistryStore + { + NextOutcome = CommitOutcome.Indeterminate + }; + using var service = new WotRegistryService(store); + await service.InitializeAsync(); + + WotRegistryCommitIndeterminateException error = + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("a", "urn:a"))); + + Assert.That(error.IntendedGeneration, Is.EqualTo(1)); + Assert.That(service.Current, Is.SameAs(WotRegistrySnapshot.Empty)); + Assert.ThrowsAsync( + async () => await service.UpsertResourceAsync( + TdRequest("b", "urn:b"))); + + await service.InitializeAsync(); + Assert.That(service.Current, Is.SameAs(store.Persisted)); + Assert.That( + service.Current.FindResource(WotRegistryGroups.ThingDescriptions, "a"), + Is.Not.Null); + } + + /// + /// An decorator that can be armed to throw + /// on the next (before delegating to the inner + /// store), so a persistence failure can be injected deterministically. + /// + private sealed class FaultInjectingWotRegistryStore : IWotRegistryStore + { + public FaultInjectingWotRegistryStore(IWotRegistryStore inner) + { + m_inner = inner; + } + + public bool FailNextCommit { get; set; } + + public int CommitAttempts { get; private set; } + + public ValueTask LoadAsync( + CancellationToken cancellationToken = default) + { + return m_inner.LoadAsync(cancellationToken); + } + + public ValueTask CommitAsync( + WotRegistrySnapshot snapshot, CancellationToken cancellationToken = default) + { + CommitAttempts++; + if (FailNextCommit) + { + throw new InvalidOperationException("Injected commit failure."); + } + return m_inner.CommitAsync(snapshot, cancellationToken); + } + + private readonly IWotRegistryStore m_inner; + } + + private sealed class OutcomeInjectingWotRegistryStore : IWotRegistryStore + { + public CommitOutcome NextOutcome { get; set; } + + public WotRegistrySnapshot Persisted { get; private set; } = + WotRegistrySnapshot.Empty; + + public ValueTask LoadAsync( + CancellationToken cancellationToken = default) + { + return new ValueTask(Persisted); + } + + public ValueTask CommitAsync( + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken = default) + { + CommitOutcome outcome = NextOutcome; + NextOutcome = CommitOutcome.Success; + var failure = new IOException($"Injected external {outcome} outcome."); + switch (outcome) + { + case CommitOutcome.NotCommitted: + throw new WotRegistryCommitNotCommittedException( + snapshot, + failure, + "external-recovery-manifest"); + case CommitOutcome.CommittedUncertain: + Persisted = snapshot; + throw new WotRegistryCommitDurabilityUncertainException( + snapshot, + failure); + case CommitOutcome.Indeterminate: + Persisted = snapshot; + throw new WotRegistryCommitIndeterminateException( + snapshot, + failure, + new InvalidDataException( + "Injected external validation uncertainty.")); + default: + Persisted = snapshot; + return default; + } + } + } + + private enum CommitOutcome + { + Success, + NotCommitted, + CommittedUncertain, + Indeterminate + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Registry/WotResourceFileManagerTests.cs b/tests/Opc.Ua.WotCon.Tests/Registry/WotResourceFileManagerTests.cs new file mode 100644 index 0000000000..8aaf208569 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Registry/WotResourceFileManagerTests.cs @@ -0,0 +1,771 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Server.Registry; + +namespace Opc.Ua.WotCon.Tests.Registry +{ + /// + /// Exercises the OPC UA FileType + /// primitives (Open/Read/Write/Close/GetPosition/SetPosition) in isolation, + /// without a running server. The ThingDescriptionFileState is created via + /// the source-generated factory; method handlers are invoked directly + /// through the wired method delegates. + /// + [TestFixture] + [Category("WotCon")] + [Parallelizable(ParallelScope.All)] + public sealed class WotResourceFileManagerTests + { + private const byte ModeRead = WotResourceFileManager.ReadMode; + private const byte ModeWriteErase = WotResourceFileManager.WriteEraseMode; + + [TestCase((byte)0)] + [TestCase((byte)2)] + [TestCase((byte)3)] + [TestCase((byte)4)] + [TestCase((byte)5)] + [TestCase((byte)7)] + [TestCase((byte)8)] + [TestCase((byte)10)] + public void OpenWithUnsupportedModeReturnsBadNotSupported(byte mode) + { + using var harness = new Harness(); + uint handle = 0; + ServiceResult result = harness.Open(mode, ref handle); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadNotSupported)); + Assert.That(handle, Is.Zero); + } + + [Test] + public void OpenWithReadModeSucceeds() + { + using var harness = new Harness(); + uint handle = 0; + ServiceResult result = harness.Open(ModeRead, ref handle); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(handle, Is.GreaterThan(0u)); + Assert.That(harness.File.OpenCount!.Value, Is.EqualTo((ushort)1)); + } + + [Test] + public void OpenWithWriteEraseModeSucceeds() + { + using var harness = new Harness(); + uint handle = 0; + ServiceResult result = harness.Open(ModeWriteErase, ref handle); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(handle, Is.GreaterThan(0u)); + } + + [Test] + public void OpenWriteModeCallsAuthorizeWrite() + { + bool called = false; + using var harness = new Harness(authorizeWrite: (_, _) => + { + called = true; + return ServiceResult.Good; + }); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + + Assert.That(called, Is.True); + } + + [Test] + public void OpenWriteModeWhenAuthorizeFailsReturnsBadResult() + { + using var harness = new Harness(authorizeWrite: (_, _) => + (ServiceResult)StatusCodes.BadUserAccessDenied); + uint handle = 0; + ServiceResult result = harness.Open(ModeWriteErase, ref handle); + + Assert.That(ServiceResult.IsBad(result), Is.True); + Assert.That(handle, Is.Zero); + } + + [Test] + public void OpenReadModeDoesNotCallAuthorizeWrite() + { + bool called = false; + using var harness = new Harness(authorizeWrite: (_, _) => + { + called = true; + return ServiceResult.Good; + }); + uint handle = 0; + harness.Open(ModeRead, ref handle); + + Assert.That(called, Is.False); + } + + [Test] + public void OpenSecondWriterWhileFirstOpenReturnsBadInvalidState() + { + using var harness = new Harness(); + uint first = 0; + harness.Open(ModeWriteErase, ref first); + uint second = 0; + ServiceResult result = harness.Open(ModeWriteErase, ref second); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + Assert.That(second, Is.Zero); + } + + [Test] + public void OpenBeyondMaxHandlesReturnsBadTooManyOperations() + { + using var harness = new Harness(maxOpenHandles: 2); + uint h1 = 0; + uint h2 = 0; + harness.Open(ModeRead, ref h1); + harness.Open(ModeRead, ref h2); + uint h3 = 0; + ServiceResult result = harness.Open(ModeRead, ref h3); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + } + + [Test] + public async Task OpenCountIncreasesAndDecreasesWithHandles() + { + using var harness = new Harness(); + uint h1 = 0; + uint h2 = 0; + harness.Open(ModeRead, ref h1); + Assert.That(harness.File.OpenCount!.Value, Is.EqualTo((ushort)1)); + harness.Open(ModeRead, ref h2); + Assert.That(harness.File.OpenCount.Value, Is.EqualTo((ushort)2)); + await harness.CloseAsync(h1).ConfigureAwait(false); + Assert.That(harness.File.OpenCount.Value, Is.EqualTo((ushort)1)); + await harness.CloseAsync(h2).ConfigureAwait(false); + Assert.That(harness.File.OpenCount.Value, Is.Zero); + } + + [Test] + public async Task ReadOnValidReadHandleReturnsContent() + { + using var harness = new Harness(); + byte[] content = Encoding.UTF8.GetBytes("hello resource"); + harness.Manager.UpdatePersistedContent(content, null); + + uint handle = 0; + harness.Open(ModeRead, ref handle); + ByteString data = default; + ServiceResult result = harness.Read(handle, 256, ref data); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(data.Span.ToArray(), Is.EqualTo(content)); + } + + [Test] + public async Task ReadWithLengthZeroReturnsEmptyAndSuccess() + { + using var harness = new Harness(); + harness.Manager.UpdatePersistedContent(new byte[] { 1, 2, 3 }, null); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ByteString data = default; + ServiceResult result = harness.Read(handle, 0, ref data); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(data.IsNull || data.Span.Length == 0, Is.True); + } + + [Test] + public async Task ReadPastEndOfFileReturnsEmptyAndSuccess() + { + using var harness = new Harness(); + harness.Manager.UpdatePersistedContent(new byte[] { 1, 2 }, null); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ByteString first = default; + harness.Read(handle, 2, ref first); + ByteString data = default; + ServiceResult result = harness.Read(handle, 256, ref data); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(data.IsNull || data.Span.Length == 0, Is.True); + } + + [Test] + public async Task ReadOnWriteHandleReturnsBadInvalidState() + { + using var harness = new Harness(); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + ByteString data = default; + ServiceResult result = harness.Read(handle, 16, ref data); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + } + + [Test] + public void ReadWithInvalidHandleReturnsBadInvalidArgument() + { + using var harness = new Harness(); + ByteString data = default; + ServiceResult result = harness.Read(9999, 16, ref data); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task WriteOnValidWriteHandleSucceeds() + { + using var harness = new Harness(); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + ServiceResult result = harness.Write(handle, ByteString.From(new byte[] { 1, 2, 3 })); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + } + + [Test] + public async Task WriteOnReadHandleReturnsBadInvalidState() + { + using var harness = new Harness(); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ServiceResult result = harness.Write(handle, ByteString.From(new byte[] { 1 })); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + } + + [Test] + public void WriteWithInvalidHandleReturnsBadInvalidArgument() + { + using var harness = new Harness(); + ServiceResult result = harness.Write(9999, ByteString.From(new byte[] { 1 })); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task WriteBeyondMaxSizeReturnsBadOutOfMemory() + { + using var harness = new Harness(maxDocumentSize: 4); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + ServiceResult result = harness.Write(handle, ByteString.From(new byte[] { 1, 2, 3, 4, 5 })); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadOutOfMemory)); + } + + [Test] + public async Task WriteEmptyByteStringIsNoOp() + { + using var harness = new Harness(); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + ServiceResult result = harness.Write(handle, ByteString.Empty); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + } + + [Test] + public async Task WriteWhenAuthorizeFailsReturnsBadResult() + { + using var harness = new Harness(authorizeWrite: (_, op) => + { + if (op == "Write") + { + return (ServiceResult)StatusCodes.BadUserAccessDenied; + } + + return ServiceResult.Good; + }); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + ServiceResult result = harness.Write(handle, ByteString.From(new byte[] { 1, 2 })); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsBad(result), Is.True); + } + + [Test] + public async Task GetPositionOnReadHandleReturnsZeroInitially() + { + using var harness = new Harness(); + harness.Manager.UpdatePersistedContent(new byte[] { 1, 2, 3 }, null); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ulong position = 999; + ServiceResult result = harness.GetPosition(handle, ref position); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(position, Is.Zero); + } + + [Test] + public void GetPositionWithInvalidHandleReturnsBadInvalidArgument() + { + using var harness = new Harness(); + ulong position = 0; + ServiceResult result = harness.GetPosition(9999, ref position); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task GetPositionReflectsCurrentReadOffset() + { + using var harness = new Harness(); + harness.Manager.UpdatePersistedContent(new byte[] { 1, 2, 3, 4, 5 }, null); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ByteString data = default; + harness.Read(handle, 3, ref data); + ulong position = 0; + ServiceResult result = harness.GetPosition(handle, ref position); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(position, Is.EqualTo(3ul)); + } + + [Test] + public async Task SetPositionOnReadHandleWithinBoundsSucceeds() + { + using var harness = new Harness(); + harness.Manager.UpdatePersistedContent(new byte[] { 1, 2, 3, 4, 5 }, null); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ServiceResult result = harness.SetPosition(handle, 3); + ulong pos = 0; + harness.GetPosition(handle, ref pos); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(pos, Is.EqualTo(3ul)); + } + + [Test] + public async Task SetPositionBeyondLengthReturnsBadInvalidArgument() + { + using var harness = new Harness(); + harness.Manager.UpdatePersistedContent(new byte[] { 1, 2, 3 }, null); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ServiceResult result = harness.SetPosition(handle, 100); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public void SetPositionWithInvalidHandleReturnsBadInvalidArgument() + { + using var harness = new Harness(); + ServiceResult result = harness.SetPosition(9999, 0); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task SetPositionOnWriteHandleCallsAuthorizeWrite() + { + bool setPosAuthCalled = false; + using var harness = new Harness(authorizeWrite: (_, op) => + { + if (op == "SetWritePosition") + { + setPosAuthCalled = true; + } + + return ServiceResult.Good; + }); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + harness.Write(handle, ByteString.From(new byte[] { 1, 2, 3 })); + harness.SetPosition(handle, 1); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(setPosAuthCalled, Is.True); + } + + [Test] + public async Task SetPositionOnWriteHandleWhenAuthorizeFailsReturnsBadResult() + { + using var harness = new Harness(authorizeWrite: (_, op) => + { + if (op == "SetWritePosition") + { + return (ServiceResult)StatusCodes.BadUserAccessDenied; + } + + return ServiceResult.Good; + }); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + harness.Write(handle, ByteString.From(new byte[] { 1, 2, 3 })); + ServiceResult result = harness.SetPosition(handle, 1); + await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsBad(result), Is.True); + } + + [Test] + public async Task CloseReadHandleSucceedsWithoutCommit() + { + int commitCount = 0; + using var harness = new Harness(onCommit: (_, _, _) => + { + commitCount++; + return new ValueTask(ServiceResult.Good); + }); + uint handle = 0; + harness.Open(ModeRead, ref handle); + ServiceResult result = await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(commitCount, Is.Zero); + } + + [Test] + public async Task CloseWriteHandleWithContentInvokesCommitCallback() + { + byte[]? committed = null; + using var harness = new Harness(onCommit: (bytes, _, _) => + { + committed = bytes; + return new ValueTask(ServiceResult.Good); + }); + byte[] payload = Encoding.UTF8.GetBytes("doc body"); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + harness.Write(handle, ByteString.From(payload)); + ServiceResult result = await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(committed, Is.EqualTo(payload)); + } + + [Test] + public async Task CloseWriteHandleAwaitsCommitCallbackAsync() + { + var commitStarted = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + var releaseCommit = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + using var harness = new Harness(onCommit: async (_, _, _) => + { + commitStarted.SetResult(new object()); + return await releaseCommit.Task.ConfigureAwait(false); + }); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + harness.Write(handle, ByteString.From(Encoding.UTF8.GetBytes("doc body"))); + + ValueTask close = harness.CloseAsync(handle); + await commitStarted.Task.ConfigureAwait(false); + + Assert.That(close.IsCompleted, Is.False); + + releaseCommit.SetResult(ServiceResult.Good); + ServiceResult result = await close.ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + } + + [Test] + public async Task CloseWriteHandleWithoutContentIsNoOp() + { + int commitCount = 0; + using var harness = new Harness(onCommit: (_, _, _) => + { + commitCount++; + return new ValueTask(ServiceResult.Good); + }); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + ServiceResult result = await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(commitCount, Is.Zero); + } + + [Test] + public async Task CloseWithInvalidHandleReturnsBadInvalidArgument() + { + using var harness = new Harness(); + ServiceResult result = await harness.CloseAsync(9999).ConfigureAwait(false); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + [Test] + public async Task CloseWriteHandleWhenCommitFailsReturnsBadResult() + { + using var harness = new Harness(onCommit: (_, _, _) => + new ValueTask((ServiceResult)StatusCodes.BadInternalError)); + byte[] payload = Encoding.UTF8.GetBytes("doc"); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + harness.Write(handle, ByteString.From(payload)); + ServiceResult result = await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(ServiceResult.IsBad(result), Is.True); + } + + [Test] + public async Task CloseWriteHandleWhenCloseAuthorizeFailsRemovesHandle() + { + int closeAuthCount = 0; + using var harness = new Harness(authorizeWrite: (_, op) => + { + if (op == "CloseWrite") + { + closeAuthCount++; + return (ServiceResult)StatusCodes.BadUserAccessDenied; + } + + return ServiceResult.Good; + }); + byte[] payload = Encoding.UTF8.GetBytes("doc"); + uint handle = 0; + harness.Open(ModeWriteErase, ref handle); + harness.Write(handle, ByteString.From(payload)); + ServiceResult result = await harness.CloseAsync(handle).ConfigureAwait(false); + + Assert.That(closeAuthCount, Is.EqualTo(1)); + Assert.That(ServiceResult.IsBad(result), Is.True); + Assert.That(harness.File.OpenCount!.Value, Is.Zero, + "Handle must be removed even when close-authorize fails."); + } + + [Test] + public void TryOpenWriteHandleSucceeds() + { + using var harness = new Harness(); + ServiceResult result = harness.Manager.TryOpenWriteHandle(NodeId.Null, out uint fileHandle); + + Assert.That(ServiceResult.IsGood(result), Is.True); + Assert.That(fileHandle, Is.GreaterThan(0u)); + Assert.That(harness.File.OpenCount!.Value, Is.EqualTo((ushort)1)); + } + + [Test] + public void TryOpenWriteHandleWhenMaxHandlesExceededReturnsBadTooManyOperations() + { + using var harness = new Harness(maxOpenHandles: 1); + uint h1 = 0; + harness.Open(ModeRead, ref h1); + + ServiceResult result = harness.Manager.TryOpenWriteHandle(NodeId.Null, out uint fileHandle); + + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadTooManyOperations)); + Assert.That(fileHandle, Is.Zero); + } + + [Test] + public void TryOpenWriteHandleWhenWriterAlreadyOpenReturnsBadInvalidState() + { + using var harness = new Harness(); + harness.Manager.TryOpenWriteHandle(NodeId.Null, out uint _); + + ServiceResult second = harness.Manager.TryOpenWriteHandle(NodeId.Null, out uint fileHandle); + + Assert.That(second.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + Assert.That(fileHandle, Is.Zero); + } + + [Test] + public void UpdatePersistedContentSetsCurrentContentAndFileSize() + { + using var harness = new Harness(); + byte[] content = new byte[] { 10, 20, 30 }; + harness.Manager.UpdatePersistedContent(content, "application/td+json"); + + Assert.That(harness.Manager.CurrentContent, Is.EqualTo(content)); + Assert.That(harness.File.Size!.Value, Is.EqualTo((ulong)3)); + } + + [Test] + public async Task WriteThenReadRoundTripsContent() + { + using var harness = new Harness(); + byte[] payload = Encoding.UTF8.GetBytes("{\"title\":\"my-thing\"}"); + uint wh = 0; + harness.Open(ModeWriteErase, ref wh); + harness.Write(wh, ByteString.From(payload)); + await harness.CloseAsync(wh).ConfigureAwait(false); + harness.Manager.UpdatePersistedContent(payload, null); + + uint rh = 0; + harness.Open(ModeRead, ref rh); + ByteString data = default; + harness.Read(rh, payload.Length + 16, ref data); + await harness.CloseAsync(rh).ConfigureAwait(false); + + Assert.That(data.Span.ToArray(), Is.EqualTo(payload)); + } + + [Test] + public void DisposeClosesAllOpenHandles() + { + var harness = new Harness(); + uint h1 = 0; + uint h2 = 0; + harness.Open(ModeRead, ref h1); + harness.Open(ModeRead, ref h2); + + harness.Dispose(); + + // After dispose the Manager should not throw and operations on old + // handles now return BadInvalidArgument (handles dict was cleared). + ByteString data = default; + ServiceResult result = harness.Read(h1, 1, ref data); + Assert.That(result.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument), + "Old handles must be invalid after the manager is disposed."); + } + + [Test] + public void SecondDisposeIsIdempotent() + { + var harness = new Harness(); + harness.Dispose(); + + Assert.That(() => harness.Dispose(), Throws.Nothing); + } + + [Test] + public async Task OperationsOnUnknownHandleReturnBadInvalidArgument() + { + using var harness = new Harness(); + ByteString data = default; + ulong pos = 0; + + ServiceResult readResult = harness.Read(9999, 1, ref data); + ServiceResult closeResult = await harness.CloseAsync(9999).ConfigureAwait(false); + ServiceResult writeResult = harness.Write(9999, ByteString.From(new byte[] { 1 })); + ServiceResult getPos = harness.GetPosition(9999, ref pos); + ServiceResult setPos = harness.SetPosition(9999, 0); + + Assert.That(readResult.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + Assert.That(closeResult.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + Assert.That(writeResult.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + Assert.That(getPos.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + Assert.That(setPos.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + private sealed class Harness : IDisposable + { + private readonly NodeId m_objectId; + + public Harness( + int maxOpenHandles = 8, + int maxDocumentSize = 1024 * 1024, + Func? authorizeWrite = null, + Func>? onCommit = null) + { + Context = new SystemContext(null!) + { + NamespaceUris = new NamespaceTable(), + EncodeableFactory = EncodeableFactory.Create() + }; + Context.NamespaceUris.GetIndexOrAppend(Namespaces.WotCon); + Context.NamespaceUris.GetIndexOrAppend("urn:test"); + + File = Context.CreateInstanceOfThingDescriptionFileType( + parent: null!, + browseName: new QualifiedName("ResourceFile", 1)); + + Manager = new WotResourceFileManager( + File, + maxOpenHandles, + maxDocumentSize, + authorizeWrite ?? ((_, _) => ServiceResult.Good), + onCommit ?? ((_, _, _) => new ValueTask(ServiceResult.Good))); + + m_objectId = File.NodeId; + } + + public SystemContext Context { get; } + + public ThingDescriptionFileState File { get; } + + public WotResourceFileManager Manager { get; } + + public ServiceResult Open(byte mode, ref uint fileHandle) + => File.Open!.OnCall!.Invoke(Context, File.Open, m_objectId, mode, ref fileHandle); + + public async ValueTask CloseAsync(uint fileHandle) + { + CloseMethodStateResult result = await File.Close!.OnCallAsync!( + Context, + File.Close, + m_objectId, + fileHandle, + CancellationToken.None) + .ConfigureAwait(false); + return result.ServiceResult; + } + + public ServiceResult Read(uint fileHandle, int length, ref ByteString data) + => File.Read!.OnCall!.Invoke(Context, File.Read, m_objectId, fileHandle, length, ref data); + + public ServiceResult Write(uint fileHandle, ByteString data) + => File.Write!.OnCall!.Invoke(Context, File.Write, m_objectId, fileHandle, data); + + public ServiceResult GetPosition(uint fileHandle, ref ulong position) + => File.GetPosition!.OnCall!.Invoke( + Context, File.GetPosition, m_objectId, fileHandle, ref position); + + public ServiceResult SetPosition(uint fileHandle, ulong position) + => File.SetPosition!.OnCall!.Invoke( + Context, File.SetPosition, m_objectId, fileHandle, position); + + public void Dispose() + => Manager.Dispose(); + } + } +} + + diff --git a/tests/Opc.Ua.WotCon.Tests/Resources/WotAggregation/StructuredPumpMappingExample.td.json b/tests/Opc.Ua.WotCon.Tests/Resources/WotAggregation/StructuredPumpMappingExample.td.json new file mode 100644 index 0000000000..70b23de13d --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Resources/WotAggregation/StructuredPumpMappingExample.td.json @@ -0,0 +1 @@ +{"@context":["https://www.w3.org/2022/wot/td/v1.1",{"uav":"http://opcfoundation.org/UA/WoT/v1#"}],"properties":{"differentialPressureField":{"forms":[{"href":"${SOURCE_A_ENDPOINT}","op":["readproperty"],"uav:id":"nsu=urn:opcfoundation.org:UA:WotAggregation:SourceA;s=Pump1.ProcessSnapshot"}],"readOnly":true,"type":"number","uav:mapByFieldPath":"Process/DifferentialPressure","uav:mapToType":"nsu=urn:opcfoundation.org:UA:WotAggregation:StructuredExample;i=3001"}},"title":"Structured Pump Mapping Example"} \ No newline at end of file diff --git a/tests/Opc.Ua.WotCon.Tests/RuntimeNodeSet/WotRegistryEventIntegrationTests.cs b/tests/Opc.Ua.WotCon.Tests/RuntimeNodeSet/WotRegistryEventIntegrationTests.cs new file mode 100644 index 0000000000..dde714653d --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/RuntimeNodeSet/WotRegistryEventIntegrationTests.cs @@ -0,0 +1,501 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Server.TestFramework; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Quickstarts.ReferenceServer; +using WotConModel = Opc.Ua.WotCon; +using UaBrowseNames = global::Opc.Ua.BrowseNames; +using UaObjectIds = global::Opc.Ua.ObjectIds; +using UaObjectTypeIds = global::Opc.Ua.ObjectTypeIds; + +#nullable disable warnings + +namespace Opc.Ua.WotCon.Tests.RuntimeNodeSet +{ + /// + /// End-to-end tests that a real subscription with a real + /// receives the generated WoT V2 event types through + /// the running server's notifier chain, and that every typed event field + /// populated by from the coordinator's + /// event arguments is delivered and resolvable via the filter's + /// select clauses. + /// + [TestFixture] + [Category("RuntimeNodeSet")] + [Category("WotCon")] + [Category("Server")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + [NonParallelizable] + public sealed class WotRegistryEventIntegrationTests + { + private string m_pkiRoot = null!; + private ServerFixture m_fixture = null!; + private ReferenceServer m_server = null!; + private RequestHeader m_requestHeader = null!; + private SecureChannelContext m_secureChannelContext = null!; + private WotRegistryService m_registry = null!; + private WotMaterializationCoordinator m_coordinator = null!; + + [SetUp] + public async Task SetUpAsync() + { + m_pkiRoot = Path.Combine( + TestContext.CurrentContext.WorkDirectory, + nameof(WotRegistryEventIntegrationTests), + Guid.NewGuid().ToString("N")); + + m_fixture = new ServerFixture(t => new ReferenceServer(t)) + { + UriScheme = Utils.UriSchemeOpcTcp, + SecurityNone = true, + AutoAccept = true + }; + m_server = await m_fixture.StartAsync(m_pkiRoot).ConfigureAwait(false); + + (m_requestHeader, m_secureChannelContext) = await m_server + .CreateAndActivateSessionAsync(TestContext.CurrentContext.Test.Name) + .ConfigureAwait(false); + m_requestHeader.Timestamp = DateTimeUtc.Now; + + var options = new WotRegistryServerOptions + { + // Refreshes are triggered explicitly by the tests so the raised + // events are deterministic. + AutoRefresh = false, + ManagementAccess = new WotManagementAccessPolicy + { + MinimumSecurityMode = MessageSecurityMode.None, + AllowAnonymous = true, + RequiredRoleId = UaObjectIds.WellKnownRole_Anonymous + } + }; + m_registry = new WotRegistryService(); + var host = new LifecycleWotProjectionHost(m_server.NodeManagerLifecycle); + m_coordinator = new WotMaterializationCoordinator( + m_registry, host, documentConverter: new SelectiveConverter()); + var factory = new WotRegistryNodeManagerFactory(options, m_registry, m_coordinator); + await m_server.NodeManagerLifecycle.AddAsync(factory).ConfigureAwait(false); + } + + [TearDown] + public async Task TearDownAsync() + { + if (m_requestHeader is not null) + { + m_requestHeader.Timestamp = DateTimeUtc.Now; + await m_server + .CloseSessionAsync(m_secureChannelContext, m_requestHeader, true, RequestLifetime.None) + .ConfigureAwait(false); + } + + m_coordinator?.Dispose(); + m_registry?.Dispose(); + m_server?.Dispose(); + + if (m_fixture is not null) + { + await m_fixture.StopAsync().ConfigureAwait(false); + } + + if (!string.IsNullOrEmpty(m_pkiRoot) && Directory.Exists(m_pkiRoot)) + { + Directory.Delete(m_pkiRoot, recursive: true); + } + } + + [Test] + public async Task RefreshCompletedEventDeliversPopulatedSummaryFieldsThroughNotifierChain() + { + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, m_server.CurrentInstance.NamespaceUris); + + var services = new ServerTestServices(m_server, m_secureChannelContext); + uint subscriptionId = await CreateEventSubscriptionAsync(services, registryNodeId) + .ConfigureAwait(false); + + // Trigger a refresh: the registry raises a RefreshCompleted event with + // the request id, the committed generation and the refresh summary. + const string RequestId = "req-42"; + WotRefreshResult result = await m_coordinator + .RefreshAsync(new WotRefreshRequest { RequestId = RequestId }) + .ConfigureAwait(false); + + var refreshCompletedType = ExpandedNodeId.ToNodeId( + WotConModel.ObjectTypeIds.WoTRefreshCompletedEventType, m_server.CurrentInstance.NamespaceUris); + + EventFieldList? evt = await CollectEventAsync( + services, subscriptionId, + efl => EventTypeOf(efl) == refreshCompletedType).ConfigureAwait(false); + + Assert.That(evt, Is.Not.Null, + "The RefreshCompleted event must be delivered through the notifier chain."); + ArrayOf fields = evt!.EventFields; + Assert.That(AsString(fields[Field.RequestId]), Is.EqualTo(RequestId), + "RequestId must be populated from the materialization event arguments."); + Assert.That(AsUInt32(fields[Field.Generation]), Is.EqualTo(result.NewGeneration), + "The event's Generation must match the committed refresh generation."); + Assert.That( + fields[Field.Summary].TryGetValue(out ExtensionObject summaryEo), Is.True, + "The refresh Summary structure field must be populated."); + Assert.That(summaryEo.TryGetValue(out WoTRefreshSummaryDataType? summary), Is.True); + Assert.That(summary!.RequestId, Is.EqualTo(RequestId), + "The Summary must carry the originating refresh request id."); + + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + [Test] + public async Task ResourceEventDeliversPopulatedIdentityFieldsThroughNotifierChain() + { + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, m_server.CurrentInstance.NamespaceUris); + + await m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "sensor", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = SelectiveConverter.ValidTd("sensor") + }).ConfigureAwait(false); + + var services = new ServerTestServices(m_server, m_secureChannelContext); + uint subscriptionId = await CreateEventSubscriptionAsync(services, registryNodeId) + .ConfigureAwait(false); + + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + var resourceType = ExpandedNodeId.ToNodeId( + WotConModel.ObjectTypeIds.WoTResourceEventType, m_server.CurrentInstance.NamespaceUris); + + EventFieldList? evt = await CollectEventAsync( + services, subscriptionId, + efl => EventTypeOf(efl) == resourceType).ConfigureAwait(false); + + Assert.That(evt, Is.Not.Null, + "The resource activation event must be delivered through the notifier chain."); + ArrayOf fields = evt!.EventFields; + Assert.That(AsString(fields[Field.ResourceId]), Is.EqualTo("sensor")); + Assert.That(AsString(fields[Field.Xid]), Does.Contain("sensor")); + Assert.That( + fields[Field.DocumentKind].TryGetValue(out WoTDocumentKindEnum kind), Is.True, + "DocumentKind must be populated from the resource kind."); + Assert.That(kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + Assert.That( + fields[Field.Outcome].TryGetValue(out WoTOutcomeEnum _), Is.True, + "Outcome must be populated for a resource lifecycle event."); + + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + [Test] + public async Task ValidationFailureEventDeliversValidationOutcomeThroughNotifierChain() + { + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, m_server.CurrentInstance.NamespaceUris); + + // The selective converter fails conversion for ids containing 'bad', + // which the coordinator surfaces as a validation failure event. + await m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = "bad-thing", + Kind = WoTDocumentKindEnum.ThingDescription, + Content = SelectiveConverter.ValidTd("bad-thing") + }).ConfigureAwait(false); + + var services = new ServerTestServices(m_server, m_secureChannelContext); + uint subscriptionId = await CreateEventSubscriptionAsync(services, registryNodeId) + .ConfigureAwait(false); + + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + var validationFailureType = ExpandedNodeId.ToNodeId( + WotConModel.ObjectTypeIds.WoTValidationFailureEventType, m_server.CurrentInstance.NamespaceUris); + + EventFieldList? evt = await CollectEventAsync( + services, subscriptionId, + efl => EventTypeOf(efl) == validationFailureType).ConfigureAwait(false); + + Assert.That(evt, Is.Not.Null, + "The validation failure event must be delivered through the notifier chain."); + ArrayOf fields = evt!.EventFields; + Assert.That(AsString(fields[Field.ResourceId]), Is.EqualTo("bad-thing")); + Assert.That( + fields[Field.ValidationOutcome].TryGetValue(out ExtensionObject outcomeEo), Is.True, + "The ValidationOutcome structure field must be populated."); + Assert.That(outcomeEo.TryGetValue(out WoTValidationOutcomeDataType? outcome), Is.True); + Assert.That(outcome!.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Failed)); + + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + private static class Field + { + public const int EventType = 0; + public const int Xid = 1; + public const int ResourceId = 2; + public const int VersionId = 3; + public const int DocumentKind = 4; + public const int Generation = 5; + public const int Phase = 6; + public const int Outcome = 7; + public const int ValidationOutcome = 8; + public const int LoadState = 9; + public const int FailedNodeId = 10; + public const int Reason = 11; + public const int BindingUri = 12; + public const int Summary = 13; + public const int RequestId = 14; + } + + private EventFilter BuildWotEventFilter() + { + ushort v2 = (ushort)m_server.CurrentInstance.NamespaceUris.GetIndex( + WotConModel.Namespaces.WotCon); + + SimpleAttributeOperand Wot(string name) + => new() + { + AttributeId = Attributes.Value, + TypeDefinitionId = UaObjectTypeIds.BaseEventType, + BrowsePath = [new QualifiedName(name, v2)] + }; + + SimpleAttributeOperand Base(string name) + => new() + { + AttributeId = Attributes.Value, + TypeDefinitionId = UaObjectTypeIds.BaseEventType, + BrowsePath = [QualifiedName.From(name)] + }; + + return new EventFilter + { + SelectClauses = + [ + Base(UaBrowseNames.EventType), // 0 + Wot(WotConModel.BrowseNames.Xid), // 1 + Wot(WotConModel.BrowseNames.ResourceId), // 2 + Wot(WotConModel.BrowseNames.VersionId), // 3 + Wot(WotConModel.BrowseNames.DocumentKind), // 4 + Wot(WotConModel.BrowseNames.Generation), // 5 + Wot(WotConModel.BrowseNames.Phase), // 6 + Wot(WotConModel.BrowseNames.Outcome), // 7 + Wot(WotConModel.BrowseNames.ValidationOutcome), // 8 + Wot(WotConModel.BrowseNames.LoadState), // 9 + Wot(WotConModel.BrowseNames.FailedNodeId), // 10 + Wot(WotConModel.BrowseNames.Reason), // 11 + Wot(WotConModel.BrowseNames.BindingUri), // 12 + Wot(WotConModel.BrowseNames.Summary), // 13 + Wot(WotConModel.BrowseNames.RequestId) // 14 + ], + WhereClause = new ContentFilter() + }; + } + + private async Task CreateEventSubscriptionAsync( + ServerTestServices services, NodeId sourceNodeId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscription = await services + .CreateSubscriptionAsync(requestHeader, 100, 1200, 20, 0, true, 0) + .ConfigureAwait(false); + uint subscriptionId = subscription.SubscriptionId; + + ArrayOf items = + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId + { + NodeId = sourceNodeId, + AttributeId = Attributes.EventNotifier + }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = ClientHandle, + SamplingInterval = 0, + QueueSize = 100, + DiscardOldest = true, + Filter = new ExtensionObject(BuildWotEventFilter()) + } + } + ]; + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse created = await services + .CreateMonitoredItemsAsync( + requestHeader, subscriptionId, TimestampsToReturn.Neither, items) + .ConfigureAwait(false); + Assert.That(created.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good), + "The event monitored item must be created on the WoTRegistry notifier."); + return subscriptionId; + } + + private async Task CollectEventAsync( + ServerTestServices services, uint subscriptionId, Func predicate) + { + ArrayOf acks = default; + for (int attempt = 0; attempt < 40; attempt++) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + PublishResponse response = await services + .PublishAsync(requestHeader, acks, timeoutCts.Token).ConfigureAwait(false); + acks = response.AvailableSequenceNumbers.ToArrayOf( + sequenceNumber => new SubscriptionAcknowledgement + { + SubscriptionId = subscriptionId, + SequenceNumber = sequenceNumber + }); + + if (response.NotificationMessage is { } message) + { + ArrayOf notifications = message.NotificationData; + for (int n = 0; n < notifications.Count; n++) + { + if (!notifications[n].TryGetValue(out EventNotificationList? events)) + { + continue; + } + for (int i = 0; i < events.Events.Count; i++) + { + EventFieldList efl = events.Events[i]; + if (efl.ClientHandle == ClientHandle && predicate(efl)) + { + return efl; + } + } + } + } + } + return null; + } + + private async Task DeleteSubscriptionAsync(ServerTestServices services, uint subscriptionId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ArrayOf ids = [subscriptionId]; + await services.DeleteSubscriptionsAsync(requestHeader, ids).ConfigureAwait(false); + } + + private static NodeId EventTypeOf(EventFieldList efl) + { + return efl.EventFields[Field.EventType].TryGetValue(out NodeId n) ? n : NodeId.Null; + } + + private static string AsString(Variant variant) + { + return variant.TryGetValue(out string s) ? s : string.Empty; + } + + private static uint AsUInt32(Variant variant) + { + return variant.TryGetValue(out uint u) ? u : 0u; + } + + private const uint ClientHandle = 77; + + /// + /// A converter that emits a minimal valid projection for a resource, but + /// fails conversion for any resource id containing "bad" so a validation + /// failure event can be exercised deterministically. + /// + private sealed class SelectiveConverter : IWotDocumentConverter + { + private const string ModelUri = "urn:wot:events:model"; + + public static byte[] ValidTd(string id) + { + return Encoding.UTF8.GetBytes( + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"@type\":\"uav:object\",\"id\":\"urn:" + + id + + "\",\"title\":\"" + + id + + "\"}"); + } + + public ValueTask ConvertAsync( + WotResource resource, + ReadOnlyMemory content, + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + return new ValueTask(Convert(resource)); + } + + private static WotConversionOutput Convert(WotResource resource) + { + if (resource.ResourceId.Contains("bad", StringComparison.Ordinal)) + { + return WotConversionOutput.Failure( + $"Injected conversion failure for '{resource.ResourceId}'."); + } + + string ns = ModelUri + "/" + resource.ResourceId; + string xml = $""" + + + {ns} + + + Root + + i=58 + i=85 + + + + """; + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); + UANodeSet nodeSet = UANodeSet.Read(stream)!; + return WotConversionOutput.Success(nodeSet); + } + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/RuntimeNodeSet/WotRegistryLifecycleTests.cs b/tests/Opc.Ua.WotCon.Tests/RuntimeNodeSet/WotRegistryLifecycleTests.cs new file mode 100644 index 0000000000..e0d85771f4 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/RuntimeNodeSet/WotRegistryLifecycleTests.cs @@ -0,0 +1,895 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Server; +using Opc.Ua.Server.TestFramework; +using Opc.Ua.WotCon; +using Opc.Ua.WotCon.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Quickstarts.ReferenceServer; +using WotConModel = Opc.Ua.WotCon; +using UaObjectIds = global::Opc.Ua.ObjectIds; +using UaReferenceTypeIds = global::Opc.Ua.ReferenceTypeIds; + +#nullable disable warnings + +namespace Opc.Ua.WotCon.Tests.RuntimeNodeSet +{ + /// + /// End-to-end lifecycle test for the WoT Connectivity V2 registry hosted on a + /// real running . It registers a Thing + /// Description, materializes it as a shadow-reloadable runtime projection, + /// creates a real subscription and monitored item on the projected value, + /// registers a compatible new version, refreshes into a new generation, and + /// verifies that new Read/Browse observe the new generation while the existing + /// monitored item is kept alive on the retained generation until the + /// subscription is deleted and the retired projection is cleaned up. + /// + [TestFixture] + [Category("NodeManagerLifecycle")] + [Category("RuntimeNodeSet")] + [Category("WotCon")] + [Category("Server")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + [NonParallelizable] + public sealed class WotRegistryLifecycleTests + { + private const double kMaxAge = 10000; + private const string kModelNamespaceUri = "urn:wot:e2e:sensor"; + private const uint kRootNodeId = 5000; + private const uint kValueNodeId = 5001; + private const uint kGenChildBaseNodeId = 5100; + private const string kValueBrowseName = "Value"; + + private string m_pkiRoot = null!; + private ServerFixture m_fixture = null!; + private ReferenceServer m_server = null!; + private RequestHeader m_requestHeader = null!; + private SecureChannelContext m_secureChannelContext = null!; + + private WotRegistryService m_registry = null!; + private WotMaterializationCoordinator m_coordinator = null!; + private WotRegistryServerOptions m_options = null!; + + [SetUp] + public async Task SetUpAsync() + { + m_pkiRoot = Path.Combine( + TestContext.CurrentContext.WorkDirectory, + nameof(WotRegistryLifecycleTests), + Guid.NewGuid().ToString("N")); + + m_fixture = new ServerFixture(t => new ReferenceServer(t)) + { + UriScheme = Utils.UriSchemeOpcTcp, + SecurityNone = true, + AutoAccept = true + }; + + m_server = await m_fixture.StartAsync(m_pkiRoot).ConfigureAwait(false); + + (m_requestHeader, m_secureChannelContext) = await m_server + .CreateAndActivateSessionAsync(TestContext.CurrentContext.Test.Name) + .ConfigureAwait(false); + m_requestHeader.Timestamp = DateTimeUtc.Now; + + // Host the WoT registry NodeManager on the running server with a + // deterministic converter so the projected value node is predictable. + m_options = new WotRegistryServerOptions + { + AutoRefresh = false, + ManagementAccess = new WotManagementAccessPolicy + { + MinimumSecurityMode = MessageSecurityMode.None, + AllowAnonymous = true, + RequiredRoleId = UaObjectIds.WellKnownRole_Anonymous + } + }; + m_registry = new WotRegistryService(); + var host = new LifecycleWotProjectionHost(m_server.NodeManagerLifecycle); + m_coordinator = new WotMaterializationCoordinator( + m_registry, host, documentConverter: new SensorConverter()); + var factory = new WotRegistryNodeManagerFactory(m_options, m_registry, m_coordinator); + await m_server.NodeManagerLifecycle.AddAsync(factory).ConfigureAwait(false); + } + + [TearDown] + public async Task TearDownAsync() + { + if (m_requestHeader is not null) + { + m_requestHeader.Timestamp = DateTimeUtc.Now; + await m_server + .CloseSessionAsync(m_secureChannelContext, m_requestHeader, true, RequestLifetime.None) + .ConfigureAwait(false); + } + + m_coordinator?.Dispose(); + m_registry?.Dispose(); + m_server?.Dispose(); + + if (m_fixture is not null) + { + await m_fixture.StopAsync().ConfigureAwait(false); + } + + if (!string.IsNullOrEmpty(m_pkiRoot) && Directory.Exists(m_pkiRoot)) + { + Directory.Delete(m_pkiRoot, recursive: true); + } + } + + [Test] + public async Task RegisterMaterializeSubscribeRefreshAndRetireAsync() + { + IServerInternal server = m_server.CurrentInstance; + + // 1. Register and materialize the first generation of the Thing Description. + await UpsertSensorAsync("sensor", generation: 1).ConfigureAwait(false); + WotRefreshResult first = await m_coordinator + .RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + Assert.That(first.Results.Any(r => r.LoadState == WoTLoadStateEnum.Active), Is.True, + "The registered Thing Description must materialize into an active projection."); + + // The browseable registry projection exposes the group and resource. + await AssertRegistryProjectionAsync(server).ConfigureAwait(false); + + ushort ns = (ushort)server.NamespaceUris.GetIndex(kModelNamespaceUri); + Assert.That(ns, Is.GreaterThan(0), "The projected model namespace must be registered."); + var valueNodeId = new NodeId(kValueNodeId, ns); + var rootNodeId = new NodeId(kRootNodeId, ns); + var gen1ChildNodeId = new NodeId(kGenChildBaseNodeId + 1u, ns); + var gen2ChildNodeId = new NodeId(kGenChildBaseNodeId + 2u, ns); + + DataValue value1 = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(value1.StatusCode, Is.EqualTo(StatusCodes.Good), + "The projected value node must be materialized and readable."); + DataValue gen1Read = await ReadValueAsync(gen1ChildNodeId).ConfigureAwait(false); + Assert.That(gen1Read.StatusCode, Is.EqualTo(StatusCodes.Good), + "The first generation's node must be present after materialization."); + + // 2. Create a subscription and monitored item on the projected value. + var services = new ServerTestServices(m_server, m_secureChannelContext); + uint subscriptionId = await CreateSubscriptionWithMonitoredItemAsync(services, valueNodeId) + .ConfigureAwait(false); + ArrayOf acks = default; + (DataValue? initial, acks) = await PublishForDataChangeAsync( + services, subscriptionId, acks, clientHandle: 1).ConfigureAwait(false); + Assert.That(initial, Is.Not.Null, + "The monitored item must deliver an initial data-change notification."); + + try + { + // 3. Register a compatible new version and refresh into a new generation. + await UpsertSensorAsync("sensor", generation: 2).ConfigureAwait(false); + WotRefreshResult second = await m_coordinator + .RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + Assert.That(second.NewGeneration, Is.GreaterThan(first.NewGeneration), + "A compatible new version must advance the refresh generation."); + + // 4. New Read/Browse observe the new generation: new service requests + // route to the replacement generation (which exposes the Gen2 node and + // no longer the Gen1 node), while the value node persists across both. + DataValue value2 = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That(value2.StatusCode, Is.EqualTo(StatusCodes.Good)); + DataValue gen2Read = await ReadValueAsync(gen2ChildNodeId).ConfigureAwait(false); + Assert.That(gen2Read.StatusCode, Is.EqualTo(StatusCodes.Good), + "A Read after the refresh must observe the new generation's node."); + DataValue gen1AfterSwitch = await ReadValueAsync(gen1ChildNodeId).ConfigureAwait(false); + Assert.That( + gen1AfterSwitch.StatusCode.Code, + Is.EqualTo(StatusCodes.BadNodeIdUnknown).Or.EqualTo(StatusCodes.BadNodeIdInvalid), + "New requests must no longer resolve the retired generation's node."); + + BrowseResponse rootBrowse = await BrowseAsync(rootNodeId).ConfigureAwait(false); + ArrayOf references = rootBrowse.Results[0].References; + Assert.That( + references.Contains(r => r.BrowseName.Equals( + new QualifiedName(GenChildBrowseName(2), ns))), + Is.True, "Browse must observe the new generation's child."); + Assert.That( + references.Contains(r => r.BrowseName.Equals( + new QualifiedName(GenChildBrowseName(1), ns))), + Is.False, "Browse must no longer observe the retired generation's child."); + + // 5. The existing monitored item remains alive across the switch: the + // subscription still services publishes without invalidating the item. + (_, acks) = await PublishKeepAliveAsync(services, subscriptionId, acks) + .ConfigureAwait(false); + } + finally + { + // 6. Delete the subscription, releasing the monitored item. + await DeleteSubscriptionAsync(services, subscriptionId).ConfigureAwait(false); + } + + // 7. Remove the resource and refresh: the retired projection is cleaned up. + await m_registry.DeleteResourceAsync(WotRegistryGroups.ThingDescriptions, "sensor") + .ConfigureAwait(false); + await m_coordinator.RefreshAsync(new WotRefreshRequest()).ConfigureAwait(false); + + DataValue removed = await ReadValueAsync(valueNodeId).ConfigureAwait(false); + Assert.That( + removed.StatusCode.Code, + Is.EqualTo(StatusCodes.BadNodeIdUnknown).Or.EqualTo(StatusCodes.BadNodeIdInvalid), + "The retired projection's nodes must be cleaned up after the resource is removed."); + } + + private async Task AssertRegistryProjectionAsync(IServerInternal server) + { + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, server.NamespaceUris); + ushort v2Ns = (ushort)server.NamespaceUris.GetIndex(WotConModel.Namespaces.WotCon); + var groupNodeId = new NodeId( + "WoTRegistry/groups/" + WotRegistryGroups.ThingDescriptions, v2Ns); + var resourceNodeId = new NodeId( + $"WoTRegistry/groups/{WotRegistryGroups.ThingDescriptions}/resources/sensor", v2Ns); + + bool groupVisible = await WaitForConditionAsync(async () => + { + BrowseResponse browse = await BrowseAsync(registryNodeId).ConfigureAwait(false); + return browse.Results[0].References.Contains(r => + ExpandedNodeId.ToNodeId(r.NodeId, server.NamespaceUris) == groupNodeId); + }).ConfigureAwait(false); + Assert.That(groupVisible, Is.True, "WoTRegistry must expose the Thing Description group."); + + bool resourceVisible = await WaitForConditionAsync(async () => + { + BrowseResponse browse = await BrowseAsync(groupNodeId).ConfigureAwait(false); + return browse.Results[0].References.Contains(r => + ExpandedNodeId.ToNodeId(r.NodeId, server.NamespaceUris) == resourceNodeId); + }).ConfigureAwait(false); + Assert.That(resourceVisible, Is.True, + "The group must expose the registered resource document."); + } + + [Test] + public async Task CrudMethodsAndFileUploadDriveTheRegistryAsync() + { + IServerInternal server = m_server.CurrentInstance; + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, server.NamespaceUris); + + // 1. CreateGroup via the xRegistry CreateGroup Method on WoTRegistry. + NodeId createGroupId = await FindChildAsync(registryNodeId, "CreateGroup") + .ConfigureAwait(false); + CallMethodResult createGroup = await CallAsync( + registryNodeId, createGroupId, new Variant("sensors")).ConfigureAwait(false); + Assert.That(createGroup.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(m_registry.Current.FindGroup("sensors"), Is.Not.Null); + var groupNodeId = (NodeId)createGroup.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + + // 2. GetOrCreateResource with RequestFileOpen returns a write FileHandle. + NodeId getOrCreateResourceId = await FindChildAsync(groupNodeId, "GetOrCreateResource") + .ConfigureAwait(false); + CallMethodResult createResource = await CallAsync( + groupNodeId, getOrCreateResourceId, + new Variant("thing1"), new Variant(string.Empty), new Variant(true)) + .ConfigureAwait(false); + Assert.That(createResource.StatusCode, Is.EqualTo(StatusCodes.Good)); + var resourceNodeId = (NodeId)createResource.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + uint fileHandle = createResource.OutputArguments[2].GetUInt32(); + Assert.That(fileHandle, Is.Not.Zero, + "RequestFileOpen must return a non-zero write FileHandle."); + + byte[] td = Encoding.UTF8.GetBytes( + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"@type\":\"uav:object\",\"id\":\"urn:thing1\",\"title\":\"thing1\"}"); + + // 3. Write the document body through the inherited FileType and commit on Close. + NodeId writeId = await FindChildAsync(resourceNodeId, "Write").ConfigureAwait(false); + NodeId closeId = await FindChildAsync(resourceNodeId, "Close").ConfigureAwait(false); + CallMethodResult write = await CallAsync( + resourceNodeId, writeId, + new Variant(fileHandle), new Variant(ByteString.From(td))).ConfigureAwait(false); + Assert.That(write.StatusCode, Is.EqualTo(StatusCodes.Good)); + + CallMethodResult close = await CallAsync( + resourceNodeId, closeId, new Variant(fileHandle)).ConfigureAwait(false); + Assert.That(close.StatusCode, Is.EqualTo(StatusCodes.Good)); + + WotResource stored = m_registry.Current.FindResource("sensors", "thing1"); + Assert.That(stored?.DefaultVersion, Is.Not.Null, + "Closing the write handle must commit the buffered document as a version."); + + // 4. Validate the stored document. + NodeId validateId = await FindChildAsync(resourceNodeId, "Validate").ConfigureAwait(false); + CallMethodResult validate = await CallAsync(resourceNodeId, validateId) + .ConfigureAwait(false); + Assert.That(validate.StatusCode, Is.EqualTo(StatusCodes.Good)); + object outcomeBoxed = validate.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + Assert.That(outcomeBoxed, Is.InstanceOf()); + Assert.That(((ExtensionObject)outcomeBoxed).TryGetValue( + out WoTValidationOutcomeDataType outcome), Is.True); + Assert.That(outcome.FormatOutcome, Is.EqualTo(WoTOutcomeEnum.Success)); + + // 5. SetEnabled(false) through the document Method. + NodeId setEnabledId = await FindChildAsync(resourceNodeId, "SetEnabled") + .ConfigureAwait(false); + CallMethodResult setEnabled = await CallAsync( + resourceNodeId, setEnabledId, + new Variant(false), new Variant(0u)).ConfigureAwait(false); + Assert.That(setEnabled.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(m_registry.Current.FindResource("sensors", "thing1")!.Enabled, Is.False); + + // 6. Delete the resource through the xRegistry Delete Method. + NodeId deleteId = await FindChildAsync(resourceNodeId, "Delete").ConfigureAwait(false); + CallMethodResult delete = await CallAsync( + resourceNodeId, deleteId, new Variant(0u)).ConfigureAwait(false); + Assert.That(delete.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(m_registry.Current.FindResource("sensors", "thing1"), Is.Null); + } + + [Test] + public async Task FileWriteRequiresConfiguredSecureChannelWhileReadMayUseNoneAsync() + { + IServerInternal server = m_server.CurrentInstance; + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, + server.NamespaceUris); + + NodeId createGroupId = await FindChildAsync(registryNodeId, "CreateGroup") + .ConfigureAwait(false); + CallMethodResult createGroup = await CallAsync( + registryNodeId, + createGroupId, + new Variant("secure-files")).ConfigureAwait(false); + var groupNodeId = (NodeId)createGroup.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + + NodeId createResourceId = await FindChildAsync(groupNodeId, "GetOrCreateResource") + .ConfigureAwait(false); + CallMethodResult createResource = await CallAsync( + groupNodeId, + createResourceId, + new Variant("thing1"), + new Variant(string.Empty), + new Variant(true)).ConfigureAwait(false); + var resourceNodeId = (NodeId)createResource.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + uint writeHandle = createResource.OutputArguments[2].GetUInt32(); + + m_options.ManagementAccess = new WotManagementAccessPolicy + { + AllowAnonymous = true, + RequiredRoleId = UaObjectIds.WellKnownRole_Anonymous + }; + + NodeId writeId = await FindChildAsync(resourceNodeId, "Write").ConfigureAwait(false); + CallMethodResult write = await CallAsync( + resourceNodeId, + writeId, + new Variant(writeHandle), + new Variant(ByteString.From(new byte[] { 1, 2, 3 }))).ConfigureAwait(false); + Assert.That(write.StatusCode, Is.EqualTo(StatusCodes.BadUserAccessDenied)); + + NodeId closeId = await FindChildAsync(resourceNodeId, "Close").ConfigureAwait(false); + CallMethodResult writeClose = await CallAsync( + resourceNodeId, + closeId, + new Variant(writeHandle)).ConfigureAwait(false); + Assert.That(writeClose.StatusCode, Is.EqualTo(StatusCodes.BadUserAccessDenied)); + + m_options.ManagementAccess = new WotManagementAccessPolicy + { + MinimumSecurityMode = MessageSecurityMode.None, + AllowAnonymous = true, + RequiredRoleId = UaObjectIds.WellKnownRole_Anonymous + }; + NodeId openId = await FindChildAsync(resourceNodeId, "Open").ConfigureAwait(false); + CallMethodResult authorizedWriteOpen = await CallAsync( + resourceNodeId, + openId, + new Variant((byte)6)).ConfigureAwait(false); + Assert.That(authorizedWriteOpen.StatusCode, Is.EqualTo(StatusCodes.Good), + "A denied close must discard and release the prior writer handle."); + uint authorizedWriteHandle = authorizedWriteOpen.OutputArguments[0].GetUInt32(); + CallMethodResult authorizedWriteClose = await CallAsync( + resourceNodeId, + closeId, + new Variant(authorizedWriteHandle)).ConfigureAwait(false); + Assert.That(authorizedWriteClose.StatusCode, Is.EqualTo(StatusCodes.Good)); + + m_options.ManagementAccess = new WotManagementAccessPolicy + { + AllowAnonymous = true, + RequiredRoleId = UaObjectIds.WellKnownRole_Anonymous + }; + CallMethodResult writeOpen = await CallAsync( + resourceNodeId, + openId, + new Variant((byte)6)).ConfigureAwait(false); + Assert.That(writeOpen.StatusCode, Is.EqualTo(StatusCodes.BadUserAccessDenied)); + + CallMethodResult readOpen = await CallAsync( + resourceNodeId, + openId, + new Variant((byte)1)).ConfigureAwait(false); + Assert.That(readOpen.StatusCode, Is.EqualTo(StatusCodes.Good)); + uint readHandle = readOpen.OutputArguments[0].GetUInt32(); + + CallMethodResult close = await CallAsync( + resourceNodeId, + closeId, + new Variant(readHandle)).ConfigureAwait(false); + Assert.That(close.StatusCode, Is.EqualTo(StatusCodes.Good)); + } + + [Test] + public async Task LabelsAddUpdateRemoveViaRealNodeManagerAsync() + { + IServerInternal server = m_server.CurrentInstance; + var registryNodeId = ExpandedNodeId.ToNodeId( + WotConModel.ObjectIds.WoTRegistry, server.NamespaceUris); + + // Registry-level Labels. + NodeId registryLabelsId = await FindChildAsync(registryNodeId, "Labels") + .ConfigureAwait(false); + NodeId registryAddId = await FindChildAsync(registryLabelsId, "AddAttribute") + .ConfigureAwait(false); + NodeId registryRemoveId = await FindChildAsync(registryLabelsId, "RemoveAttribute") + .ConfigureAwait(false); + + CallMethodResult addRegistry = await CallAsync( + registryLabelsId, registryAddId, + new Variant("environment"), new Variant("production"), new Variant(0u)) + .ConfigureAwait(false); + Assert.That(addRegistry.StatusCode, Is.EqualTo(StatusCodes.Good)); + + NodeId envNodeId = await FindChildAsync(registryLabelsId, "environment") + .ConfigureAwait(false); + DataValue envValue = await ReadValueAsync(envNodeId).ConfigureAwait(false); + Assert.That(envValue.StatusCode, Is.EqualTo(StatusCodes.Good)); + Assert.That(envValue.GetValue(null), Is.EqualTo("production")); + + // Group-level Labels. + NodeId createGroupId = await FindChildAsync(registryNodeId, "CreateGroup") + .ConfigureAwait(false); + CallMethodResult createGroup = await CallAsync( + registryNodeId, createGroupId, new Variant("labelgroup")).ConfigureAwait(false); + Assert.That(createGroup.StatusCode, Is.EqualTo(StatusCodes.Good)); + var groupNodeId = (NodeId)createGroup.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + + NodeId groupLabelsId = await FindChildAsync(groupNodeId, "Labels").ConfigureAwait(false); + NodeId groupAddId = await FindChildAsync(groupLabelsId, "AddAttribute") + .ConfigureAwait(false); + + CallMethodResult addGroupLabel = await CallAsync( + groupLabelsId, groupAddId, + new Variant("owner"), new Variant("team-iot"), new Variant(0u)) + .ConfigureAwait(false); + Assert.That(addGroupLabel.StatusCode, Is.EqualTo(StatusCodes.Good)); + NodeId ownerNodeId = await FindChildAsync(groupLabelsId, "owner").ConfigureAwait(false); + Assert.That( + (await ReadValueAsync(ownerNodeId).ConfigureAwait(false)).GetValue(null), + Is.EqualTo("team-iot")); + + // Epoch mismatch is rejected with Bad_InvalidState and makes no change. + NodeId groupEpochId = await FindChildAsync(groupNodeId, "Epoch").ConfigureAwait(false); + uint groupEpoch = (await ReadValueAsync(groupEpochId).ConfigureAwait(false)) + .GetValue(0); + CallMethodResult mismatchedGroup = await CallAsync( + groupLabelsId, groupAddId, + new Variant("owner"), new Variant("team-other"), new Variant(groupEpoch + 999)) + .ConfigureAwait(false); + Assert.That(mismatchedGroup.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + Assert.That( + (await ReadValueAsync(ownerNodeId).ConfigureAwait(false)).GetValue(null), + Is.EqualTo("team-iot"), "A rejected epoch mismatch must not change the label value."); + + // A key colliding with a fixed Labels container member is rejected. + CallMethodResult collision = await CallAsync( + groupLabelsId, groupAddId, + new Variant("AddAttribute"), new Variant("x"), new Variant(0u)) + .ConfigureAwait(false); + Assert.That(collision.StatusCode, Is.EqualTo(StatusCodes.BadBrowseNameDuplicated)); + + // A key with a path-separator character is rejected. + CallMethodResult invalidKey = await CallAsync( + groupLabelsId, groupAddId, + new Variant("a/b"), new Variant("x"), new Variant(0u)).ConfigureAwait(false); + Assert.That(invalidKey.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + + // Resource-level Labels. + NodeId getOrCreateResourceId = await FindChildAsync(groupNodeId, "GetOrCreateResource") + .ConfigureAwait(false); + CallMethodResult createResource = await CallAsync( + groupNodeId, getOrCreateResourceId, + new Variant("thing1"), new Variant(string.Empty), new Variant(false)) + .ConfigureAwait(false); + Assert.That(createResource.StatusCode, Is.EqualTo(StatusCodes.Good)); + var resourceNodeId = (NodeId)createResource.OutputArguments[0] + .AsBoxedObject(Variant.BoxingBehavior.Legacy); + + NodeId resourceLabelsId = await FindChildAsync(resourceNodeId, "Labels") + .ConfigureAwait(false); + NodeId resourceAddId = await FindChildAsync(resourceLabelsId, "AddAttribute") + .ConfigureAwait(false); + NodeId resourceRemoveId = await FindChildAsync(resourceLabelsId, "RemoveAttribute") + .ConfigureAwait(false); + + CallMethodResult addResourceLabel = await CallAsync( + resourceLabelsId, resourceAddId, + new Variant("site"), new Variant("seattle"), new Variant(0u)) + .ConfigureAwait(false); + Assert.That(addResourceLabel.StatusCode, Is.EqualTo(StatusCodes.Good)); + NodeId siteNodeId = await FindChildAsync(resourceLabelsId, "site").ConfigureAwait(false); + Assert.That( + (await ReadValueAsync(siteNodeId).ConfigureAwait(false)).GetValue(null), + Is.EqualTo("seattle")); + + // Remove the resource label; it must disappear from Browse. + CallMethodResult removeResourceLabel = await CallAsync( + resourceLabelsId, resourceRemoveId, + new Variant("site"), new Variant(0u)).ConfigureAwait(false); + Assert.That(removeResourceLabel.StatusCode, Is.EqualTo(StatusCodes.Good)); + BrowseResponse afterRemove = await BrowseAsync(resourceLabelsId).ConfigureAwait(false); + Assert.That( + afterRemove.Results[0].References.Contains( + r => string.Equals(r.BrowseName.Name, "site", StringComparison.Ordinal)), + Is.False); + + // Removing an unknown label fails with a precise StatusCode. + CallMethodResult removeUnknown = await CallAsync( + resourceLabelsId, resourceRemoveId, + new Variant("missing"), new Variant(0u)).ConfigureAwait(false); + Assert.That(removeUnknown.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + + // Registry-level remove. + CallMethodResult removeRegistry = await CallAsync( + registryLabelsId, registryRemoveId, + new Variant("environment"), new Variant(0u)).ConfigureAwait(false); + Assert.That(removeRegistry.StatusCode, Is.EqualTo(StatusCodes.Good)); + BrowseResponse registryAfterRemove = await BrowseAsync(registryLabelsId) + .ConfigureAwait(false); + Assert.That( + registryAfterRemove.Results[0].References.Contains( + r => string.Equals(r.BrowseName.Name, "environment", StringComparison.Ordinal)), + Is.False); + } + + private async Task FindChildAsync(NodeId parent, string browseName) + { + BrowseResponse browse = await BrowseAsync(parent).ConfigureAwait(false); + foreach (ReferenceDescription reference in browse.Results[0].References) + { + if (string.Equals(reference.BrowseName.Name, browseName, StringComparison.Ordinal)) + { + return ExpandedNodeId.ToNodeId( + reference.NodeId, m_server.CurrentInstance.NamespaceUris); + } + } + Assert.Fail($"Child '{browseName}' was not found under {parent}."); + return NodeId.Null; + } + + private async Task CallAsync( + NodeId objectId, NodeId methodId, params Variant[] inputs) + { + ArrayOf methods = + [ + new CallMethodRequest + { + ObjectId = objectId, + MethodId = methodId, + InputArguments = inputs + } + ]; + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CallResponse response = await m_server + .CallAsync(m_secureChannelContext, requestHeader, methods, RequestLifetime.None) + .ConfigureAwait(false); + return response.Results[0]; + } + + private static async Task WaitForConditionAsync(Func> condition) + { + for (int attempt = 0; attempt < 50; attempt++) + { + if (await condition().ConfigureAwait(false)) + { + return true; + } + await Task.Delay(100).ConfigureAwait(false); + } + return false; + } + + private async Task UpsertSensorAsync(string resourceId, int generation) + { + await m_registry.UpsertResourceAsync(new WotUpsertResourceRequest + { + GroupId = WotRegistryGroups.ThingDescriptions, + ResourceId = resourceId, + Kind = WoTDocumentKindEnum.ThingDescription, + Content = SensorConverter.BuildContent(generation) + }).ConfigureAwait(false); + } + + private static string GenChildBrowseName(int generation) + { + return "Gen" + generation.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Emits a NodeSet2 whose model namespace is fixed and whose value node + /// carries the generation number parsed from the document, plus a + /// generation-specific child so a Browse can distinguish generations. + /// + private sealed class SensorConverter : IWotDocumentConverter + { + public static byte[] BuildContent(int generation) + { + return Encoding.UTF8.GetBytes( + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"@type\":\"uav:object\",\"id\":\"" + + kModelNamespaceUri + + "\"," + + "\"title\":\"sensor\",\"gen\":" + + generation.ToString(CultureInfo.InvariantCulture) + + "}"); + } + + public ValueTask ConvertAsync( + WotResource resource, + ReadOnlyMemory content, + WotRegistrySnapshot snapshot, + CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + return new ValueTask(Convert(content)); + } + + private static WotConversionOutput Convert(ReadOnlyMemory content) + { + int generation = ParseGeneration(content.Span); + uint childId = kGenChildBaseNodeId + (uint)generation; + string childName = "Gen" + generation.ToString(CultureInfo.InvariantCulture); + string xml = $""" + + + + {kModelNamespaceUri} + + + + + + Sensor + + i=58 + ns=1;i={kValueNodeId} + ns=1;i={childId} + i=85 + + + + {kValueBrowseName} + + i=63 + ns=1;i={kRootNodeId} + + {generation} + + + {childName} + + i=63 + ns=1;i={kRootNodeId} + + {generation} + + + """; + using var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); + UANodeSet nodeSet = UANodeSet.Read(stream)!; + return WotConversionOutput.Success(nodeSet); + } + + private static int ParseGeneration(ReadOnlySpan content) + { + try + { + var reader = new System.Text.Json.Utf8JsonReader(content); + while (reader.Read()) + { + if (reader.TokenType == System.Text.Json.JsonTokenType.PropertyName && + reader.GetString() == "gen" && + reader.Read()) + { + return reader.GetInt32(); + } + } + } + catch (System.Text.Json.JsonException) + { + // fall through + } + return 1; + } + } + + private async Task ReadValueAsync(NodeId nodeId, uint attributeId = Attributes.Value) + { + ArrayOf readIds = + [new ReadValueId { NodeId = nodeId, AttributeId = attributeId }]; + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ReadResponse response = await m_server.ReadAsync( + m_secureChannelContext, requestHeader, kMaxAge, + TimestampsToReturn.Neither, readIds, RequestLifetime.None).ConfigureAwait(false); + return response.Results[0]; + } + + private async Task BrowseAsync(NodeId nodeId) + { + var services = new ServerTestServices(m_server, m_secureChannelContext); + var template = new BrowseDescription + { + BrowseDirection = BrowseDirection.Forward, + ReferenceTypeId = UaReferenceTypeIds.HierarchicalReferences, + IncludeSubtypes = true, + NodeClassMask = 0, + ResultMask = (uint)BrowseResultMask.All + }; + ArrayOf nodesToBrowse = + ServerFixtureUtils.CreateBrowseDescriptionCollectionFromNodeId([nodeId], template); + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + return await services + .BrowseAsync(requestHeader, view: null, requestedMaxReferencesPerNode: 0, nodesToBrowse) + .ConfigureAwait(false); + } + + private async Task CreateSubscriptionWithMonitoredItemAsync( + ServerTestServices services, NodeId nodeId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateSubscriptionResponse subscriptionResponse = await services + .CreateSubscriptionAsync(requestHeader, 100, 100, 10, 0, true, 0).ConfigureAwait(false); + uint subscriptionId = subscriptionResponse.SubscriptionId; + + ArrayOf monitoredItems = + [ + new MonitoredItemCreateRequest + { + ItemToMonitor = new ReadValueId { NodeId = nodeId, AttributeId = Attributes.Value }, + MonitoringMode = MonitoringMode.Reporting, + RequestedParameters = new MonitoringParameters + { + ClientHandle = 1, SamplingInterval = 0, QueueSize = 1, DiscardOldest = true + } + } + ]; + requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + CreateMonitoredItemsResponse createItemsResponse = await services + .CreateMonitoredItemsAsync( + requestHeader, subscriptionId, TimestampsToReturn.Both, monitoredItems) + .ConfigureAwait(false); + Assert.That(createItemsResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + return subscriptionId; + } + + private async Task DeleteSubscriptionAsync(ServerTestServices services, uint subscriptionId) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + ArrayOf subscriptionIds = [subscriptionId]; + DeleteSubscriptionsResponse response = await services + .DeleteSubscriptionsAsync(requestHeader, subscriptionIds).ConfigureAwait(false); + Assert.That(response.Results[0], Is.EqualTo(StatusCodes.Good)); + } + + private async Task<(DataValue? Value, ArrayOf Acknowledgements)> + PublishForDataChangeAsync( + ServerTestServices services, uint subscriptionId, + ArrayOf acknowledgements, uint clientHandle) + { + const int MaxPublishAttempts = 20; + DataValue? value = null; + for (int attempt = 0; attempt < MaxPublishAttempts && value is null; attempt++) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + PublishResponse response = await services + .PublishAsync(requestHeader, acknowledgements, timeoutCts.Token).ConfigureAwait(false); + acknowledgements = response.AvailableSequenceNumbers.ToArrayOf( + sequenceNumber => new SubscriptionAcknowledgement + { + SubscriptionId = subscriptionId, + SequenceNumber = sequenceNumber + }); + if (response.NotificationMessage is { } message) + { + foreach (ExtensionObject notificationData in message.NotificationData) + { + if (notificationData.TryGetValue(out DataChangeNotification dcn)) + { + foreach (MonitoredItemNotification item in dcn.MonitoredItems) + { + if (item.ClientHandle == clientHandle) + { + value = item.Value; + } + } + } + } + } + } + Assert.That(value, Is.Not.Null, + $"No data-change notification for client handle {clientHandle} arrived."); + return (value, acknowledgements); + } + + private async Task<(bool Alive, ArrayOf Acknowledgements)> + PublishKeepAliveAsync( + ServerTestServices services, uint subscriptionId, + ArrayOf acknowledgements) + { + RequestHeader requestHeader = m_requestHeader; + requestHeader.Timestamp = DateTimeUtc.Now; + using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + PublishResponse response = await services + .PublishAsync(requestHeader, acknowledgements, timeoutCts.Token).ConfigureAwait(false); + Assert.That(response.SubscriptionId, Is.EqualTo(subscriptionId), + "The subscription and its monitored item must stay alive across the shadow reload."); + var acks = response.AvailableSequenceNumbers.ToArrayOf( + sequenceNumber => new SubscriptionAcknowledgement + { + SubscriptionId = subscriptionId, + SequenceNumber = sequenceNumber + }); + return (true, acks); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Samples/WotAggregationDocumentGenerator.cs b/tests/Opc.Ua.WotCon.Tests/Samples/WotAggregationDocumentGenerator.cs new file mode 100644 index 0000000000..82293b2b53 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Samples/WotAggregationDocumentGenerator.cs @@ -0,0 +1,247 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.IO; +using System.Text.Json; +using System.Text.Json.Nodes; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.WotCon.Tests.Samples +{ + /// + /// Recreates the checked-in WoT aggregation documents from their canonical + /// NodeSet2 sources. + /// + internal static class WotAggregationDocumentGenerator + { + public const string PumpInstanceNamespace = + "urn:opcfoundation.org:UA:WotAggregation:PumpInstance"; + + public static byte[] GenerateThingModel(string sourcePath, string title) + { + using WotDocument document = WotNodeSetConverter.FromNodeSet( + ReadNodeSet(sourcePath), + title); + return document.ToCanonicalUtf8(); + } + + public static byte[] GeneratePumpThingDescription(string sourcePath) + { + using WotDocument generated = WotNodeSetConverter.FromNodeSet( + ReadNodeSet(sourcePath), + "Sample Pump Aggregate"); + JsonObject root = JsonNode.Parse(generated.Utf8Json.Span)!.AsObject(); + root["properties"] = CreateProperties(); + + byte[] json = JsonSerializer.SerializeToUtf8Bytes(root); + using var document = WotDocument.Parse(json, CreateLargeDocumentOptions()); + return document.ToCanonicalUtf8(); + } + + public static WotNodeSetConverterOptions CreateLargeDocumentOptions() + { + return new WotNodeSetConverterOptions + { + MaxJsonDocumentSize = 64 * 1024 * 1024 + }; + } + + public static UANodeSet ReadNodeSet(string path) + { + using FileStream stream = File.OpenRead(path); + return UANodeSet.Read(stream) + ?? throw new InvalidOperationException($"Could not read '{path}'."); + } + + private static JsonObject CreateProperties() + { + var properties = new JsonObject(); + AddProperty( + properties, + "DifferentialPressure", + "number", + "Pa", + "0", + "1000000", + "SOURCE_A_ENDPOINT", + "Operational.Measurements.DifferentialPressure"); + AddProperty( + properties, + "FluidTemperature", + "number", + "K", + "233.15", + "473.15", + "SOURCE_A_ENDPOINT", + "Operational.Measurements.FluidTemperature"); + AddProperty( + properties, + "BearingTemperature", + "number", + "K", + "233.15", + "473.15", + "SOURCE_B_ENDPOINT", + "Operational.Measurements.BearingTemperature"); + AddProperty( + properties, + "PumpPowerInput", + "number", + "W", + "0", + "50000", + "SOURCE_B_ENDPOINT", + "Operational.Measurements.PumpPowerInput"); + AddProperty( + properties, + "MassFlow", + "number", + "kg/s", + "0", + "1", + "SOURCE_A_ENDPOINT", + "Operational.Measurements.MassFlow"); + AddProperty( + properties, + "PumpEfficiency", + "number", + "%", + "0", + "100", + "SOURCE_B_ENDPOINT", + "Operational.Measurements.PumpEfficiency"); + AddProperty( + properties, + "Level", + "number", + "m", + "0", + "10", + "SOURCE_A_ENDPOINT", + "Operational.Measurements.Level"); + AddProperty( + properties, + "NumberOfStarts", + "integer", + null, + "0", + "4294967295", + "SOURCE_B_ENDPOINT", + "Operational.Measurements.NumberOfStarts"); + AddProperty( + properties, + "Cavitation", + "boolean", + null, + null, + null, + "SOURCE_A_ENDPOINT", + "Events.SupervisionProcessFluid.Cavitation"); + AddProperty( + properties, + "MotorOverheat", + "boolean", + null, + null, + null, + "SOURCE_B_ENDPOINT", + "Events.SupervisionPumpOperation.MotorOverheat"); + return properties; + } + + private static void AddProperty( + JsonObject properties, + string name, + string type, + string? unit, + string? minimum, + string? maximum, + string source, + string path) + { + string sourceNamespace = source == "SOURCE_A_ENDPOINT" + ? "urn:opcfoundation.org:UA:WotAggregation:SourceA" + : "urn:opcfoundation.org:UA:WotAggregation:SourceB"; + var property = new JsonObject + { + ["@type"] = "uav:variable", + ["forms"] = new JsonArray + { + new JsonObject + { + ["href"] = "${" + source + "}", + ["op"] = new JsonArray("readproperty", "observeproperty"), + ["uav:id"] = $"nsu={sourceNamespace};s=Pump1.{path}" + } + }, + ["observable"] = true, + ["readOnly"] = true, + ["title"] = name, + ["type"] = type, + ["uav:mapToNodeId"] = $"nsu={PumpInstanceNamespace};s=Pump1.{path}" + }; + + if (unit is not null) + { + property["unit"] = unit; + } + if (minimum is not null) + { + property["minimum"] = ParseNumber(minimum); + } + if (maximum is not null) + { + property["maximum"] = ParseNumber(maximum); + } + + properties[name] = property; + } + + /// + /// Materializes a JSON number from its canonical text. The bounds are + /// expressed as text rather than as because + /// System.Text.Json does not format doubles identically on every + /// target framework: .NET Framework has no shortest-round-trippable + /// double formatting and falls back to G17, which would render + /// 473.15 as 473.14999999999998 and make the regenerated + /// document differ from the checked-in canonical bytes. A node parsed + /// from text keeps its raw representation and therefore serializes + /// identically everywhere. + /// + private static JsonNode ParseNumber(string canonicalJsonNumber) + { + return JsonNode.Parse(canonicalJsonNumber) + ?? throw new InvalidOperationException( + $"'{canonicalJsonNumber}' is not a JSON number."); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/Samples/WotAggregationDocumentTests.cs b/tests/Opc.Ua.WotCon.Tests/Samples/WotAggregationDocumentTests.cs new file mode 100644 index 0000000000..198eb7633e --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Samples/WotAggregationDocumentTests.cs @@ -0,0 +1,548 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Json; +using System.Xml.Linq; +using NUnit.Framework; +using Opc.Ua.Export; +using Opc.Ua.Wot; +using Opc.Ua.WotCon.Bindings; +using Opc.Ua.WotCon.Bindings.Planners; + +namespace Opc.Ua.WotCon.Tests.Samples +{ + /// + /// Verifies the deterministic sample documents that will be shared by the + /// WoT aggregation client and end-to-end tests. + /// + [TestFixture] + [Category("WotCon")] + [Category("Samples")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + public sealed class WotAggregationDocumentTests + { + private const string DiNamespace = "http://opcfoundation.org/UA/DI/"; + private const string MachineryNamespace = "http://opcfoundation.org/UA/Machinery/"; + private const string PumpsNamespace = "http://opcfoundation.org/UA/Pumps/"; + + [Test] + public void ThingModelsMatchCanonicalConverterRegeneration() + { + foreach (ModelDocument document in s_modelDocuments) + { + byte[] regenerated = WotAggregationDocumentGenerator.GenerateThingModel( + RepositoryPath(document.SourcePath), + document.Title); + byte[] checkedIn = File.ReadAllBytes(DocumentPath(document.FileName)); + + Assert.That( + regenerated, + Is.EqualTo(checkedIn), + $"{document.FileName} is not the canonical converter output."); + } + } + + [Test] + public void PumpThingDescriptionMatchesCanonicalRegeneration() + { + byte[] regenerated = WotAggregationDocumentGenerator.GeneratePumpThingDescription( + DocumentPath("SamplePump.NodeSet2.xml")); + byte[] checkedIn = File.ReadAllBytes(DocumentPath("SamplePump.td.json")); + + Assert.That(regenerated, Is.EqualTo(checkedIn)); + } + + [Test] + public void CheckedInJsonDocumentsUseCanonicalSerialization() + { + IEnumerable paths = s_modelDocuments + .Select(document => DocumentPath(document.FileName)) + .Append(DocumentPath("SamplePump.td.json")) + .Append(DocumentPath("documents.json")) + .Append(StructuredExamplePath); + + foreach (string path in paths) + { + byte[] bytes = File.ReadAllBytes(path); + using var document = WotDocument.Parse( + bytes, + WotAggregationDocumentGenerator.CreateLargeDocumentOptions()); + Assert.That( + document.ToCanonicalUtf8(), + Is.EqualTo(bytes), + $"{path} is not canonical JSON."); + } + } + + [Test] + public void ManifestOrdersDependenciesBeforeDependents() + { + using var manifest = JsonDocument.Parse( + File.ReadAllBytes(DocumentPath("documents.json"))); + JsonElement.ArrayEnumerator documents = manifest.RootElement.EnumerateArray(); + var seen = new HashSet(StringComparer.Ordinal); + var kinds = new List(); + + foreach (JsonElement document in documents) + { + string resourceId = document.GetProperty("resourceId").GetString()!; + foreach (JsonElement dependency in document.GetProperty("dependsOn").EnumerateArray()) + { + Assert.That(seen, Does.Contain(dependency.GetString())); + } + seen.Add(resourceId); + kinds.Add(document.GetProperty("documentKind").GetString()!); + } + + Assert.That( + kinds, + Is.EqualTo(s_expectedDocumentKinds)); + } + + [Test] + public void ModelDocumentsOwnTheirDeclaredNamespaces() + { + foreach (ModelDocument document in s_modelDocuments) + { + byte[] bytes = File.ReadAllBytes(DocumentPath(document.FileName)); + UANodeSet nodeSet = WotNodeSetConverter.ToNodeSet( + bytes, + WotAggregationDocumentGenerator.CreateLargeDocumentOptions()); + + Assert.That(nodeSet.Models, Is.Not.Null.And.Not.Empty); + Assert.That(nodeSet.Models![0].ModelUri, Is.EqualTo(document.ModelUri)); + Assert.That(nodeSet.NamespaceUris, Is.Not.Null.And.Not.Empty); + Assert.That(nodeSet.NamespaceUris![0], Is.EqualTo(document.ModelUri)); + Assert.That( + nodeSet.Items!.Where(node => node.NodeId!.StartsWith("ns=1;", StringComparison.Ordinal)), + Is.Not.Empty); + } + } + + [Test] + public void CompanionAndPumpNodeSetsRoundTripWithoutChange() + { + IEnumerable sources = s_modelDocuments + .Select(document => RepositoryPath(document.SourcePath)) + .Append(DocumentPath("SamplePump.NodeSet2.xml")); + + foreach (string source in sources) + { + NodeSetRoundtripReport report = NodeSetComparer.Roundtrip( + WotAggregationDocumentGenerator.ReadNodeSet(source)); + + Assert.That(report.NativeProjectionPreserved, Is.True, source); + Assert.That(report.Comparison.AreEquivalent, Is.True, source); + Assert.That( + report.Diagnostics.Any( + diagnostic => diagnostic.Severity == WotDiagnosticSeverity.Error), + Is.False, + source); + } + } + + [Test] + public void PumpNodeSetHasRequiredModelDependenciesAndTypeDefinition() + { + UANodeSet nodeSet = ReadPumpNodeSet(); + ModelTableEntry model = nodeSet.Models!.Single(); + string[] requiredModels = [.. model.RequiredModel!.Select(required => required.ModelUri!)]; + UAObject pump = FindNode(nodeSet, "ns=1;s=Pump1"); + + Assert.That(model.ModelUri, Is.EqualTo(WotAggregationDocumentGenerator.PumpInstanceNamespace)); + Assert.That( + requiredModels, + Does.Contain(DiNamespace) + .And.Contain(MachineryNamespace) + .And.Contain(PumpsNamespace)); + Assert.That(TypeDefinition(pump), Is.EqualTo("ns=2;i=1052")); + } + + [Test] + public void PumpNodeSetHasStableRequiredHierarchy() + { + UANodeSet nodeSet = ReadPumpNodeSet(); + + foreach ((string nodeId, string browseName, string typeDefinition) in s_pumpNodes) + { + UANode node = FindNode(nodeSet, nodeId); + Assert.That(LocalName(node.BrowseName), Is.EqualTo(browseName), nodeId); + Assert.That(TypeDefinition(node), Is.EqualTo(typeDefinition), nodeId); + } + + AssertChildPath( + nodeSet, + "ns=1;s=Pump1", + "Operational", + "Measurements", + "DifferentialPressure"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "FluidTemperature"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "BearingTemperature"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "PumpPowerInput"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "MassFlow"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "PumpEfficiency"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "Level"); + AssertChildPath(nodeSet, "ns=1;s=Pump1", "Operational", "Measurements", "NumberOfStarts"); + AssertChildPath( + nodeSet, + "ns=1;s=Pump1", + "Events", + "SupervisionProcessFluid", + "Cavitation"); + AssertChildPath( + nodeSet, + "ns=1;s=Pump1", + "Events", + "SupervisionPumpOperation", + "MotorOverheat"); + } + + [Test] + public void PumpNodeSetUsesQualifiedParentNodeIds() + { + var document = XDocument.Load(DocumentPath("SamplePump.NodeSet2.xml")); + foreach (XElement element in document.Descendants()) + { + XAttribute? parentNodeId = element.Attribute("ParentNodeId"); + if (parentNodeId is not null) + { + Assert.That( + NodeId.TryParse(parentNodeId.Value, out _), + Is.True, + parentNodeId.Value); + } + } + } + + [Test] + public void PumpAnalogMeasurementsCarryEngineeringUnitMetadata() + { + var document = XDocument.Load(DocumentPath("SamplePump.NodeSet2.xml")); + XNamespace nodeSetNamespace = "http://opcfoundation.org/UA/2011/03/UANodeSet.xsd"; + XNamespace typesNamespace = "http://opcfoundation.org/UA/2008/02/Types.xsd"; + + foreach ((string name, string unit) in s_engineeringUnits) + { + string nodeId = $"ns=1;s=Pump1.Operational.Measurements.{name}"; + XElement variable = document + .Descendants(nodeSetNamespace + "UAVariable") + .Single(element => (string?)element.Attribute("NodeId") == nodeId); + string[] references = [.. variable + .Descendants(nodeSetNamespace + "Reference") + .Where(reference => (string?)reference.Attribute("ReferenceType") == "HasProperty") + .Select(reference => reference.Value)]; + XElement engineeringUnits = document + .Descendants(nodeSetNamespace + "UAVariable") + .Single(element => (string?)element.Attribute("NodeId") == $"{nodeId}.EngineeringUnits"); + XElement euRange = document + .Descendants(nodeSetNamespace + "UAVariable") + .Single(element => (string?)element.Attribute("NodeId") == $"{nodeId}.EURange"); + + Assert.That(references, Does.Contain($"{nodeId}.EngineeringUnits")); + Assert.That(references, Does.Contain($"{nodeId}.EURange")); + Assert.That( + engineeringUnits.Descendants(typesNamespace + "DisplayName") + .Single() + .Element(typesNamespace + "Text")! + .Value, + Is.EqualTo(unit)); + Assert.That(euRange.Descendants(typesNamespace + "Range"), Has.Exactly(1).Items); + } + } + + [Test] + public void PumpMappingsUseBothEndpointPlaceholdersAndPortableOpcUaForms() + { + byte[] bytes = File.ReadAllBytes(DocumentPath("SamplePump.td.json")); + string text = Encoding.UTF8.GetString(bytes); + using var document = JsonDocument.Parse(bytes); + JsonElement properties = document.RootElement.GetProperty("properties"); + var placeholders = new HashSet(StringComparer.Ordinal); + + foreach (JsonProperty property in properties.EnumerateObject()) + { + JsonElement affordance = property.Value; + string target = affordance.GetProperty("uav:mapToNodeId").GetString()!; + JsonElement form = affordance.GetProperty("forms")[0]; + string href = form.GetProperty("href").GetString()!; + string sourceNodeId = form.GetProperty("uav:id").GetString()!; + + placeholders.Add(href); + Assert.That( + target, + Does.StartWith($"nsu={WotAggregationDocumentGenerator.PumpInstanceNamespace};s=Pump1.")); + Assert.That(sourceNodeId, Does.StartWith("nsu=urn:opcfoundation.org:UA:WotAggregation:Source")); + } + + Assert.That( + placeholders, + Is.EquivalentTo(s_endpointPlaceholders)); + Assert.That(text.Replace("${SOURCE_A_ENDPOINT}", string.Empty, StringComparison.Ordinal) + .Replace("${SOURCE_B_ENDPOINT}", string.Empty, StringComparison.Ordinal), Does.Not.Contain("${")); + } + + [Test] + public void PumpMappingsCompileAfterEndpointSubstitution() + { + string document = File.ReadAllText(DocumentPath("SamplePump.td.json")) + .Replace("${SOURCE_A_ENDPOINT}", "opc.tcp://source-a:4840", StringComparison.Ordinal) + .Replace("${SOURCE_B_ENDPOINT}", "opc.tcp://source-b:4840", StringComparison.Ordinal); + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "sample-pump", + WoTDocumentKindEnum.ThingDescription, + Encoding.UTF8.GetBytes(document))); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms, Is.Not.Empty); + Assert.That(plan.CompiledForms.All(form => !form.TargetMapping.IsEmpty), Is.True); + } + + [Test] + public void StructuredMappingExampleIsDedicatedAndCompilesAfterEndpointSubstitution() + { + string document = File.ReadAllText(StructuredExamplePath) + .Replace("${SOURCE_A_ENDPOINT}", "opc.tcp://source-a:4840", StringComparison.Ordinal); + var registry = new WotProtocolBinderRegistry(WotBuiltInBinders.CreateAll()); + WotBindingPlan plan = registry.Prepare(WotBindingPlanRequest.FromDocument( + "structured-pump-example", + WoTDocumentKindEnum.ThingDescription, + Encoding.UTF8.GetBytes(document))); + + Assert.That(plan.FullySupported, Is.True); + Assert.That(plan.CompiledForms, Has.Length.EqualTo(1)); + Assert.That( + plan.CompiledForms[0].TargetMapping.TargetTypeNodeId, + Is.EqualTo( + "nsu=urn:opcfoundation.org:UA:WotAggregation:StructuredExample;i=3001")); + Assert.That( + plan.CompiledForms[0].TargetMapping.FieldPath, + Is.EqualTo("Process/DifferentialPressure")); + } + + private static string RepositoryRoot + { + get + { + DirectoryInfo? directory = new(TestContext.CurrentContext.TestDirectory); + while (directory is not null && + !File.Exists(Path.Combine(directory.FullName, "UA.slnx"))) + { + directory = directory.Parent; + } + return directory?.FullName + ?? throw new DirectoryNotFoundException("Could not locate the repository root."); + } + } + + private static string StructuredExamplePath => RepositoryPath( + "tests", + "Opc.Ua.WotCon.Tests", + "Resources", + "WotAggregation", + "StructuredPumpMappingExample.td.json"); + + private static UANodeSet ReadPumpNodeSet() + { + return WotAggregationDocumentGenerator.ReadNodeSet( + DocumentPath("SamplePump.NodeSet2.xml")); + } + + private static T FindNode(UANodeSet nodeSet, string nodeId) + where T : UANode + { + return nodeSet.Items! + .OfType() + .Single(node => string.Equals(node.NodeId, nodeId, StringComparison.Ordinal)); + } + + private static string TypeDefinition(UANode node) + { + return node.References! + .Single(reference => + reference.IsForward && + string.Equals(reference.ReferenceType, "HasTypeDefinition", StringComparison.Ordinal)) + .Value!; + } + + private static void AssertChildPath( + UANodeSet nodeSet, + string rootNodeId, + params string[] browsePath) + { + UANode current = FindNode(nodeSet, rootNodeId); + foreach (string segment in browsePath) + { + string childNodeId = current.References! + .Where(reference => + reference.IsForward && + string.Equals(reference.ReferenceType, "HasComponent", StringComparison.Ordinal)) + .Select(reference => reference.Value!) + .Single(nodeId => LocalName(FindNode(nodeSet, nodeId).BrowseName) == segment); + current = FindNode(nodeSet, childNodeId); + } + } + + private static string LocalName(string? browseName) + { + int separator = browseName?.IndexOf(':', StringComparison.Ordinal) ?? -1; + return separator < 0 ? browseName ?? string.Empty : browseName![(separator + 1)..]; + } + + private static string DocumentPath(string fileName) + { + return RepositoryPath("samples", "WotCon", "AggregationClient", "Documents", fileName); + } + + private static string RepositoryPath(params string[] segments) + { + string path = RepositoryRoot; + foreach (string segment in segments) + { + path = Path.Combine(path, segment); + } + return path; + } + + private sealed record ModelDocument( + string FileName, + string SourcePath, + string Title, + string ModelUri); + + private static readonly ModelDocument[] s_modelDocuments = + [ + new( + "Opc.Ua.Di.tm.json", + Path.Combine( + "tests", + "Opc.Ua.SourceGeneration.Core.Tests", + "Resources", + "Opc.Ua.Di.NodeSet2.xml"), + "OPC UA Device Integration", + DiNamespace), + new( + "Opc.Ua.Machinery.tm.json", + Path.Combine( + "samples", + "PumpDeviceIntegrationServer", + "Model", + "Opc.Ua.Machinery.NodeSet2.xml"), + "OPC UA Machinery", + MachineryNamespace), + new( + "Opc.Ua.Pumps.tm.json", + Path.Combine( + "samples", + "PumpDeviceIntegrationServer", + "Model", + "Opc.Ua.Pumps.NodeSet2.xml"), + "OPC UA Pumps", + PumpsNamespace) + ]; + + private static readonly (string NodeId, string BrowseName, string TypeDefinition)[] s_pumpNodes = + [ + ("ns=1;s=Pump1", "Pump #1", "ns=2;i=1052"), + ("ns=1;s=Pump1.Identification", "Identification", "ns=4;i=1005"), + ("ns=1;s=Pump1.Operational", "Operational", "ns=2;i=1053"), + ("ns=1;s=Pump1.Operational.Measurements", "Measurements", "ns=2;i=1054"), + ( + "ns=1;s=Pump1.Operational.Measurements.DifferentialPressure", + "DifferentialPressure", + "i=15318"), + ( + "ns=1;s=Pump1.Operational.Measurements.FluidTemperature", + "FluidTemperature", + "i=15318"), + ( + "ns=1;s=Pump1.Operational.Measurements.BearingTemperature", + "BearingTemperature", + "i=15318"), + ( + "ns=1;s=Pump1.Operational.Measurements.PumpPowerInput", + "PumpPowerInput", + "i=15318"), + ("ns=1;s=Pump1.Operational.Measurements.MassFlow", "MassFlow", "i=15318"), + ("ns=1;s=Pump1.Operational.Measurements.PumpEfficiency", "PumpEfficiency", "i=15318"), + ("ns=1;s=Pump1.Operational.Measurements.Level", "Level", "i=15318"), + ("ns=1;s=Pump1.Operational.Measurements.NumberOfStarts", "NumberOfStarts", "i=15318"), + ("ns=1;s=Pump1.Events", "Events", "ns=2;i=1019"), + ( + "ns=1;s=Pump1.Events.SupervisionProcessFluid", + "SupervisionProcessFluid", + "ns=2;i=1015"), + ( + "ns=1;s=Pump1.Events.SupervisionProcessFluid.Cavitation", + "Cavitation", + "i=2373"), + ( + "ns=1;s=Pump1.Events.SupervisionPumpOperation", + "SupervisionPumpOperation", + "ns=2;i=1016"), + ( + "ns=1;s=Pump1.Events.SupervisionPumpOperation.MotorOverheat", + "MotorOverheat", + "i=2373"), + ("ns=1;s=Pump1.Maintenance", "Maintenance", "ns=2;i=1011") + ]; + + private static readonly (string Name, string Unit)[] s_engineeringUnits = + [ + ("DifferentialPressure", "Pa"), + ("FluidTemperature", "K"), + ("BearingTemperature", "K"), + ("PumpPowerInput", "W"), + ("MassFlow", "kg/s"), + ("PumpEfficiency", "%"), + ("Level", "m") + ]; + + private static readonly string[] s_expectedDocumentKinds = + [ + "ThingModel", + "ThingModel", + "ThingModel", + "ThingDescription" + ]; + + private static readonly string[] s_endpointPlaceholders = + [ + "${SOURCE_A_ENDPOINT}", + "${SOURCE_B_ENDPOINT}" + ]; + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/SimulatedWotAssetProviderTests.cs b/tests/Opc.Ua.WotCon.Tests/SimulatedWotAssetProviderTests.cs index 592eec7ac9..6c6191d682 100644 --- a/tests/Opc.Ua.WotCon.Tests/SimulatedWotAssetProviderTests.cs +++ b/tests/Opc.Ua.WotCon.Tests/SimulatedWotAssetProviderTests.cs @@ -60,7 +60,7 @@ public void SetUp() m_voltageTag = new WotPropertyTag( "Voltage", new NodeId(1u, 2), - DataTypeIds.Double, + Ua.DataTypeIds.Double, ValueRanks.Scalar, readOnly: false, observable: true, @@ -137,8 +137,8 @@ public async Task InvokeActionEchoesInputsToOutputs() var actionTag = new WotActionTag( "Echo", new NodeId(2u, 2), - [new Argument { Name = "in1", DataType = DataTypeIds.Int64 }], - [new Argument { Name = "out1", DataType = DataTypeIds.Int64 }], + [new Argument { Name = "in1", DataType = Ua.DataTypeIds.Int64 }], + [new Argument { Name = "out1", DataType = Ua.DataTypeIds.Int64 }], form: null); var outputs = new Variant[1]; diff --git a/tests/Opc.Ua.WotCon.Tests/Support/MemoryWotBinding.cs b/tests/Opc.Ua.WotCon.Tests/Support/MemoryWotBinding.cs new file mode 100644 index 0000000000..8eb81a6de7 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/Support/MemoryWotBinding.cs @@ -0,0 +1,250 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; +using Opc.Ua.WotCon.Bindings; + +namespace Opc.Ua.WotCon.Tests.Support +{ + /// + /// A worked sample showing how a third party contributes a replaceable + /// protocol binder as pure code-behind. The fictitious mem protocol + /// binds property affordances to an in-process key/value store, demonstrating + /// the full extension surface: identity, capability, deterministic + /// identification, a planner and an executor with a live channel. Register it + /// with builder.AddWotBinder(new MemoryWotBinder()) and + /// builder.AddWotBindingExecutor(new MemoryWotBindingExecutor(store)). + /// + public sealed class MemoryWotBinder : WotProtocolBinderBase + { + /// + /// The sample binding vocabulary URI. + /// + public const string BindingUri = "urn:example:wot:mem"; + + private static readonly string[] s_schemes = ["mem"]; + + /// + public override WotBindingIdentity Identity { get; } = + new WotBindingIdentity("example.mem", "1.0", BindingUri, "Sample In-Memory Binding"); + + /// + public override WotBindingCapability Capability { get; } = new WotBindingCapability( + BindingUri, + "Sample In-Memory Binding", + new WotBindingSource("urn:example:wot:mem", "1.0", WotBindingMaturity.UnofficialDraft, + note: "A sample custom binding for documentation and tests."), + [ + WoTBindingCapabilityEnum.ReadProperty, + WoTBindingCapabilityEnum.WriteProperty, + WoTBindingCapabilityEnum.ObserveProperty + ], + ["application/json", "text/plain"], + isExecutable: true); + + /// + protected override IReadOnlyCollection Schemes => s_schemes; + + /// + public override WotBindingMatch Match(WotAffordanceForm form, WotBindingSelectionContext context) + { + return MatchStandard(form, context, "memv:"); + } + + /// + public override WotBindingCompilation Compile(WotAffordanceForm form, WotBindingPlanContext context) + { + var diagnostics = new List(); + if (!RequireHref(form, context, diagnostics, out string href) || + !TryParseUri(href, out Uri uri) || + !string.Equals(uri.Scheme, "mem", StringComparison.OrdinalIgnoreCase)) + { + diagnostics.Add(WotBindingDiagnostic.Error( + WotBindingDiagnosticCode.InvalidHref, + "The href is not a valid mem:// URI.", form.Pointer("href"))); + return WotBindingCompilation.Unsupported([.. diagnostics]); + } + + string key = uri.AbsolutePath.Trim('/'); + ResolveCodec(form, context, out WotPayloadDescriptor payload); + WotEndpointDescriptor endpoint = MakeEndpoint(uri); + var addressing = new WotAddressingDescriptor(key); + + ImmutableArray.Builder entries = ImmutableArray.CreateBuilder(); + foreach ((string op, WoTBindingCapabilityEnum capability) in ResolveOperations(form, diagnostics)) + { + var operation = new WotOperationDescriptor(capability, op, capability.ToString()); + entries.Add(new WotCompiledForm( + Identity, form.Kind, form.AffordanceName, form.JsonPointer, capability, op, + endpoint, addressing, operation, payload, + [], Capability.IsExecutable)); + } + + return entries.Count == 0 + ? WotBindingCompilation.Unsupported([.. diagnostics]) + : WotBindingCompilation.Supported(entries.ToImmutable(), [.. diagnostics]); + } + } + + /// + /// The in-process key/value store the sample binding reads and writes. + /// + public sealed class MemoryWotStore + { + /// + /// Gets the value stored under a key. + /// + public DataValue Get(string key) + { + return m_values.TryGetValue(key, out DataValue value) ? value : new DataValue(Variant.Null); + } + + /// + /// Sets the value stored under a key. + /// + public void Set(string key, DataValue value) + { + m_values[key] = value; + } + + private readonly ConcurrentDictionary m_values = + new(StringComparer.Ordinal); + } + + /// + /// The executor for the sample in-memory binding. + /// + public sealed class MemoryWotBindingExecutor : IWotBindingExecutor + { + /// + /// Initializes a new sample executor over the supplied store. + /// + public MemoryWotBindingExecutor(MemoryWotStore store) + { + m_store = store ?? throw new ArgumentNullException(nameof(store)); + } + + /// + public WotBindingIdentity Identity { get; } = + new WotBindingIdentity("example.mem", "1.0", MemoryWotBinder.BindingUri, "Sample In-Memory Executor"); + + /// + public bool CanExecute(WotCompiledForm form) + { + return form is not null && string.Equals(form.Binding.Id, Identity.Id, StringComparison.Ordinal); + } + + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "The channel is owned by the caller, who disposes it via DisposeAsync.")] + public ValueTask ActivateAsync( + WotCompiledForm form, WotExecutorContext context, CancellationToken cancellationToken = default) + { + if (form is null) + { + throw new ArgumentNullException(nameof(form)); + } + IWotBindingChannel channel = new MemoryWotBindingChannel(m_store, form); + return new ValueTask(channel); + } + + private readonly MemoryWotStore m_store; + } + + /// + /// The live channel for the sample in-memory binding. + /// + internal sealed class MemoryWotBindingChannel : IWotBindingChannel + { + public MemoryWotBindingChannel(MemoryWotStore store, WotCompiledForm form) + { + m_store = store; + Form = form; + m_key = form.Addressing.Target; + } + + public WotCompiledForm Form { get; } + + public ValueTask ReadAsync(CancellationToken cancellationToken = default) + { + return new ValueTask(new WotReadResult(StatusCodes.Good, m_store.Get(m_key))); + } + + public ValueTask WriteAsync(DataValue value, CancellationToken cancellationToken = default) + { + m_store.Set(m_key, value); + return new ValueTask(new WotWriteResult(StatusCodes.Good)); + } + + public ValueTask InvokeAsync( + IReadOnlyList inputs, CancellationToken cancellationToken = default) + { + return new ValueTask(new WotInvokeResult( + StatusCodes.BadNotSupported, null, "The sample binding has no actions.")); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage( + "Reliability", "CA2000:Dispose objects before losing scope", + Justification = "Ownership of the subscription is transferred to the caller, who disposes it.")] + public ValueTask ObserveAsync( + Action onNotification, CancellationToken cancellationToken = default) + { + if (onNotification is null) + { + throw new ArgumentNullException(nameof(onNotification)); + } + var subscription = new PollingWotSubscription(Form, token => + { + onNotification(new WotNotification(m_store.Get(m_key))); + return new ValueTask(true); + }, TimeSpan.FromMilliseconds(200)); + return new ValueTask(subscription); + } + + public ValueTask SubscribeEventAsync( + Action onEvent, CancellationToken cancellationToken = default) + { + return ObserveAsync(onEvent, cancellationToken); + } + + public ValueTask DisposeAsync() + { + return default; + } + + private readonly MemoryWotStore m_store; + private readonly string m_key; + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/TestMaterialization.cs b/tests/Opc.Ua.WotCon.Tests/TestMaterialization.cs new file mode 100644 index 0000000000..5fdf57c6f9 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/TestMaterialization.cs @@ -0,0 +1,99 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System.Text; + +namespace Opc.Ua.WotCon.Tests +{ + /// + /// Shared builders for WoT test documents (Thing Descriptions / Thing + /// Models) used across the registry and materialization test fixtures. + /// + internal static class TestMaterialization + { + /// + /// Builds a minimal Thing Description document. + /// + public static byte[] Td(string id, string variant = "1", params string[] extendsHrefs) + { + var builder = new StringBuilder(); + builder.Append("{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",") + .Append("\"@type\":\"uav:object\",") + .Append("\"id\":\"").Append(id).Append("\",") + .Append("\"title\":\"").Append(id).Append('-').Append(variant).Append("\",") + .Append("\"properties\":{\"value\":{\"type\":\"number\",\"forms\":[{\"href\":\"x\"}]}}"); + AppendLinks(builder, extendsHrefs); + builder.Append('}'); + return Encoding.UTF8.GetBytes(builder.ToString()); + } + + /// + /// Builds a minimal Thing Model document. + /// + public static byte[] Tm(string id, string variant = "1", params string[] extendsHrefs) + { + var builder = new StringBuilder(); + builder.Append("{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\",") + .Append("\"@type\":\"tm:ThingModel\",") + .Append("\"id\":\"").Append(id).Append("\",") + .Append("\"title\":\"").Append(id).Append('-').Append(variant).Append("\",") + .Append("\"properties\":{\"value\":{\"type\":\"number\",\"forms\":[{\"href\":\"x\"}]}}"); + AppendLinks(builder, extendsHrefs); + builder.Append('}'); + return Encoding.UTF8.GetBytes(builder.ToString()); + } + + /// + /// Builds a syntactically invalid JSON document. + /// + public static byte[] InvalidJson() + { + return Encoding.UTF8.GetBytes("{ not valid json "); + } + + private static void AppendLinks(StringBuilder builder, string[] extendsHrefs) + { + if (extendsHrefs is not { Length: > 0 }) + { + return; + } + builder.Append(",\"links\":["); + for (int i = 0; i < extendsHrefs.Length; i++) + { + if (i > 0) + { + builder.Append(','); + } + builder.Append("{\"rel\":\"tm:extends\",\"href\":\"") + .Append(extendsHrefs[i]).Append("\"}"); + } + builder.Append(']'); + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/WotActionMapperTests.cs b/tests/Opc.Ua.WotCon.Tests/WotActionMapperTests.cs index ec4ee85689..f965238647 100644 --- a/tests/Opc.Ua.WotCon.Tests/WotActionMapperTests.cs +++ b/tests/Opc.Ua.WotCon.Tests/WotActionMapperTests.cs @@ -61,7 +61,7 @@ public void BuildArgumentsForFlatObjectMapsEachPropertyToOneArgument() Assert.That(arguments, Has.Count.EqualTo(2)); Assert.That(arguments[0].Name, Is.EqualTo("target")); - Assert.That(arguments[0].DataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(arguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(arguments[0].ValueRank, Is.EqualTo(ValueRanks.Scalar)); // Rec 4: assert the full description text so format / framing mutations // (square brackets, separator spaces, "min=, max=" comma) are caught. @@ -69,7 +69,7 @@ public void BuildArgumentsForFlatObjectMapsEachPropertyToOneArgument() arguments[0].Description.Text, Is.EqualTo("Target temperature [degree Celsius] (min=10, max=30)")); Assert.That(arguments[1].Name, Is.EqualTo("confirm")); - Assert.That(arguments[1].DataType, Is.EqualTo(DataTypeIds.Boolean)); + Assert.That(arguments[1].DataType, Is.EqualTo(Ua.DataTypeIds.Boolean)); Assert.That(arguments[1].ValueRank, Is.EqualTo(ValueRanks.Scalar)); Assert.That(arguments[1].Description.IsNull, Is.True, "Members without description/unit/bounds should have a null LocalizedText."); @@ -181,7 +181,7 @@ public void BuildArgumentsForNonObjectSchemaCollapsesToBaseDataType() IReadOnlyList arguments = WotActionMapper.BuildArguments(schema); Assert.That(arguments, Has.Count.EqualTo(1)); - Assert.That(arguments[0].DataType, Is.EqualTo(DataTypeIds.BaseDataType)); + Assert.That(arguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.BaseDataType)); Assert.That(arguments[0].Name, Is.EqualTo("rawString")); Assert.That(arguments[0].Description.Text, Is.EqualTo("raw payload")); } @@ -223,7 +223,7 @@ public void BuildArgumentsForEmptyPropertiesDictionaryCollapsesToBaseDataType() IReadOnlyList arguments = WotActionMapper.BuildArguments(schema); Assert.That(arguments, Has.Count.EqualTo(1)); - Assert.That(arguments[0].DataType, Is.EqualTo(DataTypeIds.BaseDataType)); + Assert.That(arguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.BaseDataType)); Assert.That(arguments[0].ValueRank, Is.EqualTo(ValueRanks.Scalar)); Assert.That(arguments[0].Name, Is.EqualTo("empty")); } @@ -261,7 +261,7 @@ public void BuildArgumentsForArrayMemberMarksOneDimensional() IReadOnlyList arguments = WotActionMapper.BuildArguments(schema); Assert.That(arguments, Has.Count.EqualTo(1)); - Assert.That(arguments[0].DataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(arguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(arguments[0].ValueRank, Is.EqualTo(ValueRanks.OneDimension)); } @@ -288,7 +288,7 @@ public void BuildArgumentsForArrayOfObjectMemberFallsBackToBaseDataType() IReadOnlyList arguments = WotActionMapper.BuildArguments(schema); Assert.That(arguments, Has.Count.EqualTo(1)); - Assert.That(arguments[0].DataType, Is.EqualTo(DataTypeIds.BaseDataType)); + Assert.That(arguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.BaseDataType)); Assert.That(arguments[0].ValueRank, Is.EqualTo(ValueRanks.OneDimension)); } @@ -310,7 +310,7 @@ public void BuildArgumentsForArrayMemberWithoutItemsFallsBackToBaseDataType() IReadOnlyList arguments = WotActionMapper.BuildArguments(schema); Assert.That(arguments, Has.Count.EqualTo(1)); - Assert.That(arguments[0].DataType, Is.EqualTo(DataTypeIds.BaseDataType)); + Assert.That(arguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.BaseDataType)); Assert.That(arguments[0].ValueRank, Is.EqualTo(ValueRanks.OneDimension)); } } diff --git a/tests/Opc.Ua.WotCon.Tests/WotConnectivityNodeManagerTests.cs b/tests/Opc.Ua.WotCon.Tests/WotConnectivityNodeManagerTests.cs index a110faca2c..5310106ffa 100644 --- a/tests/Opc.Ua.WotCon.Tests/WotConnectivityNodeManagerTests.cs +++ b/tests/Opc.Ua.WotCon.Tests/WotConnectivityNodeManagerTests.cs @@ -313,7 +313,7 @@ public async Task RebuildMaterialisesPropertyVariableAndAssetEndpoint() Assert.That(entry.Properties, Has.Count.EqualTo(1)); (BaseDataVariableState variable, WotPropertyTag tag) = entry.Properties.Values.First(); Assert.That(tag.Name, Is.EqualTo("Voltage")); - Assert.That(variable.DataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(variable.DataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(variable.ValueRank, Is.EqualTo(ValueRanks.Scalar)); Assert.That(variable.BrowseName.Name, Is.EqualTo("Voltage")); Assert.That(variable.DisplayName.Text, Is.EqualTo("Voltage")); @@ -387,6 +387,49 @@ await harness.Registry.RebuildAsync( Assert.That(result.Value.AsBoxedObject(), Is.EqualTo(12.3)); } + [Test] + public async Task LegacyAssetIsMirroredIntoV2RegistryWithoutDivergence() + { + using var harness = new ManagerHarness( + _tempFolder, new SimulatedWotAssetProviderFactory()); + using var registry = new Opc.Ua.WotCon.Server.Registry.WotRegistryService(); + harness.Options.RegistryBridge = registry; + await harness.StartAsync().ConfigureAwait(false); + + (_, NodeId assetId) = await harness.Registry + .CreateAssetAsync("asset-001", CancellationToken.None).ConfigureAwait(false); + AssetEntry entry = harness.Registry.FindByNodeId(assetId)!; + var td = new ThingDescription + { + Name = "asset-001", + Base = "sim://opcua.test/wot/asset-001", + Properties = new Dictionary + { + ["Voltage"] = new WotProperty { Type = "number" } + } + }; + await harness.Registry.RebuildAsync( + entry, td, persistOnSuccess: false, CancellationToken.None).ConfigureAwait(false); + + Opc.Ua.WotCon.Server.Registry.WotResource? resource = registry.Current.FindResource( + Opc.Ua.WotCon.Server.Registry.WotRegistryGroups.ThingDescriptions, "asset-001"); + Assert.That(resource, Is.Not.Null, + "A legacy asset must have a matching V2 registry resource."); + + byte[] expected = JsonSerializer.SerializeToUtf8Bytes( + td, ThingDescriptionJsonContext.Default.ThingDescription); + Assert.That(resource!.DefaultVersion!.Content.ToArray(), Is.EqualTo(expected), + "The mirrored registry document must not diverge from the legacy document."); + + ServiceResult delete = await harness.Registry + .DeleteAssetAsync(assetId, CancellationToken.None).ConfigureAwait(false); + Assert.That(ServiceResult.IsGood(delete), Is.True); + Assert.That( + registry.Current.FindResource( + Opc.Ua.WotCon.Server.Registry.WotRegistryGroups.ThingDescriptions, "asset-001"), + Is.Null, "Deleting a legacy asset must remove its registry resource."); + } + [Test] public async Task RebuildSimpleWriteValueDelegatesToProviderForWritableProperties() { @@ -535,7 +578,7 @@ public async Task RebuildMaterialisesActionMethodWithExpectedArguments() Assert.That(method.BrowseName.Name, Is.EqualTo("Echo")); Assert.That(method.Executable, Is.True); Assert.That(tag.InputArguments, Has.Count.EqualTo(1)); - Assert.That(tag.InputArguments[0].DataType, Is.EqualTo(DataTypeIds.Int64)); + Assert.That(tag.InputArguments[0].DataType, Is.EqualTo(Ua.DataTypeIds.Int64)); Assert.That(tag.OutputArguments, Has.Count.EqualTo(1)); Assert.That(method.InputArguments, Is.Not.Null); Assert.That(method.OutputArguments, Is.Not.Null); diff --git a/tests/Opc.Ua.WotCon.Tests/WotConnectivityOptionsAndFactoryTests.cs b/tests/Opc.Ua.WotCon.Tests/WotConnectivityOptionsAndFactoryTests.cs index 39ebc2e3b5..5d092369c8 100644 --- a/tests/Opc.Ua.WotCon.Tests/WotConnectivityOptionsAndFactoryTests.cs +++ b/tests/Opc.Ua.WotCon.Tests/WotConnectivityOptionsAndFactoryTests.cs @@ -64,8 +64,8 @@ public void DefaultConfigurationParameterIsStringWritableWithoutInitialValue() { var param = new WotConfigurationParameter(); - Assert.That(param.DataType, Is.EqualTo(DataTypeIds.String)); - Assert.That(param.InitialValue, Is.Null); + Assert.That(param.DataType, Is.EqualTo(Ua.DataTypeIds.String)); + Assert.That(param.InitialValue.IsNull, Is.True); Assert.That(param.Writable, Is.True); Assert.That(param.Description, Is.Null); } diff --git a/tests/Opc.Ua.WotCon.Tests/WotPropertyMapperTests.cs b/tests/Opc.Ua.WotCon.Tests/WotPropertyMapperTests.cs index 2582a626e3..4ed197cf0b 100644 --- a/tests/Opc.Ua.WotCon.Tests/WotPropertyMapperTests.cs +++ b/tests/Opc.Ua.WotCon.Tests/WotPropertyMapperTests.cs @@ -44,7 +44,7 @@ public void MapNumberReturnsDoubleScalar() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(valueRank, Is.EqualTo(ValueRanks.Scalar)); } @@ -56,7 +56,7 @@ public void MapIntegerReturnsInt64Scalar() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Int64)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Int64)); Assert.That(valueRank, Is.EqualTo(ValueRanks.Scalar)); } @@ -68,7 +68,7 @@ public void MapBooleanReturnsBooleanScalar() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out _); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Boolean)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Boolean)); } [Test] @@ -79,7 +79,7 @@ public void MapStringReturnsStringScalar() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out _); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.String)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.String)); } [Test] @@ -116,7 +116,7 @@ public void MapArrayOfNumbersReturnsOneDimensionalDouble() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(valueRank, Is.EqualTo(ValueRanks.OneDimension)); } @@ -132,7 +132,7 @@ public void MapArrayOfBooleansReturnsOneDimensionalBoolean() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Boolean)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Boolean)); Assert.That(valueRank, Is.EqualTo(ValueRanks.OneDimension)); } @@ -144,7 +144,7 @@ public void MapArrayWithoutItemsReturnsBaseDataType() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.BaseDataType)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.BaseDataType)); Assert.That(valueRank, Is.EqualTo(ValueRanks.OneDimension)); } @@ -166,7 +166,7 @@ public void MapArrayMatchesCaseInsensitively(string typeLiteral) bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(valueRank, Is.EqualTo(ValueRanks.OneDimension)); } @@ -182,7 +182,7 @@ public void MapPrimitiveNumberIsCaseInsensitive( bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Double)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Double)); Assert.That(valueRank, Is.EqualTo(ValueRanks.Scalar)); } @@ -195,7 +195,7 @@ public void MapPrimitiveBooleanIsCaseInsensitive( bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out _); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Boolean)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Boolean)); } [Test] @@ -207,7 +207,7 @@ public void MapPrimitiveIntegerIsCaseInsensitive( bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out _); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.Int64)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.Int64)); } [Test] @@ -219,7 +219,7 @@ public void MapPrimitiveStringIsCaseInsensitive( bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out _); Assert.That(ok, Is.True); - Assert.That(dataType, Is.EqualTo(DataTypeIds.String)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.String)); } /// @@ -233,7 +233,7 @@ public void MapUnknownPrimitiveTypeReturnsBaseDataTypeAndTrue() bool ok = WotPropertyMapper.TryMap(property, out NodeId dataType, out int valueRank); Assert.That(ok, Is.True, "Unknown primitive types still map (to BaseDataType)."); - Assert.That(dataType, Is.EqualTo(DataTypeIds.BaseDataType)); + Assert.That(dataType, Is.EqualTo(Ua.DataTypeIds.BaseDataType)); Assert.That(valueRank, Is.EqualTo(ValueRanks.Scalar)); } diff --git a/tests/Opc.Ua.WotCon.Tests/WotRegistryClientLiveServerTests.cs b/tests/Opc.Ua.WotCon.Tests/WotRegistryClientLiveServerTests.cs new file mode 100644 index 0000000000..e5609f08be --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/WotRegistryClientLiveServerTests.cs @@ -0,0 +1,437 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.Client.TestFramework; +using Opc.Ua.Server.TestFramework; +using Opc.Ua.Tests; +using Opc.Ua.WotCon.Client; +using Opc.Ua.WotCon.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.WotCon.Tests.Materialization; +using Opc.Ua.XRegistry; +using Quickstarts.ReferenceServer; + +namespace Opc.Ua.WotCon.Tests +{ + /// + /// Live-server end-to-end test for : a + /// real hosts the WoT Connectivity 1.1 + /// registry NodeManager (the same fixture used by + /// WotRegistryLifecycleTests/WotRegistryEventIntegrationTests + /// in Opc.Ua.Server.Tests), a real + /// connects over loopback opc.tcp, and the registry client drives a + /// complete create-group / create-resource / chunked-upload / refresh + /// / read-back-metadata workflow against it. + /// + [TestFixture] + [Category("WotCon")] + [Category("Client")] + [Category("Integration")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + [NonParallelizable] + public sealed class WotRegistryClientLiveServerTests + { + private string m_pkiRoot = null!; + private ServerFixture m_serverFixture = null!; + private ClientFixture m_clientFixture = null!; + private ReferenceServer m_server = null!; + private ISession m_session = null!; + private ITelemetryContext m_telemetry = null!; + private WotRegistryService m_registry = null!; + private WotMaterializationCoordinator m_coordinator = null!; + private BlockingProjectionHost m_projectionHost = null!; + + [SetUp] + public async Task SetUpAsync() + { + m_telemetry = NUnitTelemetryContext.Create(); + m_pkiRoot = Path.Combine( + Path.GetTempPath(), nameof(WotRegistryClientLiveServerTests), Guid.NewGuid().ToString("N")); + + m_serverFixture = new ServerFixture(t => new ReferenceServer(t)) + { + UriScheme = Utils.UriSchemeOpcTcp, + SecurityNone = true, + AutoAccept = true + }; + m_server = await m_serverFixture.StartAsync(m_pkiRoot).ConfigureAwait(false); + + var options = new WotRegistryServerOptions + { + // The test drives Refresh explicitly for a deterministic + // sequence of events/generations. + AutoRefresh = false, + ManagementAccess = new WotManagementAccessPolicy + { + MinimumSecurityMode = MessageSecurityMode.None, + AllowAnonymous = true, + RequiredRoleId = Ua.ObjectIds.WellKnownRole_Anonymous + } + }; + m_registry = new WotRegistryService(); + m_projectionHost = new BlockingProjectionHost( + new LifecycleWotProjectionHost(m_server.NodeManagerLifecycle)); + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_projectionHost, + documentConverter: new FakeWotDocumentConverter()); + var factory = new WotRegistryNodeManagerFactory(options, m_registry, m_coordinator); + _ = await m_server.NodeManagerLifecycle + .AddAsync(factory) + .ConfigureAwait(false); + + m_clientFixture = new ClientFixture(false, false, m_telemetry); + await m_clientFixture.LoadClientConfigurationAsync(m_pkiRoot).ConfigureAwait(false); + string url = $"{Utils.UriSchemeOpcTcp}://localhost:{m_serverFixture.Port}"; + m_session = await m_clientFixture + .ConnectAsync(new Uri(url), SecurityPolicies.None) + .ConfigureAwait(false); + } + + [TearDown] + public async Task TearDownAsync() + { + try + { + if (m_session != null) + { + await m_session.CloseAsync().ConfigureAwait(false); + } + } + finally + { + m_session?.Dispose(); + m_coordinator?.Dispose(); + m_registry?.Dispose(); + m_server?.Dispose(); + + if (m_serverFixture != null) + { + await m_serverFixture.StopAsync().ConfigureAwait(false); + } + m_clientFixture?.Dispose(); + + if (!string.IsNullOrEmpty(m_pkiRoot) && Directory.Exists(m_pkiRoot)) + { + Directory.Delete(m_pkiRoot, recursive: true); + } + } + } + + [Test] + public async Task UploadRefreshAndReadBackResourceMetadataAsync() + { + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(m_session, m_telemetry) + .ConfigureAwait(false); + + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + Assert.That(group.Kind, Is.EqualTo(WoTDocumentKindEnum.ThingDescription)); + + (WotRegistryResourceClient resource, string versionId, bool created) = await group + .GetOrCreateResourceAsync("sensor01", "1.0.0") + .ConfigureAwait(false); + Assert.That(created, Is.True); + // The server currently assigns its own version id on commit + // rather than honoring the caller-supplied one, so the + // pre-upload versionId is empty (no default version yet). + Assert.That(versionId, Is.Empty); + + byte[] content = Encoding.UTF8.GetBytes(ValidThingDescriptionJson("sensor01")); + + // Force several Write calls with a small chunk size to prove + // the chunked upload / commit-on-close path over a real + // FileType transfer. + await resource.UploadNewVersionAsync(ByteString.From(content), chunkSize: 64) + .ConfigureAwait(false); + + ByteString downloaded = await resource.DownloadAsync(chunkSize: 64).ConfigureAwait(false); + Assert.That(downloaded.ToArray(), Is.EqualTo(content)); + + WotRegistryRefreshResult refresh = await client + .RefreshAllAsync(requestId: "live-req-1") + .ConfigureAwait(false); + var refreshMessages = new List(); + foreach (WoTResourceLoadResultDataType result in refresh.Results) + { + refreshMessages.Add( + $"{result.ResourceId}: {result.Phase}/{result.Outcome}: {result.Message}"); + } + string refreshDetails = string.Join("; ", refreshMessages); + Assert.That(refresh.HasFailures, Is.False, refreshDetails); + + bool hasFailure = false; + bool hasActiveResource = false; + foreach (WoTResourceLoadResultDataType result in refresh.Results) + { + hasFailure |= result.Outcome == WoTOutcomeEnum.Failed; + hasActiveResource |= + result.ResourceId == "sensor01" && + result.LoadState == WoTLoadStateEnum.Active; + } + Assert.That( + hasFailure, Is.False, + "The uploaded Thing Description must materialize without failures."); + Assert.That( + hasActiveResource, Is.True, + "Refresh must report an active load state for the uploaded document."); + + // Read back plain resource metadata (VersionId, inherited from + // the xRegistry ResourceType base) over the real session to + // prove the uploaded/materialized resource is observable + // through the same client-resolved NodeId. + ushort xRegistryNs = m_session.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + NodeId versionIdNodeId = await ResolveChildAsync( + m_session, resource.ResourceNodeId, xRegistryNs, "VersionId").ConfigureAwait(false); + ArrayOf nodesToRead = new[] + { + new ReadValueId { NodeId = versionIdNodeId, AttributeId = Attributes.Value } + }.ToArrayOf(); + ReadResponse readResponse = await m_session + .ReadAsync(null, 0, TimestampsToReturn.Neither, nodesToRead, default) + .ConfigureAwait(false); + Assert.That(readResponse.Results[0].StatusCode, Is.EqualTo(StatusCodes.Good)); + readResponse.Results[0].WrappedValue.TryGetValue(out string readVersionId); + Assert.That(readVersionId, Is.Not.Empty, + "The server must assign a real version id once a version has been committed."); + } + + [Test] + public async Task ConcurrentRefreshReturnsServerTooBusyWithoutDeadlockAsync() + { + WotRegistryClient client = await WotRegistryClient + .ForServerAsync(m_session, m_telemetry) + .ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + (WotRegistryResourceClient resource, _, _) = await group + .GetOrCreateResourceAsync("concurrent-sensor", "1.0.0") + .ConfigureAwait(false); + await resource.UploadNewVersionAsync( + ByteString.From(Encoding.UTF8.GetBytes( + ValidThingDescriptionJson("concurrent-sensor")))) + .ConfigureAwait(false); + + m_projectionHost.BlockNextActivation(); + Task firstRefresh = client + .RefreshAllAsync(requestId: "first-refresh") + .AsTask(); + await m_projectionHost.WaitUntilBlockedAsync().ConfigureAwait(false); + + ServiceResultException? secondFailure = null; + try + { + _ = await client + .RefreshAllAsync(requestId: "second-refresh") + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + secondFailure = ex; + } + finally + { + m_projectionHost.ReleaseActivation(); + } + + Assert.That(secondFailure, Is.Not.Null); + Assert.That( + secondFailure!.StatusCode, + Is.EqualTo(StatusCodes.BadServerTooBusy)); + WotRegistryRefreshResult firstResult = await firstRefresh.ConfigureAwait(false); + Assert.That(firstResult.HasFailures, Is.False); + } + + private static async ValueTask ResolveChildAsync( + ISession session, NodeId parent, ushort namespaceIndex, string name) + { + ArrayOf paths = new[] + { + new BrowsePath + { + StartingNode = parent, + RelativePath = new RelativePath + { + Elements = + [ + new RelativePathElement + { + ReferenceTypeId = Ua.ReferenceTypeIds.HasProperty, + IsInverse = false, + IncludeSubtypes = true, + TargetName = new QualifiedName(name, namespaceIndex) + } + ] + } + } + }.ToArrayOf(); + TranslateBrowsePathsToNodeIdsResponse response = await session + .TranslateBrowsePathsToNodeIdsAsync(null, paths, default) + .ConfigureAwait(false); + return ExpandedNodeId.ToNodeId( + response.Results[0].Targets[0].TargetId, session.NamespaceUris); + } + + private static string ValidThingDescriptionJson(string id) + { + // A syntactically valid, minimal WoT 1.1 Thing Description, + // padded so the upload exercises multiple 64-byte Write calls. + string padding = new('x', 300); + return "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"@type\":\"uav:object\",\"id\":\"urn:" + + id + + "\",\"title\":\"" + + id + + "\"," + + "\"description\":\"" + + padding + + "\"}"; + } + + private sealed class BlockingProjectionHost : IWotProjectionHost + { + public BlockingProjectionHost(IWotProjectionHost inner) + { + m_inner = inner; + } + + public async ValueTask AddAsync( + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + await WaitIfBlockedAsync(cancellationToken).ConfigureAwait(false); + return await m_inner.AddAsync(document, cancellationToken).ConfigureAwait(false); + } + + public async ValueTask ShadowReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + await WaitIfBlockedAsync(cancellationToken).ConfigureAwait(false); + return await m_inner + .ShadowReloadAsync(current, document, cancellationToken) + .ConfigureAwait(false); + } + + public async ValueTask ImmediateReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + await WaitIfBlockedAsync(cancellationToken).ConfigureAwait(false); + return await m_inner + .ImmediateReloadAsync(current, document, cancellationToken) + .ConfigureAwait(false); + } + + public ValueTask RemoveAsync( + WotProjectionHandle handle, + CancellationToken cancellationToken = default) + { + return m_inner.RemoveAsync(handle, cancellationToken); + } + + public void BlockNextActivation() + { + lock (m_gate) + { + m_entered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + m_release = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + } + } + + public Task WaitUntilBlockedAsync() + { + lock (m_gate) + { + return m_entered?.Task ?? + throw new InvalidOperationException("No activation is blocked."); + } + } + + public void ReleaseActivation() + { + lock (m_gate) + { + m_release?.TrySetResult(true); + } + } + + private async ValueTask WaitIfBlockedAsync(CancellationToken cancellationToken) + { + TaskCompletionSource? entered; + TaskCompletionSource? release; + lock (m_gate) + { + entered = m_entered; + release = m_release; + } + if (entered is null || release is null) + { + return; + } + + entered.TrySetResult(true); + using CancellationTokenRegistration registration = cancellationToken.Register( + static state => ((TaskCompletionSource)state!).TrySetCanceled(), + release); + await release.Task.ConfigureAwait(false); + lock (m_gate) + { + if (ReferenceEquals(m_release, release)) + { + m_entered = null; + m_release = null; + } + } + } + + private readonly IWotProjectionHost m_inner; + private readonly Lock m_gate = new(); + private TaskCompletionSource? m_entered; + private TaskCompletionSource? m_release; + } + } +} diff --git a/tests/Opc.Ua.WotCon.Tests/WotRegistryProjectionLiveTests.cs b/tests/Opc.Ua.WotCon.Tests/WotRegistryProjectionLiveTests.cs new file mode 100644 index 0000000000..cb2795d423 --- /dev/null +++ b/tests/Opc.Ua.WotCon.Tests/WotRegistryProjectionLiveTests.cs @@ -0,0 +1,1009 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using NUnit.Framework; +using Opc.Ua.Client; +using Opc.Ua.Client.TestFramework; +using Opc.Ua.Server.TestFramework; +using Opc.Ua.Tests; +using Opc.Ua.WotCon.Client; +using Opc.Ua.WotCon.Server; +using Opc.Ua.WotCon.Server.Materialization; +using Opc.Ua.WotCon.Server.Registry; +using Opc.Ua.WotCon.Tests.Materialization; +using Opc.Ua.XRegistry; +using Quickstarts.ReferenceServer; + +namespace Opc.Ua.WotCon.Tests +{ + /// + /// Live-server integration tests that exercise the OPC UA method handlers in + /// WotRegistryProjection and the corresponding WotRegistryNodeManager + /// paths (event building, refresh gate, address-space lifecycle) as well as the + /// production LifecycleWotProjectionHost. + /// A real is started per test, and a real OPC UA session + /// connects over loopback opc.tcp so that method calls travel the full server-side + /// call chain. + /// + [TestFixture] + [Category("WotCon")] + [Category("Client")] + [Category("Integration")] + [SetCulture("en-us")] + [SetUICulture("en-us")] + [NonParallelizable] + public sealed class WotRegistryProjectionLiveTests + { + [SetUp] + public async Task SetUpAsync() + { + m_telemetry = NUnitTelemetryContext.Create(); + m_pkiRoot = Path.Combine( + Path.GetTempPath(), + nameof(WotRegistryProjectionLiveTests), + Guid.NewGuid().ToString("N")); + + m_serverFixture = new ServerFixture(t => new ReferenceServer(t)) + { + UriScheme = Utils.UriSchemeOpcTcp, + SecurityNone = true, + AutoAccept = true + }; + m_server = await m_serverFixture.StartAsync(m_pkiRoot).ConfigureAwait(false); + + var options = new WotRegistryServerOptions + { + AutoRefresh = false, + ManagementAccess = new WotManagementAccessPolicy + { + MinimumSecurityMode = MessageSecurityMode.None, + AllowAnonymous = true, + RequiredRoleId = Ua.ObjectIds.WellKnownRole_Anonymous + } + }; + + m_registry = new WotRegistryService(); + m_converter = new FakeWotDocumentConverter(); + m_projectionHost = new PausableProjectionHost( + new LifecycleWotProjectionHost(m_server.NodeManagerLifecycle)); + m_coordinator = new WotMaterializationCoordinator( + m_registry, + m_projectionHost, + documentConverter: m_converter); + var factory = new WotRegistryNodeManagerFactory(options, m_registry, m_coordinator); + _ = await m_server.NodeManagerLifecycle + .AddAsync(factory) + .ConfigureAwait(false); + + m_clientFixture = new ClientFixture(false, false, m_telemetry); + await m_clientFixture.LoadClientConfigurationAsync(m_pkiRoot).ConfigureAwait(false); + string url = $"{Utils.UriSchemeOpcTcp}://localhost:{m_serverFixture.Port}"; + m_session = await m_clientFixture + .ConnectAsync(new Uri(url), SecurityPolicies.None) + .ConfigureAwait(false); + } + + [TearDown] + public async Task TearDownAsync() + { + // Exercises DeleteAddressSpaceAsync (unregisters events, calls + // coordinator.RemoveAllAsync → LifecycleWotProjectionHost.RemoveAsync per + // projection) and WotRegistryProjection.Dispose (clears group entries, + // disposes the refresh gate). + try + { + if (m_session != null) + { + await m_session.CloseAsync().ConfigureAwait(false); + } + } + finally + { + m_session?.Dispose(); + m_coordinator?.Dispose(); + m_registry?.Dispose(); + m_server?.Dispose(); + + if (m_serverFixture != null) + { + await m_serverFixture.StopAsync().ConfigureAwait(false); + } + + m_clientFixture?.Dispose(); + + if (!string.IsNullOrEmpty(m_pkiRoot) && Directory.Exists(m_pkiRoot)) + { + Directory.Delete(m_pkiRoot, recursive: true); + } + } + } + + /// + /// Covers OnCreateResourceAsync empty-resource-id branch: + /// the server rejects an empty id with BadInvalidArgument. + /// + [Test] + public async Task CreateResourceWithEmptyIdReturnsBadInvalidArgument() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + + // Bypass the client-wrapper validation and call the proxy directly + // so that the empty string reaches the server-side handler. + ServiceResultException? ex = null; + try + { + _ = await group.Proxy + .CreateResourceAsync( + resourceId: string.Empty, + versionId: string.Empty, + requestFileOpen: false) + .ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Not.Null, "Empty resource id must be rejected by the server."); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadInvalidArgument)); + } + + /// + /// Covers OnCreateResourceAsync duplicate-id branch: + /// creating the same resource id twice returns BadNodeIdExists. + /// + [Test] + public async Task CreateResourceWithDuplicateIdReturnsBadNodeIdExists() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + _ = await group.CreateResourceAsync("dup-res").ConfigureAwait(false); + + ServiceResultException? ex = null; + try + { + _ = await group.CreateResourceAsync("dup-res").ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Not.Null, "Duplicate resource id must be rejected."); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdExists)); + } + + /// + /// Covers OnGetOrCreateResourceAsync create path: the first call + /// creates the resource and reports Created == true. + /// + [Test] + public async Task GetOrCreateResourceCreatesNewResourceOnFirstCall() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + + (_, _, bool created) = await group + .GetOrCreateResourceAsync("new-res") + .ConfigureAwait(false); + + Assert.That(created, Is.True, "First call must report the resource as newly created."); + } + + /// + /// Covers OnGetOrCreateResourceAsync existing path: the second call + /// returns the existing resource with Created == false. + /// + [Test] + public async Task GetOrCreateResourceReturnsExistingOnSecondCall() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + _ = await group.GetOrCreateResourceAsync("existing-res").ConfigureAwait(false); + + (_, _, bool created) = await group + .GetOrCreateResourceAsync("existing-res") + .ConfigureAwait(false); + + Assert.That(created, Is.False, + "Second call must report the resource as pre-existing."); + } + + [Test] + public async Task GetOrCreateGroupReturnsExistingWhenNameRequiresSlugification() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + + (_, bool firstCreated) = await client.GetOrCreateGroupAsync("My Group") + .ConfigureAwait(false); + (_, bool secondCreated) = await client.GetOrCreateGroupAsync("My Group") + .ConfigureAwait(false); + + Assert.Multiple(() => + { + Assert.That(firstCreated, Is.True); + Assert.That(secondCreated, Is.False); + }); + } + + [Test] + public async Task ConcurrentGetOrCreateResourceOpenAndReconcileDoesNotRace() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + + Task[] tasks = Enumerable.Range(0, 12) + .Select(i => group.Proxy + .GetOrCreateResourceAsync( + "race-" + i.ToString(System.Globalization.CultureInfo.InvariantCulture), + string.Empty, + requestFileOpen: true) + .AsTask()) + .ToArray(); + + Assert.That( + async () => await Task.WhenAll(tasks).ConfigureAwait(false), + Throws.Nothing); + } + + /// + /// Covers CommitDocumentAsync success path: the chunked upload + /// triggers commit-on-close, and the content is immediately downloadable. + /// + [Test] + public async Task UploadNewVersionPersistsDocumentViaClosedFileHandle() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + byte[] expected = MakeThingDescriptionBytes("td-01"); + ByteString downloaded = await resource.DownloadAsync().ConfigureAwait(false); + + Assert.That(downloaded.ToArray(), Is.EqualTo(expected)); + } + + /// + /// Covers OnValidateAsync success path: calling Validate after + /// uploading content returns a non-null outcome. + /// + [Test] + public async Task ValidateResourceAfterUploadReturnsOutcome() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + WoTValidationOutcomeDataType outcome = await resource + .ValidateAsync() + .ConfigureAwait(false); + + Assert.That(outcome, Is.Not.Null); + } + + /// + /// Records whether the session namespace table and the transport + /// channel's message-context namespace table are the same instance, and + /// whether both actually contain the application-level xRegistry + /// namespace after FetchNamespaceTablesAsync. + /// resolves child + /// browse names through Session.MessageContext.NamespaceUris, so + /// this is the invariant the source-generated typed child accessors + /// depend on. + /// + [Test] + public void SessionAndMessageContextShareTheNamespaceTable() + { + NamespaceTable sessionTable = m_session.NamespaceUris; + NamespaceTable channelTable = m_session.MessageContext.NamespaceUris; + + int sessionIndex = sessionTable.GetIndex(XRegistryWellKnown.XRegistryNamespaceUri); + int channelIndex = channelTable.GetIndex(XRegistryWellKnown.XRegistryNamespaceUri); + + Assert.Multiple(() => + { + Assert.That( + ReferenceEquals(sessionTable, channelTable), + Is.True, + "Session.NamespaceUris and Session.MessageContext.NamespaceUris must be the " + + "same table, otherwise FetchNamespaceTablesAsync updates only one of them and " + + "ObjectTypeClient.ResolveChildNodeIdAsync cannot resolve application namespaces."); + Assert.That( + sessionIndex, + Is.GreaterThanOrEqualTo(0), + "the session namespace table must contain the xRegistry namespace"); + Assert.That( + channelIndex, + Is.EqualTo(sessionIndex), + "both tables must resolve the xRegistry namespace to the same index"); + }); + } + + /// + /// Covers OnAddResourceLabelAsync success path and the + /// ToServiceResult(Success) arm. Uses direct session Call so that + /// the xRegistry namespace index is resolved from the session namespace table + /// (populated by FetchNamespaceTablesAsync) rather than the transport + /// channel's message context (which may not have been updated). + /// + [Test] + public async Task AddResourceLabelOverOpcUaSucceeds() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + NodeId labelsNodeId = await BrowseForChildNodeIdAsync(resource.ResourceNodeId, "Labels") + .ConfigureAwait(false); + Assert.That(labelsNodeId.IsNull, Is.False, "Labels node must be browsable via HasComponent."); + + ushort xNs = m_session.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + ServiceResultException? ex = null; + try + { + // AddAttribute type-declaration NodeId is ns=xRegistry;i=63501. + // Epoch 0 means no epoch check. + await m_session.CallAsync( + labelsNodeId, new NodeId(63501u, xNs), default, + new Variant("env"), new Variant("prod"), new Variant(0u)) + .ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Null, "A valid label add must succeed without exception."); + WotResource? stored = m_registry.Current.FindResource( + WotRegistryGroups.ThingDescriptions, "td-01"); + Assert.That(stored, Is.Not.Null); + Assert.That(stored!.Labels.ContainsKey("env"), Is.True); + Assert.That(stored.Labels["env"], Is.EqualTo("prod")); + } + + /// + /// Covers the catch (ServiceResultException ex) branch in + /// OnAddResourceLabelAsync: an empty key is rejected by + /// WotLabelValidator which throws a ServiceResultException + /// that is caught and surfaced as a service error. + /// + [Test] + public async Task AddResourceLabelWithInvalidKeyPropagatesAsServiceError() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + NodeId labelsNodeId = await BrowseForChildNodeIdAsync(resource.ResourceNodeId, "Labels") + .ConfigureAwait(false); + Assert.That(labelsNodeId.IsNull, Is.False, "Labels node must be browsable via HasComponent."); + + ushort xNs = m_session.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + ServiceResultException? ex = null; + try + { + await m_session.CallAsync( + labelsNodeId, new NodeId(63501u, xNs), default, + new Variant(string.Empty), new Variant("value"), new Variant(0u)) + .ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Not.Null, "Empty label key must be rejected by the server."); + } + + /// + /// Covers ToServiceResult(Rejected) arm: an epoch mismatch causes + /// the registry to return WoTOutcomeEnum.Rejected, which maps to + /// BadInvalidState. + /// + [Test] + public async Task AddResourceLabelWithWrongEpochReturnsBadInvalidState() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + NodeId labelsNodeId = await BrowseForChildNodeIdAsync(resource.ResourceNodeId, "Labels") + .ConfigureAwait(false); + Assert.That(labelsNodeId.IsNull, Is.False, "Labels node must be browsable via HasComponent."); + + ushort xNs = m_session.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + ServiceResultException? ex = null; + try + { + // Epoch 999999 will not match the current resource epoch (which starts at 1). + await m_session.CallAsync( + labelsNodeId, new NodeId(63501u, xNs), default, + new Variant("env"), new Variant("value"), new Variant(999999u)) + .ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Not.Null, "Epoch mismatch must result in an error."); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadInvalidState)); + } + + /// + /// Covers ToServiceResult default/Failed arm: removing a label that + /// does not exist causes RemoveResourceLabelAsync to return + /// WoTOutcomeEnum.Failed which maps to BadNodeIdUnknown. + /// + [Test] + public async Task RemoveResourceLabelWithMissingKeyReturnsBadNodeIdUnknown() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + NodeId labelsNodeId = await BrowseForChildNodeIdAsync(resource.ResourceNodeId, "Labels") + .ConfigureAwait(false); + Assert.That(labelsNodeId.IsNull, Is.False, "Labels node must be browsable via HasComponent."); + + ushort xNs = m_session.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + ServiceResultException? ex = null; + try + { + // RemoveAttribute type-declaration NodeId is ns=xRegistry;i=63503. + await m_session.CallAsync( + labelsNodeId, new NodeId(63503u, xNs), default, + new Variant("no-such-label"), new Variant(0u)) + .ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Not.Null, + "Removing a non-existent label must fail with a service error."); + Assert.That(ex!.StatusCode, Is.EqualTo(StatusCodes.BadNodeIdUnknown)); + } + + /// + /// Covers RemoveGroupNodeAsync: deleting a group through + /// OnDeleteGroupAsyncReconcileAsync removes the group + /// node and all its resource children from the NodeManager address space. + /// + [Test] + public async Task DeleteGroupRemovesGroupNodeFromAddressSpace() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (WotRegistryGroupClient group, _) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + await group.DeleteAsync(expectedEpoch: 0u).ConfigureAwait(false); + + // The group node must have been removed; browsing to it must now fail. + ServiceResultException? ex = null; + try + { + _ = await client + .OpenGroupAsync(WotRegistryClient.ThingDescriptionsGroupId) + .ConfigureAwait(false); + } + catch (ServiceResultException sre) + { + ex = sre; + } + + Assert.That(ex, Is.Not.Null, + "Group node must be absent from the address space after deletion."); + } + + /// + /// Covers OnRefreshAsync success path, + /// CreateAddressSpaceAsync (via fixture startup) and + /// SafeRefreshAsync (called at startup as fire-and-forget). + /// Also covers LifecycleWotProjectionHost.AddAsync (first projection). + /// + [Test] + public async Task RefreshAllSucceedsForValidUploadedResource() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + _ = await CreateGroupAndResourceAsync(client).ConfigureAwait(false); + + WotRegistryRefreshResult result = await client + .RefreshAllAsync(requestId: "proj-live-success") + .ConfigureAwait(false); + + Assert.That(result.HasFailures, Is.False, + "Refresh must succeed for a valid uploaded document."); + } + + /// + /// Covers OnRefreshAsync BadServerTooBusy path: a second + /// concurrent refresh call finds the refresh gate taken and fails immediately. + /// Covers SafeReconcileAsync via registry-changed callbacks. + /// + [Test] + public async Task ConcurrentRefreshReturnsBadServerTooBusy() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + // Upload a second version so the first refresh has real work to do. + await resource + .UploadNewVersionAsync(ByteString.From(MakeThingDescriptionBytes("td-01"))) + .ConfigureAwait(false); + + m_projectionHost.BlockNextActivation(); + Task firstRefresh = client + .RefreshAllAsync(requestId: "busy-first") + .AsTask(); + await m_projectionHost.WaitUntilBlockedAsync().ConfigureAwait(false); + + ServiceResultException? secondFailure = null; + try + { + _ = await client + .RefreshAllAsync(requestId: "busy-second") + .ConfigureAwait(false); + } + catch (ServiceResultException ex) + { + secondFailure = ex; + } + finally + { + m_projectionHost.ReleaseActivation(); + } + + Assert.That(secondFailure, Is.Not.Null, + "A second concurrent refresh must fail with BadServerTooBusy."); + Assert.That( + secondFailure!.StatusCode, + Is.EqualTo(StatusCodes.BadServerTooBusy)); + WotRegistryRefreshResult firstResult = await firstRefresh.ConfigureAwait(false); + Assert.That(firstResult.HasFailures, Is.False); + } + + /// + /// Covers BuildEvent RefreshCompleted arm and the + /// BuildEvent Resource (default) arm: a successful refresh emits + /// both event kinds via OnCoordinatorEvent → BuildEvent. + /// + [Test] + public async Task RefreshEmitsRefreshCompletedAndResourceEvents() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + _ = await CreateGroupAndResourceAsync(client).ConfigureAwait(false); + + var observed = new HashSet(); + m_coordinator.Event += (_, e) => + { + lock (observed) + { + observed.Add(e.Kind); + } + }; + + WotRegistryRefreshResult result = await client + .RefreshAllAsync(requestId: "events-ok") + .ConfigureAwait(false); + + Assert.That(result.HasFailures, Is.False); + + bool hasRefreshCompleted; + bool hasResource; + lock (observed) + { + hasRefreshCompleted = observed.Contains(WotMaterializationEventKind.RefreshCompleted); + hasResource = observed.Contains(WotMaterializationEventKind.Resource); + } + + Assert.That(hasRefreshCompleted, Is.True, + "A successful refresh must emit a RefreshCompleted event."); + Assert.That(hasResource, Is.True, + "A successfully projected document must emit a Resource event."); + } + + /// + /// Covers BuildEvent ValidationFailure arm: marking a resource + /// invalid in the converter causes the coordinator to raise a + /// ValidationFailure event through BuildEvent. + /// + [Test] + public async Task RefreshEmitsValidationFailureEventWhenConverterFails() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + _ = await CreateGroupAndResourceAsync(client, resourceId: "bad-doc") + .ConfigureAwait(false); + m_converter.MarkInvalid("bad-doc"); + + var observed = new HashSet(); + m_coordinator.Event += (_, e) => + { + lock (observed) + { + observed.Add(e.Kind); + } + }; + + WotRegistryRefreshResult result = await client + .RefreshAllAsync(requestId: "val-fail") + .ConfigureAwait(false); + + Assert.That(result.HasFailures, Is.True, + "Refresh must report failure when the converter rejects the document."); + + bool hasValidationFailure; + lock (observed) + { + hasValidationFailure = + observed.Contains(WotMaterializationEventKind.ValidationFailure); + } + + Assert.That(hasValidationFailure, Is.True, + "A converter rejection must emit a ValidationFailure event."); + } + + /// + /// Covers BuildEvent LoadFailure arm: a TD with a missing + /// tm:extends dependency causes the dependency graph to mark the + /// closure as non-projectable, which raises a LoadFailure event + /// through BuildEvent. + /// + [Test] + public async Task RefreshEmitsLoadFailureEventWhenDependencyIsMissing() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + (WotRegistryResourceClient resource, _) = await group + .CreateResourceAsync("dep-td") + .ConfigureAwait(false); + + byte[] tdWithMissingDep = TestMaterialization.Td( + "urn:dep-td", "1", "urn:nonexistent-tm"); + await resource + .UploadNewVersionAsync(ByteString.From(tdWithMissingDep)) + .ConfigureAwait(false); + + var observed = new HashSet(); + m_coordinator.Event += (_, e) => + { + lock (observed) + { + observed.Add(e.Kind); + } + }; + + WotRegistryRefreshResult result = await client + .RefreshAllAsync(requestId: "dep-fail") + .ConfigureAwait(false); + + Assert.That(result.HasFailures, Is.True, + "Refresh must report failure for a document with a missing dependency."); + + bool hasLoadFailure; + lock (observed) + { + hasLoadFailure = observed.Contains(WotMaterializationEventKind.LoadFailure); + } + + Assert.That(hasLoadFailure, Is.True, + "A missing dependency must emit a LoadFailure event."); + } + + /// + /// Covers LifecycleWotProjectionHost.ShadowReloadAsync: the second + /// refresh after uploading a new document version updates the live projection + /// via shadow-reload rather than a fresh add. + /// + [Test] + public async Task ShadowReloadCalledWhenResourceContentChanges() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + (_, WotRegistryResourceClient resource) = await CreateGroupAndResourceAsync(client) + .ConfigureAwait(false); + + // First refresh activates the AddAsync path in LifecycleWotProjectionHost. + WotRegistryRefreshResult first = await client + .RefreshAllAsync(requestId: "shadow-1") + .ConfigureAwait(false); + Assert.That(first.HasFailures, Is.False); + + // Upload a different version so the digest changes, triggering ShadowReloadAsync. + byte[] v2 = Encoding.UTF8.GetBytes(MakeThingDescriptionStringV2("td-01")); + await resource + .UploadNewVersionAsync(ByteString.From(v2)) + .ConfigureAwait(false); + + // Second refresh must complete without failures via the shadow-reload path. + WotRegistryRefreshResult second = await client + .RefreshAllAsync(requestId: "shadow-2") + .ConfigureAwait(false); + + Assert.That(second.HasFailures, Is.False, + "A shadow-reload after content update must succeed."); + } + + /// + /// Covers DeleteAddressSpaceAsync and WotRegistryProjection.Dispose: + /// shutting the server down triggers the full cleanup chain. NUnit enforces + /// this via TearDown; this test adds a refresh so projections are active at + /// shutdown time. + /// + [Test] + public async Task DisposeRunsCleanlyWhenActiveProjectionsExist() + { + WotRegistryClient client = await OpenClientAsync().ConfigureAwait(false); + _ = await CreateGroupAndResourceAsync(client).ConfigureAwait(false); + + WotRegistryRefreshResult result = await client + .RefreshAllAsync(requestId: "dispose-test") + .ConfigureAwait(false); + + Assert.That(result.HasFailures, Is.False); + // TearDown exercises DeleteAddressSpaceAsync → Dispose. + } + + private ValueTask OpenClientAsync() + { + return WotRegistryClient.ForServerAsync(m_session, m_telemetry); + } + + private async ValueTask<(WotRegistryGroupClient Group, WotRegistryResourceClient Resource)> + CreateGroupAndResourceAsync( + WotRegistryClient client, + string resourceId = "td-01") + { + WotRegistryGroupClient group = await client + .CreateThingDescriptionGroupAsync() + .ConfigureAwait(false); + (WotRegistryResourceClient resource, _) = await group + .CreateResourceAsync(resourceId) + .ConfigureAwait(false); + byte[] content = MakeThingDescriptionBytes(resourceId); + await resource + .UploadNewVersionAsync(ByteString.From(content)) + .ConfigureAwait(false); + return (group, resource); + } + + private static byte[] MakeThingDescriptionBytes(string id) + { + return Encoding.UTF8.GetBytes(MakeThingDescriptionString(id)); + } + + private static string MakeThingDescriptionString(string id) + { + string padding = new('x', 300); + return + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"@type\":\"uav:object\",\"id\":\"urn:" + id + "\",\"title\":\"" + id + "\"," + + "\"description\":\"" + padding + "\"}"; + } + + private static string MakeThingDescriptionStringV2(string id) + { + string padding = new('y', 300); + return + "{\"@context\":\"https://www.w3.org/2022/wot/td/v1.1\"," + + "\"@type\":\"uav:object\",\"id\":\"urn:" + id + "\",\"title\":\"" + id + "-v2\"," + + "\"description\":\"" + padding + "\"}"; + } + + /// + /// Resolves the NodeId of a direct HasComponent-referenced child of + /// whose browse name is in the + /// xRegistry namespace. Uses on the + /// session's own namespace table (populated by FetchNamespaceTablesAsync) + /// rather than the transport channel's message context, which may not include + /// application-level namespaces. + /// + private async ValueTask BrowseForChildNodeIdAsync(NodeId parent, string name) + { + ushort xNs = m_session.NamespaceUris.GetIndexOrAppend(XRegistryWellKnown.XRegistryNamespaceUri); + ArrayOf paths = new[] + { + new BrowsePath + { + StartingNode = parent, + RelativePath = new RelativePath + { + Elements = + [ + new RelativePathElement + { + ReferenceTypeId = Ua.ReferenceTypeIds.HasComponent, + IsInverse = false, + IncludeSubtypes = true, + TargetName = new QualifiedName(name, xNs) + } + ] + } + } + }.ToArrayOf(); + TranslateBrowsePathsToNodeIdsResponse response = await m_session + .TranslateBrowsePathsToNodeIdsAsync(null, paths, default) + .ConfigureAwait(false); + if (response.Results.Count == 0 || + StatusCode.IsBad(response.Results[0].StatusCode) || + response.Results[0].Targets.Count == 0) + { + return NodeId.Null; + } + return ExpandedNodeId.ToNodeId( + response.Results[0].Targets[0].TargetId, m_session.NamespaceUris); + } + + private string m_pkiRoot = null!; + private ServerFixture m_serverFixture = null!; + private ClientFixture m_clientFixture = null!; + private ReferenceServer m_server = null!; + private ISession m_session = null!; + private ITelemetryContext m_telemetry = null!; + private WotRegistryService m_registry = null!; + private WotMaterializationCoordinator m_coordinator = null!; + private FakeWotDocumentConverter m_converter = null!; + private PausableProjectionHost m_projectionHost = null!; + + /// + /// A pausing wrapper around that can optionally + /// hold its next activation call until released. Mirrors the pattern in + /// WotRegistryClientLiveServerTests.BlockingProjectionHost to allow + /// the concurrent-refresh race condition to be reproduced deterministically. + /// + private sealed class PausableProjectionHost : IWotProjectionHost + { + public PausableProjectionHost(IWotProjectionHost inner) + { + m_inner = inner; + } + + public async ValueTask AddAsync( + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + await WaitIfBlockedAsync(cancellationToken).ConfigureAwait(false); + return await m_inner.AddAsync(document, cancellationToken).ConfigureAwait(false); + } + + public async ValueTask ShadowReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + await WaitIfBlockedAsync(cancellationToken).ConfigureAwait(false); + return await m_inner + .ShadowReloadAsync(current, document, cancellationToken) + .ConfigureAwait(false); + } + + public async ValueTask ImmediateReloadAsync( + WotProjectionHandle current, + WotProjectionDocument document, + CancellationToken cancellationToken = default) + { + await WaitIfBlockedAsync(cancellationToken).ConfigureAwait(false); + return await m_inner + .ImmediateReloadAsync(current, document, cancellationToken) + .ConfigureAwait(false); + } + + public ValueTask RemoveAsync( + WotProjectionHandle handle, + CancellationToken cancellationToken = default) + { + return m_inner.RemoveAsync(handle, cancellationToken); + } + + public void BlockNextActivation() + { + lock (m_gate) + { + m_entered = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + m_release = new TaskCompletionSource( + TaskCreationOptions.RunContinuationsAsynchronously); + } + } + + public Task WaitUntilBlockedAsync() + { + lock (m_gate) + { + return m_entered?.Task ?? + throw new InvalidOperationException("No activation is blocked."); + } + } + + public void ReleaseActivation() + { + lock (m_gate) + { + m_release?.TrySetResult(true); + } + } + + private async ValueTask WaitIfBlockedAsync(CancellationToken cancellationToken) + { + TaskCompletionSource? entered; + TaskCompletionSource? release; + lock (m_gate) + { + entered = m_entered; + release = m_release; + } + + if (entered is null || release is null) + { + return; + } + + entered.TrySetResult(true); + using CancellationTokenRegistration registration = cancellationToken.Register( + static state => ((TaskCompletionSource)state!).TrySetCanceled(), + release); + await release.Task.ConfigureAwait(false); + lock (m_gate) + { + if (ReferenceEquals(m_release, release)) + { + m_entered = null; + m_release = null; + } + } + } + + private readonly IWotProjectionHost m_inner; + private readonly Lock m_gate = new(); + private TaskCompletionSource? m_entered; + private TaskCompletionSource? m_release; + } + } +} diff --git a/tests/Opc.Ua.XRegistry.Tests/XRegistryClientTests.cs b/tests/Opc.Ua.XRegistry.Tests/XRegistryClientTests.cs index cca66fc527..e0c419c213 100644 --- a/tests/Opc.Ua.XRegistry.Tests/XRegistryClientTests.cs +++ b/tests/Opc.Ua.XRegistry.Tests/XRegistryClientTests.cs @@ -115,6 +115,57 @@ public void RegistryNodeIdAddressesTheWellKnownRoot() }); } + [Test] + public void RegistryNodeIdUsesAnExplicitRootWhenSupplied() + { + var domainRoot = new NodeId(64100u, 1); + + var client = new GenericXRegistryClient( + CreateSession().Object, + TestNamespaceUri, + domainRoot, + CreateTelemetry()); + + Assert.That(client.RegistryNodeId, Is.EqualTo(domainRoot), + "A domain registry declares its own root, so an explicitly supplied NodeId must " + + "win over the provisional well-known identifier."); + } + + [Test] + public void RegistryNodeIdFallsBackToTheWellKnownRootForANullExplicitRoot() + { + var client = new GenericXRegistryClient( + CreateSession().Object, + TestNamespaceUri, + default, + CreateTelemetry()); + + Assert.That(client.RegistryNodeId, + Is.EqualTo(new NodeId(XRegistryWellKnown.RegistryObject, 1)), + "A null NodeId selects the well-known root, so the explicit-root overload stays " + + "equivalent to the namespace-only constructor."); + } + + [Test] + public async Task AnExplicitRootDrivesTheGroupLifecycleAsync() + { + Mock session = CreateSession(); + var calls = new List(); + SetupCall(session, calls); + var domainRoot = new NodeId(64100u, 1); + + var client = new GenericXRegistryClient( + session.Object, + TestNamespaceUri, + domainRoot, + CreateTelemetry()); + await client.CreateGroupAsync(client.RegistryNodeId, "things") + .ConfigureAwait(false); + + Assert.That(calls[0].ObjectId, Is.EqualTo(domainRoot), + "The lifecycle Methods must be invoked on the explicit root, not the well-known one."); + } + [Test] public async Task RegistryNodeIdDrivesTheGroupLifecycleAsync() { diff --git a/tools/Opc.Ua.SourceGeneration.Core/Generators/FluentBuilderGenerator.cs b/tools/Opc.Ua.SourceGeneration.Core/Generators/FluentBuilderGenerator.cs index c8169d6d74..2fdc831f15 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Generators/FluentBuilderGenerator.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Generators/FluentBuilderGenerator.cs @@ -673,6 +673,15 @@ private void EmitTypedManagerImpl( "global::Opc.Ua.NodeId typeDefinitionId, global::Opc.Ua.QualifiedName browseName", "typeDefinitionId, browseName", typeArg: "TValue", noConstraint: true); + EmitPassThroughGenericMethod(writer, + "global::Opc.Ua.Server.Fluent.IVariableBuilder", "VariableFromDataTypeId", + "global::Opc.Ua.NodeId dataTypeId", "dataTypeId", + typeArg: "TValue", noConstraint: true); + EmitPassThroughGenericMethod(writer, + "global::Opc.Ua.Server.Fluent.IVariableBuilder", "VariableFromDataTypeId", + "global::Opc.Ua.NodeId dataTypeId, global::Opc.Ua.QualifiedName browseName", + "dataTypeId, browseName", + typeArg: "TValue", noConstraint: true); // Typed top-level accessors. foreach (InstanceDesign root in roots) @@ -1941,7 +1950,9 @@ private sealed class ChildAccessor /// public string WrapperClassName; - /// Key into m_wrappers for object children. + /// + /// Key into m_wrappers for object children. + /// public string ChildKey; /// diff --git a/tools/Opc.Ua.SourceGeneration.Core/Generators/MethodDesignArgumentResolver.cs b/tools/Opc.Ua.SourceGeneration.Core/Generators/MethodDesignArgumentResolver.cs index a393fe680f..df6d4146e5 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Generators/MethodDesignArgumentResolver.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Generators/MethodDesignArgumentResolver.cs @@ -42,31 +42,35 @@ internal static class MethodDesignArgumentResolver /// public static Parameter[] ResolveMethodInputs(MethodDesign method) { - if (method == null) - { - throw new ArgumentNullException(nameof(method)); - } - - return ResolveArguments( - method.InputArguments, - method.MethodDeclarationNode?.InputArguments, - method.MethodType?.InputArguments); + return ResolveMethodArguments(method).Inputs; } /// /// Resolves the effective output arguments for a method design. /// public static Parameter[] ResolveMethodOutputs(MethodDesign method) + { + return ResolveMethodArguments(method).Outputs; + } + + private static (Parameter[] Inputs, Parameter[] Outputs) ResolveMethodArguments( + MethodDesign method) { if (method == null) { throw new ArgumentNullException(nameof(method)); } - return ResolveArguments( + Parameter[] inputs = ResolveArguments( + method.InputArguments, + method.MethodDeclarationNode?.InputArguments, + method.MethodType?.InputArguments); + Parameter[] outputs = ResolveArguments( method.OutputArguments, method.MethodDeclarationNode?.OutputArguments, method.MethodType?.OutputArguments); + ModelDesignExtensions.AssignMethodArgumentCodeNames(inputs, outputs); + return (inputs, outputs); } private static Parameter[] ResolveArguments( diff --git a/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeManagerTemplates.cs b/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeManagerTemplates.cs index e692ac160c..82e63f55a4 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeManagerTemplates.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeManagerTemplates.cs @@ -112,7 +112,8 @@ public partial class {{Tokens.NodeManagerClassName}} : global::Opc.Ua.Server.Flu __nsIndex, __FindRootByBrowseName, __FindRootByNodeId, - __FindByTypeDefinitionId); + __FindByTypeDefinitionId, + __FindByDataTypeId); // Attach the FluentNodeManagerBase event-source registry // to the builder so Publish(...) extensions can resolve @@ -234,6 +235,48 @@ protected override void OnMonitoredItemCreated( } return __matches; } + + private global::Opc.Ua.ArrayOf __FindByDataTypeId( + global::Opc.Ua.NodeId dataTypeId) + { + if (dataTypeId == null || dataTypeId.IsNull) + { + return []; + } + + var __matches = new global::System.Collections.Generic.List(); + var __queue = new global::System.Collections.Generic.Queue(); + var __seen = new global::System.Collections.Generic.HashSet(); + var __scratch = new global::System.Collections.Generic.List(); + foreach (global::Opc.Ua.NodeState __root in PredefinedNodes.Values) + { + if (__root != null && __seen.Add(__root)) + { + __queue.Enqueue(__root); + } + } + while (__queue.Count > 0) + { + global::Opc.Ua.NodeState __current = __queue.Dequeue(); + if (__current is global::Opc.Ua.BaseVariableState __variable && + __variable.DataType == dataTypeId) + { + __matches.Add(__current); + } + __scratch.Clear(); + __current.GetChildren(SystemContext, __scratch); + for (int __i = 0; __i < __scratch.Count; __i++) + { + global::Opc.Ua.BaseInstanceState __child = __scratch[__i]; + if (__child != null && __seen.Add(__child)) + { + __queue.Enqueue(__child); + } + } + } + return new global::Opc.Ua.ArrayOf( + __matches.ToArray()); + } } } """); diff --git a/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeStateGenerator.cs b/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeStateGenerator.cs index 1f3c42ecce..40c7439153 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeStateGenerator.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Generators/NodeStateGenerator.cs @@ -647,7 +647,7 @@ private TemplateString LoadTemplate_ListOfInputArguments(ILoadContext context) { return null; } - string fieldName = field.GetChildFieldName()[2..]; + string fieldName = GetMethodArgumentIdentifier(field); string typeName = field.DataTypeNode.GetMethodArgumentTypeAsCode( field.ValueRank, m_context.ModelDesign.TargetNamespace.Value, @@ -658,7 +658,9 @@ private TemplateString LoadTemplate_ListOfInputArguments(ILoadContext context) { case BasicDataType.UserDefined: context.Out.WriteLine( - "_inputArguments[{2}].TryGetStructure(out {1} {0});", + "_inputArguments[{2}].TryGetStructure(" + + "global::Opc.Ua.SystemContextExtensions.AsMessageContext(_context), " + + "out {1} {0});", fieldName, typeName, context.Index); @@ -687,7 +689,7 @@ private TemplateString LoadTemplate_ListOfOutputDeclarations(ILoadContext contex { return null; } - string fieldName = field.GetChildFieldName()[2..]; + string fieldName = GetMethodArgumentIdentifier(field); string typeName = field.DataTypeNode.GetMethodArgumentTypeAsCode( field.ValueRank, m_context.ModelDesign.TargetNamespace.Value, @@ -698,7 +700,9 @@ private TemplateString LoadTemplate_ListOfOutputDeclarations(ILoadContext contex { case BasicDataType.UserDefined: context.Out.WriteLine( - "_outputArguments[{2}].TryGetStructure(out {1} {0});", + "_outputArguments[{2}].TryGetStructure(" + + "global::Opc.Ua.SystemContextExtensions.AsMessageContext(_context), " + + "out {1} {0});", fieldName, typeName, context.Index); @@ -727,7 +731,7 @@ private TemplateString LoadTemplate_ListOfOutputArguments(ILoadContext context) { return null; } - string fieldName = field.GetChildFieldName()[2..]; + string fieldName = GetMethodArgumentIdentifier(field); switch (field.DataTypeNode.BasicDataType) { case BasicDataType.UserDefined: @@ -769,7 +773,7 @@ private TemplateString LoadTemplate_OnCallDeclaration(ILoadContext context) Parameter argument = inputArguments[ii]; context.Out.WriteLine(","); - context.Out.Write("{1} {0}", argument.GetChildFieldName()[2..], + context.Out.Write("{1} {0}", GetMethodArgumentIdentifier(argument), argument.DataTypeNode.GetMethodArgumentTypeAsCode( argument.ValueRank, m_context.ModelDesign.TargetNamespace.Value, @@ -782,7 +786,7 @@ private TemplateString LoadTemplate_OnCallDeclaration(ILoadContext context) Parameter argument = outputArguments[ii]; context.Out.WriteLine(","); - context.Out.Write("ref {1} {0}", argument.GetChildFieldName()[2..], + context.Out.Write("ref {1} {0}", GetMethodArgumentIdentifier(argument), argument.DataTypeNode.GetMethodArgumentTypeAsCode( argument.ValueRank, m_context.ModelDesign.TargetNamespace.Value, @@ -811,7 +815,7 @@ private TemplateString LoadTemplate_OnCallAsyncDeclaration(ILoadContext context) Parameter argument = inputArguments[ii]; context.Out.WriteLine(","); - context.Out.Write("{1} {0}", argument.GetChildFieldName()[2..], + context.Out.Write("{1} {0}", GetMethodArgumentIdentifier(argument), argument.DataTypeNode.GetMethodArgumentTypeAsCode( argument.ValueRank, m_context.ModelDesign.TargetNamespace.Value, @@ -833,7 +837,7 @@ private TemplateString LoadTemplate_ListOfOutputArgumentsFromResult(ILoadContext { return null; } - string fieldName = field.GetChildFieldName()[2..].ToUpperCamelCase(); + string fieldName = GetMethodArgumentIdentifier(field, upperCamelCase: true); switch (field.DataTypeNode.BasicDataType) { case BasicDataType.UserDefined: @@ -864,7 +868,7 @@ private TemplateString LoadTemplate_ListOfResultProperties(ILoadContext context) { return null; } - string fieldName = field.GetChildFieldName()[2..].ToUpperCamelCase(); + string fieldName = GetMethodArgumentIdentifier(field, upperCamelCase: true); context.Out.WriteLine( "public {1} {0} {{ get; set; }}", fieldName, @@ -893,13 +897,13 @@ private TemplateString LoadTemplate_OnCallImplementation(ILoadContext context) for (int ii = 0; ii < inputArguments.Length; ii++) { context.Out.WriteLine(","); - context.Out.Write(" {0}", inputArguments[ii].GetChildFieldName()[2..]); + context.Out.Write(" {0}", GetMethodArgumentIdentifier(inputArguments[ii])); } for (int ii = 0; ii < outputArguments.Length; ii++) { context.Out.WriteLine(","); - context.Out.Write(" ref {0}", outputArguments[ii].GetChildFieldName()[2..]); + context.Out.Write(" ref {0}", GetMethodArgumentIdentifier(outputArguments[ii])); } context.Out.WriteLine(");"); @@ -922,7 +926,7 @@ private TemplateString LoadTemplate_OnCallAsyncImplementation(ILoadContext conte for (int ii = 0; ii < inputArguments.Length; ii++) { context.Out.WriteLine(","); - context.Out.Write(" {0}", inputArguments[ii].GetChildFieldName()[2..]); + context.Out.Write(" {0}", GetMethodArgumentIdentifier(inputArguments[ii])); } context.Out.WriteLine(","); @@ -2073,6 +2077,9 @@ private void AddNodeStateClassMethodTypeReplacements( targetNamespace, [], applyStandardFallback: false); + method.AssignMethodArgumentCodeNames( + s_methodArgumentCodeNameScope, + declaredClassName + "Result"); // Declarations require an unqualified identifier, while fallback // tracking requires the fully-qualified name. Neither may apply // the reference-only fallback policy. @@ -2307,7 +2314,16 @@ private void AddVariableStateFactoryReplacements( return; } - if (node.DecodedValue is IList args) + Parameter[] methodArguments = GetMethodArgumentParameters(nodeToGenerate); + if (methodArguments != null) + { + context.Template.AddReplacement( + Tokens.ValueCode, + NodeStateTemplates.VariantArrayOfValue, + [methodArguments], + WriteTemplate_ArgumentCollection); + } + else if (node.DecodedValue is IList args) { context.Template.AddReplacement( Tokens.ValueCode, @@ -2342,6 +2358,28 @@ private void AddVariableStateFactoryReplacements( } } + private static Parameter[] GetMethodArgumentParameters(NodeToGenerate node) + { + if (node.Parent?.Design is not MethodDesign method) + { + return null; + } + + if (node.Design.SymbolicName == + new XmlQualifiedName("InputArguments", Namespaces.OpcUa)) + { + return MethodDesignArgumentResolver.ResolveMethodInputs(method); + } + + if (node.Design.SymbolicName == + new XmlQualifiedName("OutputArguments", Namespaces.OpcUa)) + { + return MethodDesignArgumentResolver.ResolveMethodOutputs(method); + } + + return null; + } + private void AddReferenceTypeStateFactoryReplacements( IWriteContext context, ReferenceTypeDesign node) @@ -3633,6 +3671,10 @@ private static string GetDescriptionValue(NodeDesign node) { if (node.Description != null && !node.Description.IsAutogenerated) { + // Cast to the NodeState base so the assignment always targets + // the node's Description attribute, even for models whose type + // declares a child Property named "Description" (a member that + // shadows global::Opc.Ua.NodeState.Description). return CoreUtils.Format( "nodeState.Description = {0};", node.Description.GetLocalizedTextAsCode()); @@ -3912,6 +3954,15 @@ private record class ReferenceToGenerate( XmlQualifiedName ReferenceTypeId, bool IsInverse); + private static string GetMethodArgumentIdentifier( + Parameter parameter, + bool upperCamelCase = false) + { + return parameter.GetGeneratedCodeIdentifier( + upperCamelCase, + s_methodArgumentCodeNameScope); + } + private sealed record MethodArgumentsToGenerate( string PropertyName, string BrowseName, @@ -3919,6 +3970,28 @@ private sealed record MethodArgumentsToGenerate( private const string kNamespaceTableContextVariable = "context.NamespaceUris"; + private static readonly MethodArgumentCodeNameScope s_methodArgumentCodeNameScope = new( + "_", + "await", + "ct", + "cancellationToken", + "context", + "_context", + "inputArguments", + "_inputArguments", + "method", + "_method", + "objectId", + "_objectId", + "onCall", + "onCallAsync", + "outputArguments", + "_outputArguments", + "_result", + "results", + "serviceResult", + "ServiceResult"); + private static readonly string[] s_builtInPropertyNames = [ "Description", @@ -3926,7 +3999,11 @@ private sealed record MethodArgumentsToGenerate( "Handle", "Specification", "Update", - "Delete" + "Delete", + // Method children whose generated accessor property shadows the + // identically-named global::Opc.Ua.NodeState.Validate(ISystemContext) + // instance method and therefore must be declared "public new". + "Validate" ]; private static readonly string[] s_builtInMethodNames = diff --git a/tools/Opc.Ua.SourceGeneration.Core/Generators/ObjectTypeProxyGenerator.cs b/tools/Opc.Ua.SourceGeneration.Core/Generators/ObjectTypeProxyGenerator.cs index 0ad16f6a2e..f5c64cd39f 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Generators/ObjectTypeProxyGenerator.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Generators/ObjectTypeProxyGenerator.cs @@ -526,6 +526,10 @@ private TemplateString LoadTemplate_Method(ILoadContext context) string methodName = method.SymbolicName.Name; Parameter[] inputs = MethodDesignArgumentResolver.ResolveMethodInputs(method); Parameter[] outputs = MethodDesignArgumentResolver.ResolveMethodOutputs(method); + ModelDesignExtensions.AssignMethodArgumentCodeNames( + inputs, + outputs, + s_methodArgumentCodeNameScope); string methodIdConstant = CoreUtils.Format( "global::{0}.MethodIds.{1}", @@ -565,7 +569,7 @@ private TemplateString LoadTemplate_Method(ILoadContext context) { context.Out.WriteLine( "/// Input argument {1}.", - GetParameterName(inputs[ii]), + GetMethodArgumentIdentifier(inputs[ii]).TrimStart('@'), ii); } context.Out.WriteLine( @@ -587,7 +591,7 @@ private TemplateString LoadTemplate_Method(ILoadContext context) targetNamespace, namespaces, inputs[ii].IsOptional), - GetParameterName(inputs[ii])); + GetMethodArgumentIdentifier(inputs[ii])); } context.Out.WriteLine(); context.Out.WriteLine( @@ -605,7 +609,7 @@ private TemplateString LoadTemplate_Method(ILoadContext context) { context.Out.WriteLine( " if ({0} is null) throw new global::System.ArgumentNullException(nameof({0}));", - GetParameterName(input)); + GetMethodArgumentIdentifier(input)); } } @@ -688,7 +692,7 @@ private static string GetReturnTypeAnnotation( namespaces, outputs[ii].IsOptional)) .Append(' ') - .Append(GetParameterName(outputs[ii])); + .Append(GetMethodArgumentIdentifier(outputs[ii])); } builder.Append(")>"); return builder.ToString(); @@ -773,17 +777,17 @@ private static void EmitOutputDeclaration( namespaces, parameter.IsOptional); string localName = GetLocalVariableName(parameter); - string parameterName = GetParameterName(parameter); switch (parameter.DataTypeNode.BasicDataType) { case BasicDataType.UserDefined: context.Out.WriteLine( - " if (!_outputArguments[{0}].TryGetStructure(out {1} {2}))", + " if (!_outputArguments[{0}].TryGetStructure(" + + "base.Session.MessageContext, out {1} {2}))", index, typeName, localName); - EmitConversionFailure(context, methodName, parameterName); + EmitConversionFailure(context, methodName, parameter.Name); break; case BasicDataType.BaseDataType when parameter.ValueRank == ValueRank.Scalar: // The argument is itself a Variant; assign directly. @@ -799,7 +803,7 @@ private static void EmitOutputDeclaration( index, typeName, localName); - EmitConversionFailure(context, methodName, parameterName); + EmitConversionFailure(context, methodName, parameter.Name); break; } } @@ -818,10 +822,11 @@ private static void EmitConversionFailure( " throw new global::Opc.Ua.ServiceResultException("); context.Out.WriteLine( " global::Opc.Ua.StatusCodes.BadUnexpectedError,"); - context.Out.WriteLine( - " \"Method '{0}' returned an unexpected value for output '{1}'.\");", + string message = CoreUtils.Format( + "Method '{0}' returned an unexpected value for output '{1}'.", methodName, parameterName); + context.Out.WriteLine(" {0});", message.AsStringLiteral()); context.Out.WriteLine(" }"); } @@ -831,7 +836,7 @@ private static void EmitConversionFailure( /// private static string BoxInputArgument(Parameter parameter) { - string name = GetParameterName(parameter); + string name = GetMethodArgumentIdentifier(parameter); switch (parameter.DataTypeNode.BasicDataType) { case BasicDataType.UserDefined: @@ -873,21 +878,6 @@ private static bool RequiresNullCheck(Parameter parameter) return parameter.DataTypeNode.BasicDataType == BasicDataType.UserDefined; } - /// - /// Returns a lowerCamelCase parameter name for the given UA argument. - /// Reserved C# identifiers are escaped with the standard '@' prefix. - /// - private static string GetParameterName(Parameter parameter) - { - string name = parameter.Name; - if (string.IsNullOrEmpty(name)) - { - return "value"; - } - string camel = char.ToLowerInvariant(name[0]) + name[1..]; - return s_csharpKeywords.Contains(camel) ? "@" + camel : camel; - } - /// /// Returns the local variable name used inside the method body for /// an output argument. Always prefixed to avoid colliding with @@ -895,34 +885,52 @@ private static string GetParameterName(Parameter parameter) /// private static string GetLocalVariableName(Parameter parameter) { - return "_" + GetParameterName(parameter).TrimStart('@'); + return GetOutputLocalVariableName(GetMethodArgumentIdentifier(parameter)); } - /// - /// C# 12 reserved keywords that, when reused as parameter names, - /// must be escaped with an '@' prefix. Kept narrow on purpose; - /// contextual keywords (e.g. "value", "var") are intentionally - /// omitted because they are valid identifiers. - /// - private static readonly HashSet s_csharpKeywords = - [ - "abstract", "as", "base", "bool", "break", "byte", "case", "catch", - "char", "checked", "class", "const", "continue", "decimal", "default", - "delegate", "do", "double", "else", "enum", "event", "explicit", - "extern", "false", "finally", "fixed", "float", "for", "foreach", - "goto", "if", "implicit", "in", "int", "interface", "internal", "is", - "lock", "long", "namespace", "new", "null", "object", "operator", - "out", "override", "params", "private", "protected", "public", - "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", - "stackalloc", "static", "string", "struct", "switch", "this", - "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", - "unsafe", "ushort", "using", "virtual", "void", "volatile", "while" - ]; + private static string GetOutputLocalVariableName(string identifier) + { + return "_" + identifier.TrimStart('@'); + } + + private static IEnumerable GetMethodArgumentCollisionIdentifiers( + string identifier, + bool output) + { + yield return identifier; + if (output) + { + yield return GetOutputLocalVariableName(identifier); + } + } + + private static string GetMethodArgumentIdentifier(Parameter parameter) + { + return parameter.GetGeneratedCodeIdentifier( + scope: s_methodArgumentCodeNameScope); + } private const string kStandardUaNamespaceUri = "http://opcfoundation.org/UA/"; private const string kStandardUaProxyNamespace = "Opc.Ua"; private const string kRootBaseClass = "global::Opc.Ua.ObjectTypeClient"; + private static readonly MethodArgumentCodeNameScope s_methodArgumentCodeNameScope = new( + GetMethodArgumentCollisionIdentifiers, + "_", + "await", + "ct", + "cancellationToken", + "context", + "inputArguments", + "method", + "nameof", + "objectId", + "outputArguments", + "_outputArguments", + "results", + "serviceResult", + "ServiceResult"); + private readonly IGeneratorContext m_context; private readonly Microsoft.Extensions.Logging.ILogger m_logger; private HashSet m_inheritedMethodNames; diff --git a/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignExtensions.cs b/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignExtensions.cs index 9d792114f8..cc63507a9a 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignExtensions.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignExtensions.cs @@ -32,6 +32,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Runtime.CompilerServices; using System.Xml; using Opc.Ua.SourceGeneration; using Opc.Ua.Types; @@ -59,6 +60,37 @@ internal enum NullableAnnotation Nullable } + /// + /// Identifies one generated method-argument symbol scope and the names + /// reserved by that scope's emitted scaffolding. + /// + internal sealed class MethodArgumentCodeNameScope + { + public MethodArgumentCodeNameScope(params string[] reservedNames) + : this(null, reservedNames) + { + } + + public MethodArgumentCodeNameScope( + Func> getCollisionIdentifiers, + params string[] reservedNames) + { + ReservedNames = reservedNames == null ? [] : [.. reservedNames]; + m_getCollisionIdentifiers = getCollisionIdentifiers; + } + + public IReadOnlyCollection ReservedNames { get; } + + public IEnumerable GetCollisionIdentifiers( + string identifier, + bool output) + { + return m_getCollisionIdentifiers?.Invoke(identifier, output) ?? [identifier]; + } + + private readonly Func> m_getCollisionIdentifiers; + } + /// /// Dotnet code generation support. /// @@ -507,6 +539,215 @@ public static string EnsureUniqueEnumName(this Parameter target) return target?.Name; } + /// + /// Returns the canonical C# identifier for a method argument. + /// + internal static string GetGeneratedCodeIdentifier( + this Parameter field, + bool upperCamelCase = false, + MethodArgumentCodeNameScope scope = null) + { + string name = field?.Name; + scope ??= s_defaultMethodArgumentCodeNameScope; + if (field != null && + s_generatedCodeNames.TryGetValue(field, out GeneratedCodeNameState state) && + state.Names.TryGetValue(scope, out string generatedName) && + !string.IsNullOrEmpty(generatedName)) + { + name = generatedName; + } + return name.ToCSharpIdentifier(upperCamelCase); + } + + /// + /// Assigns unique generated-code names against the requested scope while + /// preserving the authored OPC UA names. + /// + internal static void AssignMethodArgumentCodeNames( + this MethodDesign method, + MethodArgumentCodeNameScope scope = null, + params string[] additionalReservedNames) + { + AssignMethodArgumentCodeNames( + method?.InputArguments, + method?.OutputArguments, + scope, + additionalReservedNames); + } + + /// + /// Assigns unique generated-code names for an effective method signature. + /// + internal static void AssignMethodArgumentCodeNames( + Parameter[] inputArguments, + Parameter[] outputArguments, + MethodArgumentCodeNameScope scope = null, + params string[] additionalReservedNames) + { + scope ??= s_defaultMethodArgumentCodeNameScope; + ClearGeneratedCodeNames(inputArguments, scope); + ClearGeneratedCodeNames(outputArguments, scope); + + var usedNames = new HashSet(StringComparer.OrdinalIgnoreCase); + AddReservedMethodArgumentNames(usedNames, scope.ReservedNames); + AddReservedMethodArgumentNames(usedNames, additionalReservedNames); + AssignUniqueGeneratedCodeNames( + inputArguments, + usedNames, + output: false, + scope); + AssignUniqueGeneratedCodeNames( + outputArguments, + usedNames, + output: true, + scope); + } + + private static void AddReservedMethodArgumentNames( + HashSet usedNames, + IEnumerable reservedNames) + { + if (reservedNames == null) + { + return; + } + foreach (string reservedName in reservedNames) + { + if (!string.IsNullOrWhiteSpace(reservedName)) + { + usedNames.Add(GetIdentifierCollisionKey( + reservedName.ToCSharpIdentifier())); + } + } + } + + private static void AssignUniqueGeneratedCodeNames( + Parameter[] arguments, + HashSet usedNames, + bool output, + MethodArgumentCodeNameScope scope) + { + if (arguments == null) + { + return; + } + + foreach (Parameter argument in arguments) + { + if (argument == null) + { + continue; + } + + string identifier = argument.Name.ToCSharpIdentifier(); + if (TryReserveGeneratedIdentifier( + identifier, + output, + scope, + usedNames)) + { + SetGeneratedCodeName(argument, identifier, scope); + continue; + } + + string stem = identifier.TrimStart('@'); + int suffix = output ? 1 : 2; + while (true) + { + string suffixText; + if (output) + { + suffixText = suffix == 1 ? + "Out" : + "Out" + suffix.ToString(CultureInfo.InvariantCulture); + } + else + { + suffixText = suffix.ToString(CultureInfo.InvariantCulture); + } + + string candidate = (stem + suffixText).ToCSharpIdentifier(); + suffix++; + if (TryReserveGeneratedIdentifier( + candidate, + output, + scope, + usedNames)) + { + SetGeneratedCodeName(argument, candidate, scope); + break; + } + } + } + } + + private static bool TryReserveGeneratedIdentifier( + string identifier, + bool output, + MethodArgumentCodeNameScope scope, + HashSet usedNames) + { + string[] collisionKeys = + [ + .. scope.GetCollisionIdentifiers(identifier, output) + .Where(name => !string.IsNullOrWhiteSpace(name)) + .Select(GetIdentifierCollisionKey) + .Distinct(StringComparer.OrdinalIgnoreCase) + ]; + if (collisionKeys.Any(usedNames.Contains)) + { + return false; + } + foreach (string collisionKey in collisionKeys) + { + usedNames.Add(collisionKey); + } + return true; + } + + private static void ClearGeneratedCodeNames( + Parameter[] arguments, + MethodArgumentCodeNameScope scope) + { + if (arguments == null) + { + return; + } + foreach (Parameter argument in arguments) + { + if (argument != null && + s_generatedCodeNames.TryGetValue( + argument, + out GeneratedCodeNameState state)) + { + state.Names.Remove(scope); + } + } + } + + private static string GetIdentifierCollisionKey(string identifier) + { + return identifier.TrimStart('@'); + } + + private static void SetGeneratedCodeName( + Parameter argument, + string name, + MethodArgumentCodeNameScope scope) + { + s_generatedCodeNames.GetOrCreateValue(argument).Names[scope] = name; + } + + private sealed class GeneratedCodeNameState + { + public Dictionary Names { get; } = []; + } + + private static readonly MethodArgumentCodeNameScope + s_defaultMethodArgumentCodeNameScope = new(); + private static readonly ConditionalWeakTable + s_generatedCodeNames = new(); + /// /// Returns the field name of a child node. /// diff --git a/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignValidator.cs b/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignValidator.cs index 45e7363d5e..110bb0fa2e 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignValidator.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Schema/ModelDesignValidator.cs @@ -3531,6 +3531,7 @@ private void ImportInstance(InstanceDesign instance) } method.OutputArguments = parameters; + method.AssignMethodArgumentCodeNames(); } } @@ -4270,6 +4271,7 @@ private void ValidateInstance(InstanceDesign instance) ValidateParameters(method, method.InputArguments); ValidateParameters(method, method.OutputArguments); + method.AssignMethodArgumentCodeNames(); if (method.Parent != null) { diff --git a/tools/Opc.Ua.SourceGeneration.Core/Schema/NodeSetToModelDesign.cs b/tools/Opc.Ua.SourceGeneration.Core/Schema/NodeSetToModelDesign.cs index 58da96cdc4..a0dc1a9987 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Schema/NodeSetToModelDesign.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Schema/NodeSetToModelDesign.cs @@ -423,6 +423,23 @@ private XmlQualifiedName ImportSymbolicName(UANode input) return new XmlQualifiedName(input.SymbolicName, browseName.Namespace); } + // A placeholder browse name "" (no explicit SymbolicName in the + // NodeSet) follows the ModelCompiler convention of mapping to + // "Name_Placeholder" so generated identifiers match those produced + // from the equivalent ModelDesign source (e.g. a combined NodeSet + // that incorporates a model authored as ModelDesign). The raw browse + // name is used because ImportQualifiedName rewrites '<' and '>' to '_'. + string rawName = QualifiedName.Parse(input.BrowseName).Name; + if (rawName != null && + rawName.Length > 2 && + rawName[0] == '<' && + rawName[^1] == '>') + { + return new XmlQualifiedName( + ToSymbolicName(rawName[1..^1]) + "_Placeholder", + browseName.Namespace); + } + return new XmlQualifiedName(ToSymbolicName(browseName.Name), browseName.Namespace); } @@ -1195,6 +1212,8 @@ private void UpdateMethodArguments(UAMethod input, MethodDesign output) output.HasArguments = true; } } + + output.AssignMethodArgumentCodeNames(); } private void LinkChildToParent(UAInstance input) @@ -1465,7 +1484,8 @@ private XmlQualifiedName ImportAndFixSymbolicName(UANode input) if (typeDefinitionId == ObjectTypeIds.DataTypeEncodingType) { - if (input.SymbolicName.Contains("Default", StringComparison.Ordinal) && + if (!string.IsNullOrEmpty(input.SymbolicName) && + input.SymbolicName.Contains("Default", StringComparison.Ordinal) && input.SymbolicName.Contains("XML", StringComparison.OrdinalIgnoreCase) && input.SymbolicName != "DefaultXml") { @@ -1913,10 +1933,22 @@ public ModelDesign Import(string prefix, string name) NodeId childId = ImportNodeId(instance.NodeId); if (parentId.NamespaceIndex != childId.NamespaceIndex) - { instance.ParentNodeId = null; } + else if (FindTarget( + node, + ReferenceTypeIds.HasTypeDefinition, + false) == ObjectTypeIds.DataTypeEncodingType) + { + // DataTypeEncoding objects are independent address-space + // nodes even when an exporter sets ParentNodeId to the + // owning DataType. Keeping that parent absorbs the + // encoding into DataType.Children, excludes it from the + // top-level model items and prevents the NodeManager + // generator from registering the encoding node. + instance.ParentNodeId = null; + } } // handle missing ParentNodeId when an inverse reference exists. @@ -2142,6 +2174,24 @@ private void CollectMethodDefinitions( string targetNamespace, Dictionary methods) { + // Index the explicit method nodes already present in the model by + // their symbolic name. A concrete method with arguments normally + // gets a synthesized "MethodType" declaration, but a combined + // NodeSet may already ship that method-type node explicitly (e.g. + // the incorporated WoT Connectivity 1.02 CreateAssetMethodType). + // Reuse the existing declaration in that case so code generation + // does not emit two identifiers with the same name. + Dictionary existingByName = []; + foreach (NodeDesign node in m_settings.NodesById.Values) + { + if (node is MethodDesign existing && + existing.SymbolicName != null && + !existingByName.ContainsKey(existing.SymbolicName)) + { + existingByName.Add(existing.SymbolicName, existing); + } + } + foreach (NodeDesign node in m_settings.NodesById.Values) { if (node is MethodDesign method) @@ -2150,6 +2200,31 @@ private void CollectMethodDefinitions( { continue; } + + // Skip methods whose BrowseName belongs to a base namespace + // (e.g. the Core FileType Open/Close/Read/Write methods that a + // FileType instance re-declares): they are instances of a + // base-type method and must reuse that base method type rather + // than get a synthesized method type in this model. + if (method.SymbolicName != null && + method.SymbolicName.Namespace != targetNamespace) + { + continue; + } + + // Skip a standalone node that already is a method type (no owning + // parent and the conventional "MethodType" name, e.g. the + // incorporated WoT Connectivity 1.02 CreateAssetMethodType). + // Synthesizing a declaration for it would emit a spurious + // "MethodTypeMethodType" node. A parentless method that is + // merely a declaration target of another method still needs one. + if (method.Parent == null && + method.SymbolicName != null && + method.SymbolicName.Name.EndsWith("MethodType", StringComparison.Ordinal)) + { + continue; + } + if (method.HasArguments && method.MethodDeclarationNode == null) { var name = new XmlQualifiedName( @@ -2161,6 +2236,24 @@ private void CollectMethodDefinitions( continue; } + // Prefer an explicit method-type declaration already in + // the model over synthesizing a colliding duplicate. The + // concrete method carries the authoritative argument + // definitions, so copy them onto the reused declaration + // to guarantee code generation emits the correct method + // signature and result even when the incorporated + // NodeSet declares the method-type argument nodes apart + // from the concrete method. + if (existingByName.TryGetValue(name, out MethodDesign declared) && + !ReferenceEquals(declared, method)) + { + declared.InputArguments = method.InputArguments; + declared.OutputArguments = method.OutputArguments; + declared.HasArguments = method.HasArguments; + method.MethodDeclarationNode = declared; + continue; + } + var declaration = new MethodDesign { SymbolicId = name, @@ -2188,6 +2281,10 @@ private void CollectMethodDefinitions( /// private XmlDecoder CreateDecoder(System.Xml.XmlElement source, string sourceNodeSetUri = null) { + // The factory knows the standard OPC UA encodeable types. Without them, structured + // NodeSet2 values such as method Argument lists (InputArguments/OutputArguments) + // cannot be decoded and the generated typed method state would lose its arguments + // and result fields. var messageContext = new ServiceMessageContext(m_telemetry, s_valueDecodingFactory); messageContext.NamespaceUris = m_settings.NamespaceUris; messageContext.ServerUris = m_serverUris; diff --git a/tools/Opc.Ua.SourceGeneration.Core/Shared/SourceGenerationUtils.cs b/tools/Opc.Ua.SourceGeneration.Core/Shared/SourceGenerationUtils.cs index 6ee6fea215..5aab9cc119 100644 --- a/tools/Opc.Ua.SourceGeneration.Core/Shared/SourceGenerationUtils.cs +++ b/tools/Opc.Ua.SourceGeneration.Core/Shared/SourceGenerationUtils.cs @@ -28,6 +28,7 @@ * ======================================================================*/ using System; +using System.Collections.Generic; using System.Text; using System.Xml; @@ -74,6 +75,55 @@ public static string ToUpperCamelCase(this string name) return CoreUtils.Format("{0}{1}", char.ToUpperInvariant(name[0]), name[1..]); } + /// + /// Converts an authored name to a valid C# identifier. + /// + public static string ToCSharpIdentifier( + this string name, + bool upperCamelCase = false) + { + string source = name?.TrimStart('@'); + if (string.IsNullOrEmpty(source)) + { + return upperCamelCase ? "Value" : "value"; + } + + var buffer = new StringBuilder(source.Length); + bool applyCasing = true; + foreach (char character in source) + { + if (char.IsWhiteSpace(character)) + { + continue; + } + + char identifierCharacter = + char.IsLetterOrDigit(character) || character == '_' ? + character : + '_'; + if (buffer.Length == 0 && char.IsDigit(identifierCharacter)) + { + buffer.Append('_'); + } + if (applyCasing && char.IsLetter(identifierCharacter)) + { + identifierCharacter = upperCamelCase ? + char.ToUpperInvariant(identifierCharacter) : + char.ToLowerInvariant(identifierCharacter); + applyCasing = false; + } + buffer.Append(identifierCharacter); + } + + if (buffer.Length == 0) + { + return upperCamelCase ? "Value" : "value"; + } + + string identifier = buffer.ToString(); + return s_csharpKeywords.Contains(identifier) ? "@" + identifier : identifier; + } + /// /// Convert string to a safe symbol for dotnet use /// @@ -195,7 +245,10 @@ public static string AsStringLiteral(this string value) .Replace("\"", "\\\"", StringComparison.Ordinal) .Replace("\n", "\\n", StringComparison.Ordinal) .Replace("\r", "\\r", StringComparison.Ordinal) - .Replace("\t", "\\t", StringComparison.Ordinal); + .Replace("\t", "\\t", StringComparison.Ordinal) + .Replace("\u0085", "\\u0085", StringComparison.Ordinal) + .Replace("\u2028", "\\u2028", StringComparison.Ordinal) + .Replace("\u2029", "\\u2029", StringComparison.Ordinal); return $"\"{value}\""; } @@ -232,5 +285,21 @@ public static bool IsNull(this XmlQualifiedName qname) return false; } + + private static readonly HashSet s_csharpKeywords = + [ + "abstract", "as", "base", "bool", "break", "byte", "case", "catch", + "char", "checked", "class", "const", "continue", "decimal", "default", + "delegate", "do", "double", "else", "enum", "event", "explicit", + "extern", "false", "finally", "fixed", "float", "for", "foreach", + "goto", "if", "implicit", "in", "int", "interface", "internal", "is", + "lock", "long", "namespace", "new", "null", "object", "operator", + "out", "override", "params", "private", "protected", "public", + "readonly", "ref", "return", "sbyte", "sealed", "short", "sizeof", + "stackalloc", "static", "string", "struct", "switch", "this", + "throw", "true", "try", "typeof", "uint", "ulong", "unchecked", + "unsafe", "ushort", "using", "virtual", "void", "volatile", "while", + "__arglist", "__makeref", "__reftype", "__refvalue" + ]; } } diff --git a/tools/Opc.Ua.SourceGeneration/AnalyzerReleases.Unshipped.md b/tools/Opc.Ua.SourceGeneration/AnalyzerReleases.Unshipped.md index 6afcf1913a..5882032ad2 100644 --- a/tools/Opc.Ua.SourceGeneration/AnalyzerReleases.Unshipped.md +++ b/tools/Opc.Ua.SourceGeneration/AnalyzerReleases.Unshipped.md @@ -21,3 +21,8 @@ MODELGEN026 | ModelSourceGenerator | Error | NodeSet identifier file numeric ide MODELGEN027 | ModelSourceGenerator | Error | NodeSet identifier file node class does not match MODELGEN028 | ModelSourceGenerator | Error | NodeSet identifier file is assigned to multiple models MODELGEN029 | ModelSourceGenerator | Error | NodeSet identifier file contains an invalid row +MODELGEN030 | ModelSourceGenerator | Error | WoT model could not be parsed +MODELGEN031 | ModelSourceGenerator | Error | WoT model could not be converted to a NodeSet2 model +MODELGEN032 | ModelSourceGenerator | Warning | WoT model conversion produced a warning +MODELGEN033 | ModelSourceGenerator | Info | WoT model conversion note +MODELGEN034 | ModelSourceGenerator | Error | WoT model virtual NodeSet2 path collides with another input diff --git a/tools/Opc.Ua.SourceGeneration/Extensions.cs b/tools/Opc.Ua.SourceGeneration/Extensions.cs index 34b473581c..80e092df95 100644 --- a/tools/Opc.Ua.SourceGeneration/Extensions.cs +++ b/tools/Opc.Ua.SourceGeneration/Extensions.cs @@ -37,7 +37,7 @@ namespace Opc.Ua.SourceGeneration { - internal static class Extensions + internal static partial class Extensions { /// /// Get options from file options @@ -87,6 +87,57 @@ public static bool IsDesignOrNodeset2File(this AdditionalText text) return text.HasFileExtension("xml"); } + /// + /// The canonical, unconditionally recognized WoT Thing Model / Thing + /// Description file extensions. + /// + internal static readonly string[] WotFileExtensions = + [ + ".tm.json", + ".td.json", + ".tm.jsonld", + ".td.jsonld" + ]; + + /// + /// Per-file AdditionalFiles metadata name (without the + /// generator prefix) that opts a plain .jsonld file into WoT + /// model processing. Set + /// <ModelSourceGeneratorWot>true</ModelSourceGeneratorWot> + /// on the AdditionalFiles item. + /// + private const string WotOptInPropertyName = "Wot"; + + /// + /// WoT Thing Model and Thing Description files supported as model + /// inputs. The canonical .tm.json, .td.json, + /// .tm.jsonld and .td.jsonld extensions are always + /// recognized. A plain .jsonld file is treated as arbitrary + /// JSON-LD — not consumed as a model input — unless the + /// AdditionalFiles item explicitly opts in with + /// ModelSourceGeneratorWot=true metadata. + /// + public static bool IsWotFile(this AdditionalText text, AnalyzerConfigOptions options) + { + string path = text.Path; + foreach (string extension in WotFileExtensions) + { + if (path.EndsWith(extension, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + if (!path.EndsWith(".jsonld", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + // A bare .jsonld (i.e. none of the canonical suffixes above matched) + // is only a WoT input when explicitly opted in per-file: arbitrary + // JSON-LD documents must not be silently consumed as model input. + return options != null && + options.GetBool(WotOptInPropertyName, buildProperty: false); + } + /// /// Identifier files contain at least one legacy identifier CSV row. /// diff --git a/tools/Opc.Ua.SourceGeneration/ModelSourceGenerator.cs b/tools/Opc.Ua.SourceGeneration/ModelSourceGenerator.cs index fed1637afd..1add913f30 100644 --- a/tools/Opc.Ua.SourceGeneration/ModelSourceGenerator.cs +++ b/tools/Opc.Ua.SourceGeneration/ModelSourceGenerator.cs @@ -29,6 +29,7 @@ using System.Collections.Immutable; using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Diagnostics; using IIncrementalGenerator = SGF.IncrementalGenerator; using IncrementalGeneratorAttribute = SGF.IncrementalGeneratorAttribute; using IncrementalGeneratorInitializationContext = SGF.SgfInitializationContext; @@ -53,14 +54,69 @@ public override void OnInitialize(IncrementalGeneratorInitializationContext cont #if DEBUGX AttachDebugger(); #endif - IncrementalValueProvider> inputFiles = + // Pair every AdditionalFile with its own per-file analyzer config + // options once, up front, so both the design/NodeSet2 filter and + // the WoT filter (which needs the per-file + // ModelSourceGeneratorWot opt-in metadata to recognize a plain + // .jsonld input) can be evaluated without recomputing options. + IncrementalValuesProvider<(AdditionalText Text, AnalyzerConfigOptions Options)> textsWithOptions = context.AdditionalTextsProvider - .Where(f => f.IsDesignOrNodeset2File()) .Combine(context.AnalyzerConfigOptionsProvider) - .Select((pair, _) => ( - pair.Left, - pair.Right.GetOptions(pair.Left).ToNodeSetOptions())) + .Select(static (pair, _) => (pair.Left, pair.Right.GetOptions(pair.Left))); + + IncrementalValueProvider> xmlInputFiles = + textsWithOptions + .Where(static pair => pair.Text.IsDesignOrNodeset2File()) + .Select(static (pair, _) => (pair.Text, pair.Options.ToNodeSetOptions())) + .Collect(); + + // Snapshot the structural per-file options before conversion so + // downstream work remains cheaply cached per file. An ignored WoT + // input leaves the pipeline here, before its contents are read or + // it can produce diagnostics, dependencies or a virtual path claim. + IncrementalValuesProvider<(AdditionalText Text, NodesetFileOptions Options)> wotInputFiles = + textsWithOptions + .Where(static pair => pair.Text.IsWotFile(pair.Options)) + .Select(static (pair, _) => ( + pair.Text, + Options: pair.Options.ToNodeSetOptions())) + .Where(static pair => !pair.Options.Ignore); + + // Every active WoT input is converted independently: parse, bounds, + // missing preservation/native mapping, dependency/resolver and + // conversion problems are captured as diagnostics on the outcome + // rather than thrown, so one malformed input can never abort the + // whole generator run. + IncrementalValueProvider> wotOutcomes = + wotInputFiles + .Select(static (input, ct) => WotNodeSetAdditionalText.Convert( + input.Text, input.Options, ct)) .Collect(); + + // Resolve WoT outcomes against the explicit NodeSet2/ModelDesign + // inputs and each other: forwards every conversion diagnostic and + // drops (with a diagnostic) any WoT input whose synthesized + // virtual NodeSet2 path collides with another input, so a + // collision can never silently overwrite another model. + IncrementalValueProvider<( + ImmutableArray<(AdditionalText Text, NodesetFileOptions Options)> Accepted, + ImmutableArray Diagnostics)> resolvedWotInputs = + xmlInputFiles + .Combine(wotOutcomes) + .Select(static (pair, _) => pair.Left.ResolveWotInputs(pair.Right)); + + context.RegisterSourceOutput(resolvedWotInputs, static (spc, resolved) => + { + foreach (Diagnostic diagnostic in resolved.Diagnostics) + { + spc.ReportDiagnostic(diagnostic); + } + }); + + IncrementalValueProvider> inputFiles = + xmlInputFiles + .Combine(resolvedWotInputs) + .Select(static (pair, _) => pair.Left.AddRange(pair.Right.Accepted)); IncrementalValueProvider> identifierFiles = context.AdditionalTextsProvider .Where(f => f.IsIdentifierFile()) diff --git a/tools/Opc.Ua.SourceGeneration/NugetREADME.md b/tools/Opc.Ua.SourceGeneration/NugetREADME.md index c2ab0103c0..a6e2ec87df 100644 --- a/tools/Opc.Ua.SourceGeneration/NugetREADME.md +++ b/tools/Opc.Ua.SourceGeneration/NugetREADME.md @@ -28,6 +28,8 @@ Reference the generator as an **analyzer** (no runtime dependency): ``` +`AdditionalFiles` inputs may also be `NodeSet2`/`ModelDesign` XML, or a WoT Thing Model/Thing Description (`.tm.json`, `.td.json`, `.tm.jsonld`, `.td.jsonld`, or an opted-in plain `.jsonld`) which is converted to a NodeSet2 document entirely in memory before generation. See [`readme.md`](readme.md#generate-code-from-wot-thing-models--thing-descriptions) for details, per-file options and diagnostics. + ## Target frameworks `netstandard2.0` (Roslyn analyzer host TFM). diff --git a/tools/Opc.Ua.SourceGeneration/OPCFoundation.Opc.Ua.SourceGeneration.props b/tools/Opc.Ua.SourceGeneration/OPCFoundation.Opc.Ua.SourceGeneration.props index f1f62b9a68..e8414337cf 100644 --- a/tools/Opc.Ua.SourceGeneration/OPCFoundation.Opc.Ua.SourceGeneration.props +++ b/tools/Opc.Ua.SourceGeneration/OPCFoundation.Opc.Ua.SourceGeneration.props @@ -22,6 +22,7 @@ + diff --git a/tools/Opc.Ua.SourceGeneration/SourceGenerator.cs b/tools/Opc.Ua.SourceGeneration/SourceGenerator.cs index 9502f48c1c..63061740d6 100644 --- a/tools/Opc.Ua.SourceGeneration/SourceGenerator.cs +++ b/tools/Opc.Ua.SourceGeneration/SourceGenerator.cs @@ -246,6 +246,93 @@ internal static class SourceGenerator helpLinkUri: "www.opcfoundation.org", customTags: ["opcua"]); + /// + /// A WoT (.tm.json/.td.json/.tm.jsonld/.td.jsonld, + /// or opted-in .jsonld) AdditionalFile could not even be parsed as + /// JSON, could not be read, or exceeded a configured resource bound before + /// any structured conversion diagnostics were available. The input is + /// skipped; other inputs continue to be processed. + /// + public static readonly DiagnosticDescriptor WotParseError = new( + id: "MODELGEN030", + title: "WoT model could not be parsed", + messageFormat: (LocalizableString)"WoT model '{0}' could not be parsed: {1}", + category: Name, + DiagnosticSeverity.Error, + isEnabledByDefault: true, + helpLinkUri: "www.opcfoundation.org", + customTags: ["opcua"]); + + /// + /// The WoT-to-NodeSet2 converter reported an error-severity + /// WotDiagnostic (for example a resource bound, a missing + /// preservation envelope/native mapping, a dependency/resolver + /// failure, or another conversion error). The stable + /// Opc.Ua.Wot.WotDiagnosticCode is embedded in the message. + /// The affected WoT input is excluded from generation; other inputs + /// continue to be processed. + /// + public static readonly DiagnosticDescriptor WotConversionError = new( + id: "MODELGEN031", + title: "WoT model could not be converted to a NodeSet2 model", + messageFormat: (LocalizableString)"WoT model '{0}': {1}", + category: Name, + DiagnosticSeverity.Error, + isEnabledByDefault: true, + helpLinkUri: "www.opcfoundation.org", + customTags: ["opcua"]); + + /// + /// The WoT-to-NodeSet2 converter reported a warning-severity + /// WotDiagnostic (for example an unresolved dependency/resolver + /// reference or a lossy synthesis). Generation continues using the + /// best-effort result. + /// + public static readonly DiagnosticDescriptor WotConversionWarning = new( + id: "MODELGEN032", + title: "WoT model conversion produced a warning", + messageFormat: (LocalizableString)"WoT model '{0}': {1}", + category: Name, + DiagnosticSeverity.Warning, + isEnabledByDefault: true, + helpLinkUri: "www.opcfoundation.org", + customTags: ["opcua"]); + + /// + /// The WoT-to-NodeSet2 converter reported an info-severity + /// WotDiagnostic (for example a deterministically generated + /// NodeId). Provided for visibility only. + /// + public static readonly DiagnosticDescriptor WotConversionInfo = new( + id: "MODELGEN033", + title: "WoT model conversion note", + messageFormat: (LocalizableString)"WoT model '{0}': {1}", + category: Name, + DiagnosticSeverity.Info, + isEnabledByDefault: true, + helpLinkUri: "www.opcfoundation.org", + customTags: ["opcua"]); + + /// + /// The in-memory NodeSet2 virtual path synthesized for a WoT + /// AdditionalFile collides with an explicitly supplied + /// .NodeSet2.xml input or with the virtual path synthesized for + /// another WoT input (for example Foo.tm.json and + /// Foo.td.json both mapping to Foo.NodeSet2.xml). The + /// colliding WoT input is excluded from generation. + /// + public static readonly DiagnosticDescriptor WotVirtualPathCollision = new( + id: "MODELGEN034", + title: "WoT model virtual NodeSet2 path collides with another input", + messageFormat: (LocalizableString)("The in-memory NodeSet2 path '{1}' generated for " + + "WoT model '{0}' collides with input '{2}'; rename one of the inputs or set " + + "distinct ModelSourceGeneratorName/ModelSourceGeneratorPrefix metadata"), + category: Name, + DiagnosticSeverity.Error, + isEnabledByDefault: true, + helpLinkUri: "www.opcfoundation.org", + customTags: ["opcua"]); + /// /// Get diagnostic descriptor for event id /// diff --git a/tools/Opc.Ua.SourceGeneration/WotInputResolution.cs b/tools/Opc.Ua.SourceGeneration/WotInputResolution.cs new file mode 100644 index 0000000000..08edcecb3c --- /dev/null +++ b/tools/Opc.Ua.SourceGeneration/WotInputResolution.cs @@ -0,0 +1,102 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using Microsoft.CodeAnalysis; + +namespace Opc.Ua.SourceGeneration +{ + /// + /// WoT-specific input-resolution helpers. Kept in a dedicated partial so + /// the shared Extensions members (compiled into both the model and + /// the stack source generators) stay free of the + /// / converter dependency: only the model + /// generator (which globs this file) needs WoT NodeSet conversion, so the + /// stack generator does not compile it. + /// + internal static partial class Extensions + { + /// + /// Resolves the per-file WoT conversion outcomes against the explicit + /// NodeSet2/ModelDesign inputs and each other: every diagnostic + /// produced while converting a WoT input is forwarded, and any WoT + /// input whose synthesized in-memory NodeSet2 virtual path collides + /// with an explicitly supplied input or with another WoT input's + /// virtual path is dropped and reported via + /// so a + /// collision can never silently overwrite another model or crash the + /// underlying virtual file system. Resolution is a pure function of + /// its inputs and only compares paths, so it stays cheap and + /// deterministic across incremental re-runs. + /// + public static ( + ImmutableArray<(AdditionalText Text, NodesetFileOptions Options)> Accepted, + ImmutableArray Diagnostics) ResolveWotInputs( + this ImmutableArray<(AdditionalText Text, NodesetFileOptions Options)> xmlInputFiles, + ImmutableArray wotOutcomes) + { + var diagnostics = ImmutableArray.CreateBuilder(); + var accepted = ImmutableArray.CreateBuilder<(AdditionalText, NodesetFileOptions)>(); + // Explicit inputs are never displaced by a WoT-synthesized path; + // claim their own virtual path (== their real path) first. + var claimedBy = new Dictionary(StringComparer.Ordinal); + foreach ((AdditionalText text, NodesetFileOptions _) in xmlInputFiles) + { + claimedBy[text.Path] = text.Path; + } + + foreach (WotConversionOutcome outcome in wotOutcomes) + { + diagnostics.AddRange(outcome.Diagnostics); + if (outcome.NodeSetText is null) + { + // Parse/bounds/conversion failure already reported above. + continue; + } + string virtualPath = outcome.NodeSetText.Path; + if (claimedBy.TryGetValue(virtualPath, out string owner)) + { + diagnostics.Add(Diagnostic.Create( + SourceGenerator.WotVirtualPathCollision, + WotNodeSetAdditionalText.CreateFileLocation(outcome.SourcePath), + outcome.SourcePath, + virtualPath, + owner)); + continue; + } + claimedBy[virtualPath] = outcome.SourcePath; + accepted.Add((outcome.NodeSetText, outcome.Options)); + } + + return (accepted.ToImmutable(), diagnostics.ToImmutable()); + } + } +} diff --git a/tools/Opc.Ua.SourceGeneration/WotNodeSetAdditionalText.cs b/tools/Opc.Ua.SourceGeneration/WotNodeSetAdditionalText.cs new file mode 100644 index 0000000000..cecb262069 --- /dev/null +++ b/tools/Opc.Ua.SourceGeneration/WotNodeSetAdditionalText.cs @@ -0,0 +1,358 @@ +/* ======================================================================== + * Copyright (c) 2005-2026 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/ + * ======================================================================*/ + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Text; +using System.Text.Json; +using System.Threading; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.Text; +using Opc.Ua.Export; +using Opc.Ua.Wot; + +namespace Opc.Ua.SourceGeneration +{ + /// + /// The result of attempting to convert one WoT AdditionalFile input into + /// an in-memory NodeSet2 additional text. Conversion never throws: parse, + /// bounds, missing preservation/native mapping, dependency/resolver and + /// general conversion problems are all captured as s + /// instead, so a single malformed or unsupported WoT input can never fail + /// the whole generator run. + /// + internal sealed class WotConversionOutcome + { + /// + /// The path of the original WoT AdditionalFile. + /// + public string SourcePath { get; } + + /// + /// The synthesized in-memory NodeSet2 additional text, or + /// null when conversion did not produce a usable result. + /// + public AdditionalText NodeSetText { get; } + + /// + /// The AdditionalFiles options (Prefix, Name, ModelUri, Version, + /// Ignore) captured from the original WoT input, to be preserved + /// after wrapping it as a NodeSet2 file. + /// + public NodesetFileOptions Options { get; } + + /// + /// The diagnostics produced while attempting the conversion, in the + /// order they occurred. Does not include virtual-path collision + /// diagnostics, which require the full set of inputs to detect. + /// + public ImmutableArray Diagnostics { get; } + + public WotConversionOutcome( + string sourcePath, + AdditionalText nodeSetText, + NodesetFileOptions options, + ImmutableArray diagnostics) + { + SourcePath = sourcePath; + NodeSetText = nodeSetText; + Options = options; + Diagnostics = diagnostics; + } + } + + /// + /// Presents a WoT model input to the existing generator as an in-memory + /// NodeSet2 file, using the completed converter + /// entirely in memory (no file or network I/O beyond the supplied + /// content). + /// + internal sealed class WotNodeSetAdditionalText : AdditionalText + { + private WotNodeSetAdditionalText(string path, SourceText text) + { + Path = path; + m_text = text; + } + + /// + public override string Path { get; } + + /// + public override SourceText GetText(CancellationToken cancellationToken = default) + { + return m_text; + } + + /// + /// Attempts to convert a WoT AdditionalFile into an in-memory + /// NodeSet2 additional text. Never throws (other than on + /// cancellation): every failure mode is reported as a diagnostic on + /// the returned instead, so a + /// malformed or unsupported document can never crash the generator. + /// + /// The original WoT AdditionalFile. + /// The AdditionalFiles options to preserve. + /// A cancellation token. + public static WotConversionOutcome Convert( + AdditionalText source, + NodesetFileOptions options, + CancellationToken cancellationToken) + { + string sourcePath = source.Path; + ImmutableArray.Builder diagnostics = ImmutableArray.CreateBuilder(); + + SourceText sourceText; + try + { + sourceText = source.GetText(cancellationToken); + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + diagnostics.Add(CreateParseDiagnostic(sourcePath, null, ex.Message)); + return Failed(sourcePath, options, diagnostics); + } + if (sourceText is null) + { + diagnostics.Add(CreateParseDiagnostic( + sourcePath, null, "The WoT model source text could not be read.")); + return Failed(sourcePath, options, diagnostics); + } + + byte[] utf8Json; + try + { + utf8Json = Encoding.UTF8.GetBytes(sourceText.ToString()); + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + diagnostics.Add(CreateParseDiagnostic(sourcePath, sourceText, ex.Message)); + return Failed(sourcePath, options, diagnostics); + } + + WotDocument document; + try + { + document = WotDocument.Parse(utf8Json); + } + catch (JsonException ex) + { + diagnostics.Add(CreateParseDiagnostic(sourcePath, sourceText, ex)); + return Failed(sourcePath, options, diagnostics); + } + catch (FormatException ex) + { + // Thrown when the document exceeds a configured size bound. + diagnostics.Add(CreateParseDiagnostic(sourcePath, sourceText, ex.Message)); + return Failed(sourcePath, options, diagnostics); + } + + UANodeSet nodeSet; + try + { + using (document) + { + // No external resolver: source generation performs no + // file or network I/O beyond the supplied AdditionalText + // content, so referenced TD/TM documents are left + // unresolved (reported as a WotDiagnosticCode. + // UnresolvedReference warning by the converter). + WotConversionResult result = WotNodeSetConverter.ToNodeSetResult( + document, + options: null); + AppendConversionDiagnostics(diagnostics, sourcePath, result.Diagnostics); + // Exclude any result that produced an error diagnostic even + // when a (partial or inconsistent) NodeSet value was still + // produced. This decision is independent of whether the + // MODELGEN031 error diagnostic is later reported or suppressed, + // so a suppressed conversion error can never emit a model. + nodeSet = result.Success ? result.Value : null; + } + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + // Defence in depth: the converter is documented to report + // diagnostics rather than throw. Guard against any residual + // exception so a single malformed input can never take down + // the whole generator run. + diagnostics.Add(CreateConversionExceptionDiagnostic(sourcePath, ex)); + return Failed(sourcePath, options, diagnostics); + } + + if (nodeSet is null) + { + // An error diagnostic explaining why was already appended. + return Failed(sourcePath, options, diagnostics); + } + + string xml; + try + { + using var stream = new MemoryStream(); + nodeSet.Write(stream); + xml = Encoding.UTF8.GetString(stream.ToArray()); + } + catch (Exception ex) when (ex is not OperationCanceledException) + { + diagnostics.Add(CreateConversionExceptionDiagnostic(sourcePath, ex)); + return Failed(sourcePath, options, diagnostics); + } + if (xml.Length > 0 && xml[0] == '\uFEFF') + { + xml = xml[1..]; + } + + var nodeSetText = new WotNodeSetAdditionalText( + GetNodeSetPath(sourcePath), + SourceText.From(xml, Encoding.UTF8)); + return new WotConversionOutcome( + sourcePath, nodeSetText, options, diagnostics.ToImmutable()); + } + + private static WotConversionOutcome Failed( + string sourcePath, + NodesetFileOptions options, + ImmutableArray.Builder diagnostics) + { + return new WotConversionOutcome(sourcePath, null, options, diagnostics.ToImmutable()); + } + + private static void AppendConversionDiagnostics( + ImmutableArray.Builder builder, + string sourcePath, + IReadOnlyList wotDiagnostics) + { + if (wotDiagnostics.Count == 0) + { + return; + } + Location location = CreateFileLocation(sourcePath); + for (int ii = 0; ii < wotDiagnostics.Count; ii++) + { + WotDiagnostic diagnostic = wotDiagnostics[ii]; + DiagnosticDescriptor descriptor = diagnostic.Severity switch + { + WotDiagnosticSeverity.Error => SourceGenerator.WotConversionError, + WotDiagnosticSeverity.Warning => SourceGenerator.WotConversionWarning, + _ => SourceGenerator.WotConversionInfo + }; + builder.Add(Diagnostic.Create(descriptor, location, sourcePath, diagnostic.ToString())); + } + } + + private static Diagnostic CreateParseDiagnostic( + string sourcePath, SourceText sourceText, JsonException ex) + { + Location location = CreateLocation(sourcePath, sourceText, ex.LineNumber, ex.BytePositionInLine); + return Diagnostic.Create(SourceGenerator.WotParseError, location, sourcePath, ex.Message); + } + + private static Diagnostic CreateParseDiagnostic( + string sourcePath, SourceText sourceText, string message) + { + Location location = CreateLocation(sourcePath, sourceText, null, null); + return Diagnostic.Create(SourceGenerator.WotParseError, location, sourcePath, message); + } + + private static Diagnostic CreateConversionExceptionDiagnostic(string sourcePath, Exception ex) + { + Location location = CreateFileLocation(sourcePath); + return Diagnostic.Create( + SourceGenerator.WotConversionError, + location, + sourcePath, + $"{ex.GetType().Name}: {ex.Message}"); + } + + /// + /// Creates a location anchored at the start of the given file. Used + /// when no more precise position is available. + /// + internal static Location CreateFileLocation(string path) + { + return Location.Create(path, default, default); + } + + private static Location CreateLocation( + string path, + SourceText text, + long? lineNumber, + long? bytePositionInLine) + { + if (text is null || text.Lines.Count == 0) + { + return CreateFileLocation(path); + } + int line = 0; + int character = 0; + if (lineNumber >= 0 && lineNumber.Value < text.Lines.Count) + { + line = (int)lineNumber.Value; + if (bytePositionInLine >= 0) + { + character = Math.Min((int)bytePositionInLine.Value, text.Lines[line].Span.Length); + } + } + var position = new LinePosition(line, character); + int offset = text.Lines[line].Start + character; + var span = new TextSpan(offset, 0); + return Location.Create(path, span, new LinePositionSpan(position, position)); + } + + private static string GetNodeSetPath(string sourcePath) + { + string directory = System.IO.Path.GetDirectoryName(sourcePath) ?? string.Empty; + string name = System.IO.Path.GetFileName(sourcePath); + // The canonical suffixes are checked before the bare ".jsonld" + // fallback used by opted-in plain JSON-LD inputs: none of the + // canonical suffixes is itself a suffix of another, but every one + // of them ends with ".jsonld" or ".json" as plain text, so the + // untyped fallback must come last. + foreach (string suffix in Extensions.WotFileExtensions) + { + if (name.EndsWith(suffix, StringComparison.OrdinalIgnoreCase)) + { + name = name[..^suffix.Length]; + return System.IO.Path.Combine(directory, name + ".NodeSet2.xml"); + } + } + const string plainJsonLd = ".jsonld"; + if (name.EndsWith(plainJsonLd, StringComparison.OrdinalIgnoreCase)) + { + name = name[..^plainJsonLd.Length]; + } + return System.IO.Path.Combine(directory, name + ".NodeSet2.xml"); + } + + private readonly SourceText m_text; + } +} diff --git a/tools/Opc.Ua.SourceGeneration/readme.md b/tools/Opc.Ua.SourceGeneration/readme.md index b05069f545..f897665680 100644 --- a/tools/Opc.Ua.SourceGeneration/readme.md +++ b/tools/Opc.Ua.SourceGeneration/readme.md @@ -65,6 +65,41 @@ Per-file behaviour is controlled with `AdditionalFiles` metadata: See [Source-Generated NodeManagers](../../docs/SourceGeneratedNodeManagers.md#mixing-modeldesign-and-nodeset2-in-one-project) for the end-to-end pattern. +## Generate code from WoT Thing Models / Thing Descriptions + +An `AdditionalFiles` input can also be a W3C Web of Things (WoT) Thing Model or Thing Description. It is converted in memory to a NodeSet2 document (using the `Opc.Ua.Wot` converter) before the normal NodeSet2/ModelDesign pipeline above runs — the rest of the generator cannot tell the difference. No file or network I/O beyond the supplied `AdditionalFiles` content is performed, and externally referenced TD/TM documents are not resolved. + +The following extensions are always recognized as WoT model input: + +| Extension | Content | +| --------- | ------- | +| `.tm.json` | Thing Model, plain JSON | +| `.td.json` | Thing Description, plain JSON | +| `.tm.jsonld` | Thing Model, JSON-LD | +| `.td.jsonld` | Thing Description, JSON-LD | + +A plain `.jsonld` file is **not** treated as a WoT input by default — arbitrary JSON-LD is not consumed as a model. Opt a specific file in with the `ModelSourceGeneratorWot` metadata: + +```xml + + + true + + +``` + +The same per-file model metadata described above (`ModelSourceGeneratorModelUri`, `ModelSourceGeneratorName`, `ModelSourceGeneratorPrefix`, and `ModelSourceGeneratorVersion`) is preserved after a WoT document is wrapped as an in-memory NodeSet2 file. `ModelSourceGeneratorIgnore=true` is applied earlier: the WoT file is excluded before its contents are read or converted, so it emits no WoT diagnostics or sources and does not participate in dependency or synthesized-path collision resolution. + +A malformed or unsupported WoT document never crashes the generator. Instead it is reported through one of these diagnostics, and the affected input is excluded from generation while every other input continues to be processed: + +| Diagnostic | Meaning | +| ---------- | ------- | +| `MODELGEN030` | The document could not even be parsed as JSON, or exceeded a configured resource bound. | +| `MODELGEN031` | The converter reported an error (a resource bound, a missing preservation envelope/native mapping, a dependency/resolver failure, or another conversion error). The `Opc.Ua.Wot.WotDiagnosticCode` is embedded in the message. | +| `MODELGEN032` | The converter reported a warning (for example an unresolved dependency reference); generation continues with the best-effort result. | +| `MODELGEN033` | The converter reported an informational note (for example a deterministically generated NodeId). | +| `MODELGEN034` | The in-memory NodeSet2 path synthesized for a WoT input (for example `Foo.tm.json` → `Foo.NodeSet2.xml`) collides with an explicitly supplied `.NodeSet2.xml` or with another WoT input's synthesized path. Rename one of the inputs, or set distinct `ModelSourceGeneratorName`/`ModelSourceGeneratorPrefix` metadata. | + ## Using DataType Generators The OPC UA source generator includes several data type generators that can be used to create classes